四川大学计算机学院C语言编译器编译原理课程设计报告内附源码递归下降cminus 联系客服

发布时间 : 星期日 文章四川大学计算机学院C语言编译器编译原理课程设计报告内附源码递归下降cminus更新完毕开始阅读9799d05c760bf78a6529647d27284b73f3423635

编译原理课程设计报告

课题名称: C-词法扫描器及语法分析器实现

提交文档学生姓名: XXX 提交文档学生学号: 0943041XXX 同组 成 员 名 单: 无 指导 教 师 姓 名: 张 兵

指导教师评阅成绩: 指导教师评阅意见: . .

提交报告时间:2012年 6月 2日

目录

1 课程设计目标 ............................................................................ 3 2 分析与设计 .............................................................................. 4

2.1 程序结构 .......................................................................... 4 2.2 程序流程 .......................................................................... 5 3 词法分析 ................................................................................ 6

3.1 代码结构分析 ...................................................................... 6 3.2 Token定义 ........................................................................ 7

3.2.1 Token的定义和类型 .......................................................... 7 3.2.2 Token的种别码 .............................................................. 7 3.3 DAF分析 ........................................................................... 8

3.3.1 删除注释DFA ................................................................ 8 3.3.2 词法分析DFA ............................................................... 10

4 语法分析 ............................................................................... 14

4.1 代码结构分析 ..................................................................... 14 4.2 节点定义 ......................................................................... 15

4.2.1 节点定义和类型 .............................................................. 15 4.2.2 各类型节点的描述 ............................................................ 16 4.3 递归向下语法分析 ................................................................. 16

4.3.1 C-文法 ..................................................................... 16 4.3.2 递归向下分析过程 ............................................................ 17

5 测试结果 ............................................................................... 34

5.1 流程 ............................................................................. 34 5.2 词法分析结果 ..................................................................... 34 5.3 词法分析出错 ..................................................................... 38 5.4 语法分析结果 ..................................................................... 39 5.5 语法分析出错 ..................................................................... 41 6 总结 ................................................................................... 42

6.1 词法分析编写过程 ................................................................. 42 6.2 语法分析编写过程 ................................................................. 43 6.3 成果和收获 ....................................................................... 43 7 附录 ................................................................................... 44

7.1 scanner.h源文件 ................................................................ 44 7.2 scanner.cpp源文件 .............................................................. 45 7.3 parser.h源文件 ................................................................. 54 7.4 parser.cpp源文件 ............................................................... 56

1 课程设计目标

学生在学习《编译原理》课程过程中,结合各章节的构造编译程序的基本理论,要求用C或C++语言描述及上机调试,实现一个 C-Minus 小编译程序(包括词法分析,语法分析等重要子程序),使学生将理论与实际应用结合起来,受到软件设计等开发过程的全面训练,从而提高学生软件开发的能力。

要求:

(1)设计词法分析器

设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成供语法分析器调用的子程序。功能包括:

a. 具备预处理功能。将不翻译的注释等符号先滤掉,只保留要翻译的符号串,即要求设计

一个供词法分析调用的预处理子程序; b. 能够拼出语言中的各个单词; c. 返回(种别码, 属性值)。 (2)语法分析

要求用学习过的自底向上或自顶向下的分析方法等,实现对表达式、各种说明语句、控制语句进行语法分析。若语法正确,则用语法制导翻译法进行语义翻译;生成并打印出语法树;若语法错误,要求指出出错性质和出错位置(行号)。

2 分析与设计

2.1 程序结构

本节主要分析程序的代码结构和代码工程文件的划分。(程序由两个类组成: Scanner类和Parser类,分别为词法分析和语法分析类。工程分为四个文件:scanner.h、scanner.cpp、parser.h、parser.cpp,分别对应Scanner类和Parser类的声明和实现文件)。

本程序采用C++语言以面向对象的思想编写,程序分为两部分:词法分析(Scanner)和语法分析(Parser),分别将两个处理阶段封装成Scanner类和Parser类,两个类各司其职,分别完成词法分析和语法分析的任务。Scanner类主要的工作是过滤注释、词法分析获取Token。Parser类的主要工作是根据Scanner类词法分析之后的Token进行语法分析,生成语法树,最后并输出语法树。在处理过程中,Scanner类的对象作为Parser类的一个成员变量,配合Parser类进行语法分析。

工程文件总体上是按照两个类的格局分为四个文件,分别是两个类的声明文件和实现文件。四个文件分别为scanner.h和scanner.cpp以及parser.h和parser.cpp,他们分别是Scanner类声明文件、Scanner类实现文件、Parser类声明文件、Parser类实现文件。

词法分析 scanner.h:与词法分析相关的类(Scanner类)的声明 scanner.cpp:词法分析阶段类(Scanner类)的实现 语法分析 parser.h:与语法分析相关的类(Parser类)的声明 parser.cpp:语法分析阶段类(Parser类)的实现