编译技术课程设计报告-词法分析、语法分析、中间代码生成(编辑修改稿)内容摘要:

F→ i =i,lexval 第 11 页 ( 2) 数据结构 与 函数说明 Strn 用来存放临时变量的序号。 temp 用来存放数组的下表,在主程序中语法分析结束后,置 0. 定义函数 newtemp()用于门生一个新的临时变量的名字,具体实现时每 产生一个 T,就及时送到符号表中,也可以不进符号表,直接将单词值用整 数码表示。 定义函数 siyuan() ,输出一个四元式。 定义函数 YE() 进行 中间代码生成 ( 3) 流程图 第 12 页 五、 程序运行 结果 注:本程序对于形如 a1 的标识符无法作为整体识别 词法测试: 表达式正确: 2*3+4/( as5) **6 第 13 页 词法分析: 第 14 页 语法分析 第 15 页 四元式: 表达式错误: 2*( 32 第 16 页 六、总结 这次课程设计使我对编译原理有了进一步的了解,更加巩固了所学习的知识。 编译原理是一门比较抽象的课程,也比较难以学得透 , 有很多东西很模糊的。 编译这个概念有一定的了解。 由于课堂上,学习的东西比较浅,难免眼高手低,故而,通过实验和课程,遇到了很多课本上 面见不到的问题,完成实验后,个人在成就感的同时,也学习到了编程的具体过程中的很多知识。 程序代码: //include include iostream includestring using namespace std。 include include includesstream int i,j,k,flag,number,status。 /*status which is use to judge the string is keywords or not!*/ char ch。 char words[10] = { }。 char program[500]。 int flags[500]。 //存储输入句子 string t[500]。 //标括识符 int temp=0。 //数组下标 int is_right。 //判断输出信息 //词法分析 int Scan(char program[]) { char *keywords[5] = {while,if,else,switch,case}。 //关键字 number=0。 status=0。 j=0。 ch=program[i++]。 //遍历 if ((ch = 39。 a39。 ) amp。 amp。 (ch = 39。 z39。 )||(ch=39。 A39。 )amp。 amp。 (ch=39。 Z39。 )) //字母 { while ((ch = 39。 a39。 ) amp。 amp。 (ch = 39。 z39。 )||(ch=39。 A39。 )amp。 amp。 (ch=39。 Z39。 )) { words[j++]=ch。 ch=program[i++]。 } 第 17 页 i。 words[j++] = 39。 \039。 for (k = 0。 k 5。 k++) if (strcmp (words,keywords[k]) == 0) //判断是否为关键字 switch(k) { case 0:{ flag = 1。 status = 1。 break。 } case 1:{ flag = 2。 status = 1。 break。 } case 2:{ flag = 3。 status = 1。 break。 } case 3:{ flag = 4。 status = 1。 break。 } case 4:{ flag = 5。 status = 1。 break。 } } if (status == 0) { flag = 6。 //标识符 } } else if ((ch = 39。 039。 ) amp。 amp。 (ch = 39。 939。 )) //数字 { number = 0。 while ((ch = 39。 039。 ) amp。 amp。 (ch = 39。 939。 )) { number = number*10+(ch39。 039。 )。 ch = program[i++]。 第 18 页 } flag = 7。 i。 } else switch (ch) //运算符和标点符号 { case 39。 =39。 :{ if (ch == 39。 =39。 ) words[j++] = ch。 words[j] = 39。 \039。 ch = program[i++]。 if (ch == 39。 =39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag = 14。 } else { i。 flag = 8。 } break。 } case39。 39。 :{ if (ch == 39。 39。 ) words[j++] = ch。 words[j] = 39。 \039。 ch = program[i++]。 if (ch == 39。 =39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag =14。 } else { i。 flag = 14。 } break。 } 第 19 页 case39。 39。 :{ if (ch == 39。 39。 ) words[j++] = ch。 words[j] = 39。 \039。 ch = program[i++]。 if (ch == 39。 =39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag = 14。 } else { i。 flag = 14。 } break。 } case39。 !39。 :{ if (ch == 39。 !39。 ) words[j++] = ch。 words[j] = 39。 \039。 ch = program[i++]。 if (ch == 39。 =39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag = 14。 } else { i。 flag = 18。 } break。 } case39。 +39。 :{ if (ch == 39。 +39。 ) words[j++] = ch。 words[j] = 39。 \039。 ch = program[i++]。 if (ch == 39。 =39。 ) 第 20 页 { words[j++] = ch。 words[j] = 39。 \039。 flag = 9。 } else if (ch == 39。 +39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag = 9。 } else { i。 flag = 9。 } break。 } case39。 39。 :{ if (ch == 39。 39。 ) words[j++] = ch。 words[j] = 39。 \039。 ch = program[i++]。 if (ch == 39。 =39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag = 12。 } else if( ch == 39。 39。 ) { words[j++] = ch。 words[j] = 39。 \039。 flag = 12。 } else { i。 flag = 12。 } break。 } 第 21 页 case39。 *39。 :{ if (ch == 39。 *39。 ) words[j++] = ch。 words[j] = 39。 \039。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。