北京工业大学 编译原理 实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机学院
实验报告
课程名称: 编译原理 实验人学号: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
E, WORD_WHILE); if (strcmp(value, WORD_DO) == 0) return new Token(DO, NONE_OF_VALUE, WO
RD_DO); return new Token(IDN, value, value);
} //////////////////////////////////// 以 下 为 数 字 的 检 测
//////////////////////////////////////////////////////////////////////////// if (strcmp(value, WORD_IF) == 0) return new Token(IF, NONE_OF_VALUE, WO
RD_IF); if (strcmp(value, WORD_THEN) == 0) return new Token(THEN, NONE_OF_VALUE,
实验一 词法分析程序的设计与实现
词法的正规式描述:
标识符 <字母>(<字母>|<数字字符>)* 十进制整数 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 .
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_VALU
~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:这里加上保留字检测部分 //进行字符串的对比,即可比较出保留字,通过压栈的形式来获得完整的属性值 //////////////////////////////////// 以 下 为 保 留 字 的 检 测
实验二 自顶向下的语法分析—递归子程序法............................................................................ 9 改写后的产生式集合:.............................................................................................................9 化简后的语法图:.....................................................................................................................9 递Hale Waihona Puke Baidu子程序算法.......................................................................................................................10 实验结果:...............................................................................................................................13 实验中遇到的问题及其解决:.............................................................................................. 14 1、消除左递归,提取左因子之后的 E、 T 对应的子程序的编写问题:................14 2、缩进的控制:............................................................................................................ 14
//////////////////////////////////////////////////////////////////////////// if (isdigit(ch)) { value[i++] = ch; //如果第一个数字是 0,则有可能是 INT10 的 0、INT8 或 INT16 if (ch == '0') { ch = from_file.get(); if ((ch >= '0' && ch < '8') || ch == 'x' || ch == 'X') { //如果 0 后面紧跟着数字 0-8,则为 INT8 if (isdigit(ch)) { while (ch >= '0' && ch < '8') { value[i++] = ch; ch = from_file.get(); } from_file.unget(); return new Token(INT8, value, value); } value[i++] = ch; //到这一步的都是 INT16 ch = from_file.get(); while (isdigit(ch) || (ch >= 'a' && ch <= 'f')) { value[i++] = ch; //TODO:这里没有解决 0xrtr 的问题 ch = from_file.get(); } from_file.unget(); return new Token(INT16, value, value); } else {//0 后面的不为 0-7 的 digit 或 x 或 X 等 8 或 16 进制特征字符,则为 10 进制的
实验三 语法制导的三地址代码生成程序.................................................................................... 15 语法制导定义:.......................................................................................................................15 三地址代码生成器的数据结构.............................................................................................. 16 三地址生成器算法:...............................................................................................................17 实验结果:...............................................................................................................................21 实验中遇到的问题及其解决:.............................................................................................. 22 1、根据化简后的产生式修改语法制导定义:............................................................ 22 2、使用真假出口法和继承属性来确定 goto 的标号:.............................................. 22
状态图:
词法分析程序数据结构与算法:
//单词类 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){}
实验报告
课程名称: 编译原理 实验人学号: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
E, WORD_WHILE); if (strcmp(value, WORD_DO) == 0) return new Token(DO, NONE_OF_VALUE, WO
RD_DO); return new Token(IDN, value, value);
} //////////////////////////////////// 以 下 为 数 字 的 检 测
//////////////////////////////////////////////////////////////////////////// if (strcmp(value, WORD_IF) == 0) return new Token(IF, NONE_OF_VALUE, WO
RD_IF); if (strcmp(value, WORD_THEN) == 0) return new Token(THEN, NONE_OF_VALUE,
实验一 词法分析程序的设计与实现
词法的正规式描述:
标识符 <字母>(<字母>|<数字字符>)* 十进制整数 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 .
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_VALU
~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:这里加上保留字检测部分 //进行字符串的对比,即可比较出保留字,通过压栈的形式来获得完整的属性值 //////////////////////////////////// 以 下 为 保 留 字 的 检 测
实验二 自顶向下的语法分析—递归子程序法............................................................................ 9 改写后的产生式集合:.............................................................................................................9 化简后的语法图:.....................................................................................................................9 递Hale Waihona Puke Baidu子程序算法.......................................................................................................................10 实验结果:...............................................................................................................................13 实验中遇到的问题及其解决:.............................................................................................. 14 1、消除左递归,提取左因子之后的 E、 T 对应的子程序的编写问题:................14 2、缩进的控制:............................................................................................................ 14
//////////////////////////////////////////////////////////////////////////// if (isdigit(ch)) { value[i++] = ch; //如果第一个数字是 0,则有可能是 INT10 的 0、INT8 或 INT16 if (ch == '0') { ch = from_file.get(); if ((ch >= '0' && ch < '8') || ch == 'x' || ch == 'X') { //如果 0 后面紧跟着数字 0-8,则为 INT8 if (isdigit(ch)) { while (ch >= '0' && ch < '8') { value[i++] = ch; ch = from_file.get(); } from_file.unget(); return new Token(INT8, value, value); } value[i++] = ch; //到这一步的都是 INT16 ch = from_file.get(); while (isdigit(ch) || (ch >= 'a' && ch <= 'f')) { value[i++] = ch; //TODO:这里没有解决 0xrtr 的问题 ch = from_file.get(); } from_file.unget(); return new Token(INT16, value, value); } else {//0 后面的不为 0-7 的 digit 或 x 或 X 等 8 或 16 进制特征字符,则为 10 进制的
实验三 语法制导的三地址代码生成程序.................................................................................... 15 语法制导定义:.......................................................................................................................15 三地址代码生成器的数据结构.............................................................................................. 16 三地址生成器算法:...............................................................................................................17 实验结果:...............................................................................................................................21 实验中遇到的问题及其解决:.............................................................................................. 22 1、根据化简后的产生式修改语法制导定义:............................................................ 22 2、使用真假出口法和继承属性来确定 goto 的标号:.............................................. 22
状态图:
词法分析程序数据结构与算法:
//单词类 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){}