if(c==TNT[i])return i; cout<<\ exit(0); } struct code_val scanner(char *buf) { static int i=0; struct code_val t={'\\0',\char token[20]=\ while(buf[i]==' ')i++; if(buf[i]>='a' && buf[i]<='z'){ while(buf[i]>='a' && buf[i]<='z'||buf[i]>='0' && buf[i]<='9') concat(token,buf[i++]); t.code=reserve(token); if(t.code=='i')strcpy(t.val,token); return t; } if(buf[i]>='0' && buf[i]<='9'){ while(buf[i]>='0' && buf[i]<='9') concat(token,buf[i++]); if(buf[i]=='.'){ concat(token,buf[i++]); while(buf[i]>='0' && buf[i]<='9') concat(token,buf[i]); t.code='y'; } else//?????? t.code='x'; strcpy(t.val,token); return t; } if(buf[i]=='.'){ concat(token,buf[i++]); if(buf[i]>='0' && buf[i]<='9'){ while(buf[i]>='0' && buf[i]<='9') concat(token,buf[i++]); t.code='y'; strcpy(t.val,token);
6 / 11
return t; } else{ cout<<\ exit(0); } }
switch(buf[i]){ case ',': t.code=','; break; case ';': t.code=';'; break; case '(': t.code='('; break; case ')': t.code=')'; break; case '=': t.code='='; break; case '+': if(buf[++i]=='+') t.code='$'; else{ t.code='+'; i--; } break; case '*': t.code='*'; break; case '#': t.code='#'; break; default:
7 / 11
cout<<\ exit(0); } i++; return t; }
void concat(char token[],char c) { for(int i=0;token[i];i++); token[i]=c; token[++i]='\\0'; }
char reserve(char token[]) { const char *table[]={\ const char code[]={\ for(int i=0;i<(int)strlen(code);i++) if(strcmp(token,table[i])==0) return code[i]; return 'i'; }
void pro_process(char *buf) { ifstream cinf(\ int i=0;char old_c='\\0',cur_c; bool
in_comment=false; while(cinf.read(&cur_c,sizeof(char))){ switch(in_comment){ case false: if(old_c=='/' && cur_c=='*'){ i--; in_comment=true; } else { if(old_c=='\\\\' && cur_c=='\\n') i--; else { if(cur_c>='A' && cur_c<='Z') cur_c+=32; if(cur_c=='\\t' || cur_c=='\\n') cur_c=' ';
8 / 11
buf[i++]=cur_c ; } } break; case true: if(old_c=='*' && cur_c=='/') in_comment=false; } old_c= cur_c; } buf[i]='#'; }
struct code_val CiFa() { char buf[4048]={'\\0'}; pro_process(buf); code_val t; t=scanner(buf); return t; }
四.运行结果
程序源文件
9 / 11
结果输出文件
五.设计总结:
刚开始做这个实验心里很没有底,不知道是让干什么的,最后经过仔细的考虑,终于明白了,先词法再语法,最后我们选择了选用LR(0)分析法,建表,最后词法作为语法的子程序,一步步调用,在做的工程中,特别是在调试时遇到很多的错误,最后明白了错误的原因,最后程序运行成功时发现一个很意外的情况,才发现是格式错了,哈哈折磨很久的错误,原来是格式错了,但总体上设计遇到的困难不太多,首先感谢老师的知道和队友的合作,这次课程设计让我学到很多东西,让我对雨打分析和词法分析有了更深的了解,也锻炼了自己的动手实践能力和合作能力,和战胜困难的决心,这次课程设计是我感到自己还有很多东西要学习,继续努力!
通过这几天的课程设计,使我意识到了团队合作的重要性。我们一起为着同一个目标而努力,遇到问题大家一起解决,有不明白的地方大家一起研究。在设计的过程中,我有很多不明白的地方,因此我意识到我还有很多不足的地方需要在今后的学习中更加努力。
10 / 11
这次课程设计在预处理、词法、语法各个阶段程序设计的基础上,将词法和语法两个程序组合成一遍扫描,完成词法、语法两个阶段的分析,即将词法作为语法分析的子程序,每调用一次得到一个单词的类码,扫描结束分析结束。通过这几天的设计,使我对这几个方面的知识又有了更进一步的认识,以前不太明白的地方现在也略懂一二。虽然在设计的过程当中遇到了一些问题,最后在大家的努力和老师的帮助下顺利的解决了。
在本次课程设计中我们遇到了很多的困难,构造了很多遍的LR(0)分析表才正确,在程序的调试中也遇到了诸多的问题,但我们经过一部分一部分的检验,例如在全部程序运行无错时,但读出的结果却不正确,看那一部分出了错就找哪一部分,并且不断的调试,在找不到哪里出错时寻求了老师的帮助,最后在不断的调试后发现了问题的所在,并且调试成功。通过本次的课程设计,我更加的掌握和了解了预处理以及词法分析和语法分析的作用,对于课本上的知识有了实践意义的了解,而且在将这些知识进行连贯并运用的过程中我对词法分析语法分析加深了了解。
本次设计——模型语言的语法分析器设计,把三个部分的知识结合在一起,预处理、词法分析和语法分析。
预处理就是把注释、续行符去掉,保留空格,转换大小写,最后给出语句结束符#。 我们设计用的是LR(0),在设计过程中,我们更深刻的理解了LR(0)这一知识点。对于移进、归约又更近一步的认识。
在设计过程中,我们做了很多提前工作,项目集规范族的构造,LR(0)分析表的构造,我们都细心的做了几次,最后做程序。程序的结合很有难度,在大家的努力下也迎刃而解。
不过设计中出现了个小笑话,我们以为程序出错,改了好半天也没有改出来,只能向老师寻求帮助,最后发现并不是程序出错,只是空格大小不够,往后串了一排。 本次设计我们不仅学到了知识,还学会了合作。
11 / 11
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库编译原理课程设计(2)在线全文阅读。
相关推荐: