北京工业大学 编译原理 实验报告

2019-03-27 20:43

实 验 报 告

计 算 机 学 院

课程名称: 编译原理 实验人学号: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); }

////////////////////////////////////

////////////////////////////////////////////////////////////////////////////


北京工业大学 编译原理 实验报告.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:大学计算机基础填空题

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: