Stanford编译的原理是什么?

描述

第一个作业是根据这门课定义的cool语言,写一个词法分析的rule,词法分析对我帮助不大,主要是理解使用就可以,就大部分参照github上的实现了。

Workflow

1)cool/include/PA2/cool-parse.h 里面定义了需要处理的关键字

 

/* Tokens.  */
#define CLASS 258
#define ELSE 259
#define FI 260
#define IF 261
#define IN 262
#define INHERITS 263
....

 

2) 实验的主要内容是在cool.flex中增加对关键字,注释,嵌入注释,字符串的处理。在cool.flex内部定义好规则时候,make flexer 时,会调用flex. flex 输入cool.flex, 输出cool-lex.cc,这个就是flex自动产生的处理词法的代码。

3)产生flex后,可以调用perl pa1-grading.pl,打分会报告哪些没有处理好

4)没有处理好的

字符串

对于这种,可以直接grep “line number test 2”,查看时那个文件没有处理好。./grading 目录下有一堆输入文件

字符串

可以直接调用 ./lexer ./gool.cool 或者出错的文件 ./lexer ./lineno2.cool

它会根据我们输入的规则,print信息。

字符串

我的问题是注释里面遇到换行,没有增加linenumber,在comment里面加上遇到换行符时,递增linenumber就对了。

上面是环境的问题,下面是除了课程的资料以外需要了解的内容。

背景知识

遇到的问题我就直接问chatgpt了。

1)Flex支持的函数:

yymore(): As mentioned earlier, this function is used to accumulate text from multiple rule matches before taking action. It’s particularly useful when you want to combine consecutive matches into a single token.

yytext: As discussed before, this global variable holds the current matched text or lexeme. It’s automatically populated by Flex based on the pattern that matches.

yylineno: This global variable keeps track of the current line number being processed by the lexer. You can use it to maintain accurate line number information for error reporting or other purposes.

我列出了主要用的,主要用的还是yymore(),用来继续处理token的内容;另一个就是yytext 则是表示当前匹配的内容。这里主要是讲数字,字符串以及自定义的object与符号表中的内容连接起来。


字符串

2) 如何编写cool.flex

对于关键字的支持比较简单,主要还是支持字符串和注释,以及嵌套注释。

这里就是状态机,初始时和正常状态下都处于INITIAL状态,cool语言时的注释以(* 开头,考虑到会存在嵌套注释,因此在INITIAL,COMMENTS,INLINE_COMMENTS三种状态下,都可能会遇到(* 此时我们进入COMMENTS状态,因此BEGIN COMMENTS。

 

"(*" {
    comment_layer++;
    BEGIN COMMENTS;
}

 

在注释中,遇到非特殊字符,不需要特殊处理,可以直接忽视,因此{}内部都为空。

 

[^n(*]* { }

[()*] { }

 

在遇到换行符时,增加行数计数。

 


 {
    curr_lineno++;
}

 

这里的comment_layer–与上面的comment_layer++对应,进入comment时递增,出comment递减,主要是为了应对嵌套注释。在走到最外层时,回到INITIAL状态。

 

"*)" {
    comment_layer--;
    if (comment_layer == 0) {
        BEGIN INITIAL;
    }
}

 

总结来说, 就是下面的这个规则

 

 DEFINED STATE {
  Action
}

 





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分