编译原理语法分析.docx
《编译原理语法分析.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析.docx(26页珍藏版)》请在三一文库上搜索。
1、上机练习二:语法分析一、根据上机练习一给出的PL/0语言扩充的巴克斯范式语法描述,利用递归下降的语法分析方法,编写PL/0语言的语法分析程序。要求:1. 对给出的PL/0语言进行分析,证明其可以进行自上而下的语法分析;2. 对block、proc、statement、condition、expression、term、factor进行分析,画出语法分析图,在此基础上描述这些子程序的设计思想;3. 具有一定的语法错误处理能力;二、源代码#include#include#include #include#includeusing namespace std;struct yufastring SY
2、M; /单词的类别string strToken; /用户所定义的标识符的值int l; /记录换行符的个数,即记录源文件的行数yufa0, yufa1, yufa21000;/yufa1用于保存各个单词,yufa1用于词法分析过程;yufa0主要用于语法分析;char ch;int mm= 0; /结构体数组下标int line = 0;/出错位置/char ch = ;string key15 = begin, end, if, then, else, while, write, read,do, call, const, var, procedure, program, odd ;/预设
3、保留字void prog();void block();void condecl();void _const();void vardecl();void proc();void body();void statement();void lexp();void exp();void term();void factor();void error0()cout program标示符出错 endl;exit(0); /出错即退出 void error1()cout 第 line 行缺少分号 endl;void error2()cout 第 line 行标识符(变量名)出错 endl;void err
4、or3()cout 第 line 常量未声明(缺少const) endl;void error4()cout 第 line 常量未赋值 endl;void error5()cout 第 line 赋值号出错或者缺少赋值号 endl;void error6()cout 第 line 变量未声明(缺少var) endl; void error7()cout 第 line 行缺少右括号 endl;void error8()cout 第 line 行缺少左括号 endl;void error9()cout 第 line 行缺少参数 endl;void error10()cout 第 line 行pro
5、cedure错误 endl;void error11()cout 第 line 行缺少end(begin与end不匹配) endl;void error12()cout 第 line 行缺少then(if与then不匹配) endl;void error13()cout 第 line 行缺少do(while与do不匹配) endl;void error14()cout 第 line 行调用过程缺少标识符 endl;void error15()cout 第 line 行缺少分号 endl;void error16()cout 第 line 行条件语句出错(缺少界符) endl;void prog
6、)/程序的递归子程序实现line+;if (yufa0.SYM = program)/ programmm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = biaoshifu) / ,即标识符 mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = ;)/;mm+; yufa0.SYM = yufa2mm.SYM;block();else error1();/缺少; else error2();/缺少标识符或者标识符错误 else error0();cout nn-语法分析结束-nn endl;void block()/程
7、序体的递归子程序实现, if (yufa0.SYM = const)condecl();if (yufa0.SYM = var)vardecl();if (yufa0.SYM = procedure)proc();body();void condecl()/常量说明的递归子程序实现, const ,;line+;if (yufa0.SYM = const) / constmm+; yufa0.SYM = yufa2mm.SYM;_const();/while (yufa0.SYM = ,)/,逗号mm+; yufa0.SYM = yufa2mm.SYM;_const();/if (yufa0.
8、SYM = ;)/;mm+; yufa0.SYM = yufa2mm.SYM;else error1();/缺少; else error3();/缺少常量定义const void _const()/常量, :=if (yufa0.SYM = biaoshifu) / mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = fuzhi)mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = didit)mm+; yufa0.SYM = yufa2mm.SYM;else error4();/常量未赋值 else error5();
9、/缺少赋值号,或者赋值号错误 else error2(); /缺少标识符 void vardecl()/变量说明的递归子程序实现, var ,;line+;if (yufa0.SYM = var) mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = biaoshifu) /mm+; yufa0.SYM = yufa2mm.SYM;while (yufa0.SYM = ,)/,mm+; yufa0.SYM = yufa2mm.SYM;/下一单词if (yufa0.SYM = biaoshifu) /mm+; yufa0.SYM = yufa2mm.SYM;e
10、lse error2();/缺少标识符即缺少变量 if (yufa0.SYM = ;)mm+; yufa0.SYM = yufa2mm.SYM;/下一单词else error2();else error6();/变量未声明 void proc()/ procedure (,);line+;if (yufa0.SYM = procedure) /proceduremm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = biaoshifu) / mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = () /(mm+; yufa0
11、SYM = yufa2mm.SYM;if (yufa0.SYM = biaoshifu)/ mm+; yufa0.SYM = yufa2mm.SYM;while (yufa0.SYM = ,)/ ,mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = biaoshifu)mm+; yufa0.SYM = yufa2mm.SYM;else error2();if (yufa0.SYM = )/ )mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = ;)/;mm+; yufa0.SYM = yufa2mm.SYM;/下一单
12、词-block();while (yufa0.SYM = ;)mm+; yufa0.SYM = yufa2mm.SYM;proc();else error1();/ 缺少; else error7();/括号不匹配 (右括号少) else error8();/左括号缺少 else error9();/缺少参数 else error10();/procedure错误 void body()/ begin ;endif (yufa0.SYM = begin)line+;mm+; yufa0.SYM = yufa2mm.SYM;statement();/while (yufa0.SYM = biao
13、shi) | (yufa0.SYM = if) | (yufa0.SYM = while) |/ (yufa0.SYM = call) | (yufa0.SYM = read) | (yufa0.SYM = write) | (yufa0.SYM = begin)/error1();/语句未到最后一条,缺少;while(yufa0.SYM = ;)mm+; yufa0.SYM = yufa2mm.SYM;statement();if (yufa0.SYM = end)line +;mm+; yufa0.SYM = yufa2mm.SYM;else error11();/缺少end与begin匹
14、配 else error12();/缺少begin/ := /语句 / |if then else / |while do / |call (,)/ |/ |read (,)/ |write (,)void statement()if (yufa0.SYM = biaoshifu) / := line+;mm+; yufa0.SYM = yufa2mm.SYM;if (yufa0.SYM = fuzhi)mm+; yufa0.SYM = yufa2mm.SYM;exp();else error5();/赋值号错误 else if (yufa0.SYM = if) /if then else l
15、ine+;mm+; yufa0.SYM = yufa2mm.SYM;lexp();if (yufa0.SYM = then) mm+; yufa0.SYM = yufa2mm.SYM;statement();if (yufa0.SYM = else)mm+; yufa0.SYM = yufa2mm.SYM;statement();else error12();/缺少then else if (yufa0.SYM = while)/while do line+;mm+; yufa0.SYM = yufa2mm.SYM;lexp();if (yufa0.SYM = do) mm+; yufa0.S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析
