1、编译技术课程设计编译技术课程设计 一、一、目的目的 0 i= 1; 而绝对不要写成 IFi0 i=1; 因为对于后者,我们的分析器将无条件地将 IFI 看成一个标识符。 这个小语言的单词符号的状态转换图,如下图: 2语法分析器 能识别由加+ 减- 乘* 除/ 乘方 括号()操作数所组成的 算术表达式,其文法如下: EE+T|E-T|T TT*F|T/F|F FPF|P p(E)|i 使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法; LR 分析法等。 2 3中间代码生成器 产生上述算术表达式的中间代码(四元式序列) 三、实现过程说明三、实现过程说明 1、词法分析器的流程图 开始 输
2、入源文 件路径 路径是否有 效 是 初始化文件指针 否 将字符加入字符数 组Word 是空格,空白或换 行吗 是字母吗是数字吗否否是界符吗否 打开源文件 跳过该字符 是 是 文件结束? 否 将字符加入字符数 组Word 否 将字符 加入字 符数组 Word 是 指向下一字符 识别指针内容 指向下一字符 是字母惑数字 吗 是 将word与关键 字表key进行匹 配 否 匹配? 是 输出word 为关键字 输出word为 普通标示符 否 将字符加 入字符数 组Word 指向下一字符 输出word 为常数 识别指针内容 回退 是数字吗 是 否 输出word 为界符 指向下一字符 结束是 输出Word
3、 内容为不 可识别 将字符 加入字 符数组 Word 3 2、语法分析器流程图 4 3、中间代码生成器流程图 四、四、源程序清单源程序清单 词法分析器: #include “stdafx.h“ #include “iostream“ #include “string“ using namespace std; /reserve保留字 string reserve5 = “DIM“,“IF“,“DO“,“STOP“,“END“; /结构体数组,保存已识别的单词 struct table 5 string str; string name; table400; int count = 0; /判断
4、是否为保留字 bool Reserve(string str) bool flag = false; for(int i=0; ifilename; if(fp = fopen(filename,“r“) = NULL) couts; s.resize(s.size()+1); ss.size()-1=#; E(); if(si=#) coutSwitchNum); 10 return 0; void E() if(ERR=0) T(); E1(); void E1() if(ERR=0) if(si=+) +i; T(); E1(); else if(si!=# ERR=1; void T() if(ERR=0) F(); T1(); void T1() if(ERR=0) if(si=*) 11 +i; F(); T1(); else if(si!=# ER