编译原理语法分析

2018-12-10 15:02

上机练习二:语法分析

一、根据上机练习一给出的PL/0语言扩充的巴克斯范式语法描述,利用递归下降的语法分析方法,编写PL/0语言的语法分析程序。 要求:

1. 对给出的PL/0语言进行分析,证明其可以进行自上而下的语法分析;

2. 对block、proc、statement、condition、expression、term、factor进行分析,画出语法

分析图,在此基础上描述这些子程序的设计思想; 3. 具有一定的语法错误处理能力;

二、源代码

#include #include #include #include #include using namespace std; struct yufa {

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 == \ // ,即标识符 { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; block();

}

}

else error1();//缺少; } else error2();//缺少标识符或者标识符错误 }

else error0();

cout <<\语法分析结束------------------------\\n\\n\

void block()//程序体的递归子程序实现, → [][][] { if (yufa0.SYM == \ condecl(); if (yufa0.SYM == \ vardecl(); if (yufa0.SYM == \ proc(); body(); }

void condecl()//常量说明的递归子程序实现, → const {,}; { line++; if (yufa0.SYM == \ { 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; } else error1();//缺少; } else error3();//缺少常量定义const }

void _const()//常量,:= { if (yufa0.SYM == \ {

}

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()//变量说明的递归子程序实现, → var {,}; { line++; if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; while (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM;//下一单词 if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; } else error2();//缺少标识符即缺少变量 } if (yufa0.SYM == \ { mm++; yufa0.SYM = yufa2[mm].SYM; }//下一单词 else error2(); } } else error6();//变量未声明 }


编译原理语法分析.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《城南旧事》教案和反思

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: