《编译原理(实验部分)》实验3 - PL0语法分析 下载本文

《编译原理》(实验部分)

实验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<<\语法错误,错误个数: \