上机练习二:语法分析
一、根据上机练习一给出的PL/0语言扩充的巴克斯范式语法描述,利用递归下降的语法分析方法,编写PL/0语言的语法分析程序。 要求:
1. 对给出的PL/0语言进行分析,证明其可以进行自上而下的语法分析;
2. 对block、proc、statement、condition、expression、term、factor进行分析,画出语法
分析图,在此基础上描述这些子程序的设计思想; 3. 具有一定的语法错误处理能力;
二、源代码
#include
string SYM; //单词的类别 string strToken; //用户所定义的标识符的值 int l; //记录换行符的个数,即记录源文件的行数
}yufa0, yufa1, yufa2[1000];//yufa1用于保存各个单词,yufa1用于词法分析过程;yufa0主要用于语法分析; char ch;
int mm= 0; //结构体数组下标 int line = 0;//出错位置 //char ch = ' ';
string key[15] = { \\预设保留字
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 <<\标示符出错\ exit(0); //出错即退出 }
void error1() { cout <<\第\行缺少分号\ }
void error2() {
cout <<\第\行标识符(变量名)出错\}
void error3() {
cout <<\第\常量未声明(缺少const)\}
void error4() {
cout <<\第\常量未赋值\}
void error5() { cout <<\第\赋值号出错或者缺少赋值号\}
void error6() { cout <<\第\变量未声明(缺少var)\ }
void error7() { cout <<\第\行缺少右括号\}
void error8() { cout <<\第\行缺少左括号\}
void error9()
{
cout <<\第\行缺少参数\}
void error10() {
cout <<\第\行procedure错误\}
void error11() {
cout <<\第\行缺少end(begin与end不匹配)\}
void error12() {
cout <<\第\行缺少then(if与then不匹配)\}
void error13() {
cout <<\第\行缺少do(while与do不匹配)\}
void error14() { cout <<\第\行调用过程缺少标识符\}
void error15() {
cout <<\第\行缺少分号\}
void error16() { cout <<\第\行条件语句出错(缺少界符)\}
void prog()//程序的递归子程序实现 { line++; if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == \ //
}
}
else error1();//缺少; } else error2();//缺少标识符或者标识符错误 }
else error0();
cout <<\语法分析结束------------------------\\n\\n\
void block()//程序体的递归子程序实现,
void condecl()//常量说明的递归子程序实现,
void _const()//常量,
}
mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == \{ mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; } }
else error4();//常量未赋值
else error5();//缺少赋值号,或者赋值号错误
else error2(); //缺少标识符 }
void vardecl()//变量说明的递归子程序实现,