编译原理语法分析报告.docx
- 文档编号:25703722
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:28
- 大小:18.90KB
编译原理语法分析报告.docx
《编译原理语法分析报告.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析报告.docx(28页珍藏版)》请在冰豆网上搜索。
编译原理语法分析报告
上机练习二:
语法分析
一、根据上机练习一给出的PL/0语言扩充的巴克斯范式语法描述,利用递归下降的语法分析方法,编写PL/0语言的语法分析程序。
要求:
1.对给出的PL/0语言进行分析,证明其可以进行自上而下的语法分析;
2.对block、proc、statement、condition、expression、term、factor进行分析,画出语法分析图,在此基础上描述这些子程序的设计思想;
3.具有一定的语法错误处理能力;
二、源代码
#include
#include
#include
#include
#include
usingnamespacestd;
structyufa
{
stringSYM;//单词的类别
stringstrToken;//用户所定义的标识符的值
intl;//记录换行符的个数,即记录源文件的行数
}yufa0,yufa1,yufa2[1000];//yufa1用于保存各个单词,yufa1用于词法分析过程;yufa0主要用于语法分析;
charch;
intmm=0;//结构体数组下标
intline=0;//出错位置
//charch='';
stringkey[15]={"begin","end","if","then","else","while","write","read",
"do","call","const","var","procedure","program","odd"};//预设保留字
voidprog();
voidblock();
voidcondecl();
void_const();
voidvardecl();
voidproc();
voidbody();
voidstatement();
voidlexp();
voidexp();
voidterm();
voidfactor();
voiderror0()
{
cout<<"program标示符出错"< exit(0);//出错即退出 } voiderror1() { cout<<"第"< } voiderror2() { cout<<"第"< } voiderror3() { cout<<"第"< } voiderror4() { cout<<"第"< } voiderror5() { cout<<"第"< } voiderror6() { cout<<"第"< } voiderror7() { cout<<"第"< } voiderror8() { cout<<"第"< } voiderror9() { cout<<"第"< } voiderror10() { cout<<"第"< } voiderror11() { cout<<"第"< } voiderror12() { cout<<"第"< } voiderror13() { cout<<"第"< } voiderror14() { cout<<"第"< } voiderror15() { cout<<"第"< } voiderror16() { cout<<"第"< } voidprog()//程序的递归子程序实现 { line++; if(yufa0.SYM=="program")//program { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM==";")//; { mm++;yufa0.SYM=yufa2[mm].SYM; block(); } elseerror1();//缺少; } elseerror2();//缺少标识符或者标识符错误 } elseerror0(); cout<<"\n\n--------------------------语法分析结束------------------------\n\n"< } voidblock()//程序体的递归子程序实现, { if(yufa0.SYM=="const") condecl(); if(yufa0.SYM=="var") vardecl(); if(yufa0.SYM=="procedure") proc(); body(); } voidcondecl()//常量说明的递归子程序实现, { line++; if(yufa0.SYM=="const")//const { mm++;yufa0.SYM=yufa2[mm].SYM; _const();// while(yufa0.SYM==",")//,逗号 { mm++;yufa0.SYM=yufa2[mm].SYM; _const(); }// if(yufa0.SYM==";")//; { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror1();//缺少; } elseerror3();//缺少常量定义const } void_const()//常量, = { if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="fuzhi") { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="didit") { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror4();//常量未赋值 } elseerror5();//缺少赋值号,或者赋值号错误 } elseerror2();//缺少标识符 } voidvardecl()//变量说明的递归子程序实现, { line++; if(yufa0.SYM=="var") { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; while(yufa0.SYM==",")//, { mm++;yufa0.SYM=yufa2[mm].SYM;//下一单词 if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror2();//缺少标识符即缺少变量 } if(yufa0.SYM==";") { mm++;yufa0.SYM=yufa2[mm].SYM; }//下一单词 elseerror2(); } } elseerror6();//变量未声明 } voidproc()// { line++; if(yufa0.SYM=="procedure")//procedure { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="(")//( { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; while(yufa0.SYM==",")//, { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu") { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror2(); } } if(yufa0.SYM==")")//) { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM==";")//; { mm++;yufa0.SYM=yufa2[mm].SYM;//下一单词---------->> block(); while(yufa0.SYM==";") { mm++;yufa0.SYM=yufa2[mm].SYM; proc(); } } elseerror1();//缺少; } elseerror7();//括号不匹配(右括号少) } elseerror8();//左括号缺少 } elseerror9();//缺少参数 } elseerror10();//procedure错误 } voidbody()// { if(yufa0.SYM=="begin") { line++; mm++;yufa0.SYM=yufa2[mm].SYM; statement(); //while((yufa0.SYM=="biaoshi")||(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=yufa2[mm].SYM; statement(); } if(yufa0.SYM=="end") { line++; mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror11();//缺少end与begin匹配 } elseerror12();//缺少begin } // = //|if //|while //|call //| //|read( //|write( voidstatement() { if(yufa0.SYM=="biaoshifu")// = { line++; mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="fuzhi") { mm++;yufa0.SYM=yufa2[mm].SYM; exp(); } elseerror5();//赋值号错误 } elseif(yufa0.SYM=="if")//if { line++; mm++;yufa0.SYM=yufa2[mm].SYM; lexp(); if(yufa0.SYM=="then") { mm++;yufa0.SYM=yufa2[mm].SYM; statement(); if(yufa0.SYM=="else") { mm++;yufa0.SYM=yufa2[mm].SYM; statement(); } } elseerror12();//缺少then } elseif(yufa0.SYM=="while")//while { line++; mm++;yufa0.SYM=yufa2[mm].SYM; lexp(); if(yufa0.SYM=="do") { mm++;yufa0.SYM=yufa2[mm].SYM; statement(); } elseerror13();//缺少do不匹配(while与do不匹配) } elseif(yufa0.SYM=="call")//call { line++; mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu")// { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="(")// { mm++;yufa0.SYM=yufa2[mm].SYM; while(yufa0.SYM==",") { mm++;yufa0.SYM=yufa2[mm].SYM; exp(); } if(yufa0.SYM==")") { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror7();//缺少右括号 } //此处不会报错,[( } elseerror14();//调用过程缺少标识符 } elseif(yufa0.SYM=="read")//read( { line++; mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="(") { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu") { mm++;yufa0.SYM=yufa2[mm].SYM; while(yufa0.SYM==",") { mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="biaoshifu") { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror2();//缺少标示符 } if(yufa0.SYM==")") { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror7();//缺少右括号 } elseerror9();//read缺少参数 } elseerror8();//缺少左括号 } elseif(yufa0.SYM=="write")//write( { line++; mm++;yufa0.SYM=yufa2[mm].SYM; if(yufa0.SYM=="(") { mm++;yufa0.SYM=yufa2[mm].SYM; exp(); while(yufa0.SYM==",") { mm++;yufa0.SYM=yufa2[mm].SYM; exp(); } if(yufa0.SYM==")") { mm++;yufa0.SYM=yufa2[mm].SYM; } elseerror7();//缺少右括号 } elseerror8();//缺少左括号 } elsebody();// } // // // // // // // // l表示字母) // voidlexp()// { if(yufa0.SYM=="odd") { mm++; yufa0.SYM=yufa2[mm].SYM; exp(); } else { exp(); if((yufa0.SYM=="ge")||(yufa0.SYM=="g")||(yufa0.SYM=="l")||(yufa0.SYM=="ne")||(yufa0.SYM=="l")||(yufa0.SYM=="=")) { mm++; yufa0.SYM=yufa2[mm].SYM; exp(); } else error15();//条件语句出错,缺少界符 } //odd是否存在? } voidexp()// { while((yufa0.SYM=="+")||(yufa0.SYM=="-")) { mm++; yufa0.SYM=yufa2[mm].SYM; term();// } term(); while((yufa0.SYM=="+")||(yufa0.SYM=="-"))// { mm++; yufa0.SYM=yufa2[mm].SYM; term(); } } voidterm()// { factor(); while((yufa0.SYM=="*")||(yufa0.SYM=="/"))// { mm++; yufa0.SYM=yufa2[mm].SYM; factor();//factor() } } voidfactor()// { if(yufa0.SYM=="biaoshi") { mm++; yufa0.SYM=yufa2[mm].SYM; } elseif(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)