diff --git a/Reports/lab2/report.md b/Reports/lab2/report.md index 8db63545fa1fe17589eed67eb79e4590d6b056e4..889dcd2d1db06ab25b92bbb8edf4f2c2e00ddcf0 100755 --- a/Reports/lab2/report.md +++ b/Reports/lab2/report.md @@ -1,8 +1,45 @@ -# lab2 实验报告 -学号 姓名 -## 实验要求 -## 实验难点 -## 实验设计 -## 实验结果验证 -请提供部分自己的测试样例 -## 实验反馈 +Lab2实验报告 +201808010510马宽林 +实验要求 +本次实验需要各位同学首先将自己的 lab1 的词法部分复制到/src/parser 目录的 lexical_analyzer.l 并合理修改相应部分,然后根据 cminus-f 的语法补全 syntax_analyer.y 文件,完成语法分析器,要求最终能够输出解析树。 +实验难点 +将文法产生式转换为 bison 语句(语法制导翻译)翻译文法产生式时,token 和 symbol 如何放置 +采用 symbol : token {action} + | symbol symbol’ {action}的格式进行翻译怎么归类 +Union 中只定义 +,将所有 symbol 和 token 都传给 node 节点构造进语法树中。 +怎么处理 empty、aligned + Empty 为空白,不作为 symbol 和 token 出现,在产生时构造空节点来加入语法树。 + +改写 Lab1 代码根据识别的 token 构造结点 + +对空白和换行的处理 + + 只识别行号,起始终止位置,不必返回 token +对注释部分的处理 + 同样之识别行号,起始终止位置,做好定位,不必返回 token 解析器状态、YYSTYPE 和头文件的生成的知识 +整个工作流程中,bison 是占据主导地位的,而 flex 仅仅是一个辅助工具,仅用来生成 yylex 函数; +YYSTYPE 。 YYSTYPE +YYSTYPE: 在 bison 解析过程中,每个 symbol 最终都对应到一个语义值上。或者说,在 parse tree 上,每个节点都对应一个语义值,这个值的类型是 的具体内容是由 %union 构造指出的。 +%type <> 和 %token <> :没有写 $1.num 或者 $2.op 哦!那么 bison 是怎么知道应该 +用 union 的哪部分值的呢?其秘诀就在文件一开始的 %type 和 %token 上。 +%token:当我们用 %token 声明一个 token 时,这个 token 就会导出到 .h 中,可 +以在 C 代码中直接使用(注意 token 名千万不要和别的东西冲突!),供 flex 使用。%token + ADDOP 与之类似,但顺便也将 ADDOP 传递给 %type。 +yylval:.h 文件里面除了 token 定义,最末尾还有一个 extern YYSTYPE yylval;。通过这个变量,我们就可以在 lexer 里面设置某个 token 的值。 +为什么 flex 生成的分析器入口是 yylex,因为这个函数就是 bison 专门让程序员自己 +填的,作为一种扩展机制。另外,bison(或者说 yacc)生成的变量和函数名通常都带有 yy 前缀。 +实验设计 + + + +实验结果验证 + + +My_testcase + 经验证无误 +实验反馈 +➢ Bison 是一款解析器生成器(parser generator),它可以将 LALR 文法转换成可编译的 C 代码,从而大大减轻程序员手动设计解析器的负担。对接上了语法分析课程中LR(1)分析工具的部分。 +➢ 了解 bison 与 flex 之间是如何协同工作。整个工作流程中,bison 是占据主导地位的,而 flex 仅仅是一个辅助工具,仅用来生成 yylex 函数。flex 生成的分析器入口是 yylex,这个函数就是 bison 专门让程序员自己填的,作为一种扩展机制。 +➢ bison 还有一些高级功能,比如自动处理运算符的优先级和结合性(于是我们就不需要手动把 expr 拆成 factor, term 了)。 +