实 验 报 告
计 算 机 学 院
课程名称: 编译原理 实验人学号:110703xx 姓名:xxx 实验完成日期:2014年5月20日 报告完成日期:2014年5月20日
目录
实验一 词法分析程序的设计与实现 ................................................................................... 3
词法的正规式描述: ............................................................................................................... 3 状态图: ................................................................................................................................... 4 词法分析程序数据结构与算法: ........................................................................................... 4 词法分析算法: ....................................................................................................................... 5 实验结果: ............................................................................................................................... 7 实验中遇到的问题及其解决: ............................................................................................... 8
1、保留字的检测问题: ................................................................................................. 8
2、关于0为首位的数字是int8、int10和int16的判断问题: .................................. 8 3、关于回退的问题: ..................................................................................................... 8
实验二 自顶向下的语法分析—递归子程序法 .................................................................... 9
改写后的产生式集合: ........................................................................................................... 9 化简后的语法图: ................................................................................................................... 9 递归子程序算法 ..................................................................................................................... 10 实验结果: ............................................................................................................................. 13 实验中遇到的问题及其解决: ............................................................................................. 14
1、消除左递归,提取左因子之后的E、 T对应的子程序的编写问题: ............... 14
2、缩进的控制: ........................................................................................................... 14
实验三 语法制导的三地址代码生成程序 ........................................................................... 15
语法制导定义: ..................................................................................................................... 15 三地址代码生成器的数据结构 ............................................................................................. 16 三地址生成器算法: ............................................................................................................. 17 实验结果: ............................................................................................................................. 21 实验中遇到的问题及其解决: ............................................................................................. 22
1、根据化简后的产生式修改语法制导定义: ........................................................... 22
2、使用真假出口法和继承属性来确定goto的标号: .............................................. 22
实验一 词法分析程序的设计与实现
词法的正规式描述:
标识符 <字母>(<字母>|<数字字符>)*
十进制整数 0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)* 八进制整数 0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* 十六进制整数
0(x|X)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)*
运算符和分隔符 + - * / > < = ( ) ; 关键字 if then else while do .
状态图:
If/then/while/do/else保留字a-z/A-Z标识符或保留字其他标识符开始0Int8或int10或int16X/x1-7Int161-9十进制数+ - * / > < = ( ) ; 其他int8运算符和分隔符int10
词法分析程序数据结构与算法:
//单词类 class Token { public:
int type;//种别 string value;//属性值 string name;//单词具体内容 Token() {
type = DEFAULT;
value = NONE_OF_VALUE; }
Token(int type, string value, string name): type(type), value(value), name(name){}
~Token() {} };
词法分析算法:
Token* TokenScan(ifstream &from_file) { char ch;//用于保存从文件中读取的字符 //读第一个字符 int i = 0;
char value[30] = \;//用来存放token的属性值 ch = from_file.get();
while (ch == BLANK || ch == TAB || ch == NEWLINE) { ch = from_file.get(); }
//////////////////////////////////// if (isalpha(ch)) { value[i++] = ch; ch = from_file.get();
////判断后续的是否为IDN的成分(数字或字母) while (isalnum(ch)) { value[i++] = ch; ch = from_file.get(); }
//直到不是IDN成分,回退一字符 from_file.unget();
//TODO:这里加上保留字检测部分
//进行字符串的对比,即可比较出保留字,通过压栈的形式来获得完整的属性值 ////////////////////////////////////
以
下
为
保
留
字
的
检
测
//////////////////////////////////////////////////////////////////////////// if (strcmp(value, WORD_IF) == 0) return new Token(IF, NONE_OF_VALUE, WORD_IF);
if (strcmp(value, WORD_THEN) == 0) return new Token(THEN, NONE_OF_VALUE, WORD_THEN);
if (strcmp(value, WORD_ELSE) == 0) return new Token(ELSE, NONE_OF_VALUE, WORD_ELSE);
if (strcmp(value, WORD_WHILE) == 0) return new Token(WHILE, NONE_OF_VALUE, WORD_WHILE);
if (strcmp(value, WORD_DO) == 0) return new Token(DO, NONE_OF_VALUE, WORD_DO);
return new Token(IDN, value, value); }
////////////////////////////////////
以
下
为
数
字
的
检
测
以
下
为
标
识
符
的
检
测
////////////////////////////////////////////////////////////////////////////
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库北京工业大学 编译原理 实验报告在线全文阅读。
相关推荐: