《编译原理》(实验部分)
实验3_PL0语法分析
一、实验目的
加深和巩固对于语法分析的了解和掌握;给出PL/0文法规范,要求编写PL/0语言的语法分析程序。
二、实验设备
1、PC 兼容机一台;操作系统为WindowsWindowsXP。
2、Visual C++ 6.0 或以上版本, Windows 2000 或以上版本,汇编工具(在Software 子目录下)。
三、实验原理
PL/O语言的编译程序,是用高级语言PASCAL语言书写的。整个编译过程是由一些嵌套及并列的过程或函数完成。语法分析是由过程BLOCK完成。采用自顶向下的递归子程序法。所产生的目标程序为假象栈式计算机的汇编语言。对目标程序的执行是由PASCAL语言书写的解释程序进行的。
四、实验步骤
实验代码 int lp=0; int rp=0;
#define getsymdo if(-1==getsym()) return -1 #define expressiondo() if(-1==expression()) return -1 #define termdo() if(-1==term()) return -1 #define factordo() if(-1==factor()) return -1 int expression(); //语法分析 int factor()
{
if(sym!=ident &&sym!=number&&sym!=lparen) {
err++;
if(err==1) printf(\语法错误: \\n\
printf(\Needs Ident or Number or
Lparen\\n\
}
if ((sym == ident) || (sym == number) || (sym == lparen)) {
if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus&&sym!=rparen)
{ }
if(lp==0 && sym==rparen) { }
err++;
if(err==1) printf(\语法错误: \\n\printf(\没有左括号匹配\\n\err++;
if(err==1) printf(\语法错误: \\n\printf(\变量后没有跟上+-*\\\\ \\n\
if (sym == ident) {
WordAnalyse(); if(getsym()==-1) { }
return -1;
}
else if (sym == number) {
WordAnalyse(); if(getsym()==-1) { }
return -1;
if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus&&sym!=rparen)
}
else if (sym == lparen) {
WordAnalyse(); lp++;
if(getsym()==-1) {
lp--; err++; { }
if(lp==0 && sym==rparen) { }
err++;
if(err==1) printf(\语法错误: \\n\printf(\没有左括号匹配\\n\err++;
if(err==1) printf(\语法错误: \\n\printf(\数字后没有跟上+-*\\\\ \\n\
}
if(err==1) printf(\语法错误: \\n\printf(\return -1;
expressiondo(); if (sym == rparen) {
WordAnalyse(); lp--;
if(getsym()==-1) { }
return -1;
if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus) } return 0;
}
} else { }
err++;
if(err==1) printf(\语法错误: \\n\printf(\{ }
err++;
if(err==1) printf(\语法错误: \\n\printf(\括号后没有跟上+-*\\\\ \\n\
}
int term() {
factordo();
if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus&&sym!=ident&&s
ym!=number&&sym!=lparen&&sym!=rparen) }
int expression() {
{ }
err++;
if(err==1) printf(\语法错误: \\n\printf(\不能识别字符\\n\
while ((sym == times) || (sym == slash)) { } return 0;
WordAnalyse(); if(getsym()==-1) { }
factordo();
err++;
if(err==1) printf(\语法错误: \\n\printf(\后缺项\\n\return -1;
if ((sym == plus) || (sym == minus)) {
//cout< } else { } if (sym==minus&&2==strlen(ID)+1) else { } getsymdo; termdo(); flg=0; WordAnalyse(); flg=1; //WordAnalyse(); termdo(); if(sym!=times&&sym!=slash&&sym!=plus&&sym!=minus&&sym!=ident&&s ym!=number&&sym!=lparen&&sym!=rparen) { } err++; if(err==1) printf(\语法错误: \\n\printf(\不能识别字符\\n\ while ((sym == plus) || (sym == minus)) { WordAnalyse(); if(getsym()==-1) { err++; if(err==1) printf(\语法错误: \\n\printf(\后缺项\\n\ } } } return -1; termdo(); return 0; int main(int argc, char* argv[]) { } init(); err=0; ifstream fin(\ofstream fout(\ch=' '; lp=0; getsymdo; expression(); if(err==0) cout<<\语法正确\else cout<<\语法错误,错误个数: \