📄 recuranalyser.c
字号:
void recurPARL(){
if(WORD.index==30) //"("
getWord();
if(WORD.index==17){ //variable
enterVTable(0); //填变量表
getWord();
}
else{
error_handle(11); //error:非法变量名
skip(3); //jump to var or procedure or begin
}
while(WORD.index==32){ //","
if(WORD.index==32)
getWord();
if(WORD.index==17){ //variable
enterVTable(0); //填变量表
getWord();
}
else{
error_handle(11); //error
skip(3); //jump to var or procedure or begin
}
}
if(WORD.index==31){ //")"
getWord();
ProcTable.table[ProcTable.pointer].paranum=counter-1;//填该过程的参数个数
}
else{
error_handle(7); //error:缺少)
skip(3); //jump to var or procedure or begin
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//IDP(变量说明)的递归下降分析子程序
void recurIDP(){
if(WORD.index==2) //"var"
getWord();
if(WORD.index==17){ //variable
enterVTable(0); //填变量表
getWord();
}
else{
error_handle(11); //error:非法变量名
skip(2); //jump to procedure or begin
}
while(WORD.index==32){ //","
if(WORD.index==32)
getWord();
if(WORD.index==17){ //variable
enterVTable(0); //填变量表
getWord();
}
else{
error_handle(11); //error:非法变量名
skip(2); //jump to procedure or begin
}
}
if(WORD.index==33){ //";"
getWord();
ProcTable.table[ProcTable.pointer].variablenum=counter-1;
}
else{
error_handle(5); //error:缺少;
skip(2); //jump to procedure or begin
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//PP(过程)的递归下降分析子程序
void recurPP(){
int i;
Operand op1;
Operand op2;
Operand op3;
if(WORD.index==2) //"var"
recurIDP();
if(WORD.index!=3 && WORD.index!=4){
error_handle(3); //error:缺少var
skip(2); //jump to procedure or begin
}
while(WORD.index==3) //"procedure"
recurPRP();
if(WORD.index!=4){
error_handle(4); //error:缺少procedure
skip(1); //jump to begin
}
if(WORD.index==4){ //"begin"
ProcTable.table[ProcTable.pointer].variablenum=counter-1;
i=ProcStack.top->index; //生成开辟数据区的四元式
op1.type=-1;
op2.type=-1;
op3.type=1;
op3.offset=ProcTable.table[i].variablenum;
GEN(8,op1,op2,op3);
ProcTable.table[i].quaterposition=PC-1; //填当前过程第一条四元式的位置
getWord();
}
else
error_handle(1); //error:缺少begin
LRAnalyser(); //执行语句处理
if(WORD.index==5){ //"end"
op1.type=-1; //生成返回四元式
op2.type=-1;
op3.type=-1;
GEN(7,op1,op2,op3);
getWord();
level--; //嵌套深度减1
pop(); //一过程结束,栈顶弹出
}
else{
error_handle(2); //error:缺少end
skip(2);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//PRP(子程序)的递归下降分析子程序
void recurPRP(){
if(WORD.index==3){ //"procedure"
getWord();
level++;
counter=1;
}
if(WORD.index==17){ //variable
enterPTable(); //填过程名表
push();
getWord();
}
else{
if(WORD.index==30 || WORD.index==33){
error_handle(18); //error:缺少过程名
skip(3);
}
else{
error_handle(12); //error:非法过程名
skip(3);
}
}
if(WORD.index==30) //"("
recurPARL();
if(WORD.index!=33){
error_handle(6); //error:缺少(
skip(3);
}
if(WORD.index==33) //";"
getWord();
else{
error_handle(5); //error:缺少;
skip(3); //jump to var or procedure or begin
}
recurPP();
if(WORD.index==33) //";"
getWord();
else{
error_handle(3); //error:缺少;
skip(2); //jump to procedure or begin
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//PROG(程序)的递归下降分析子程序
void recurPROG(){
Operand op1;
Operand op2;
Operand op3;
if(WORD.index==1) //"program"
getWord();
else{
error_handle(0); //error:缺少program
errflag_prog=true;
skip(3); //jump to var or procedure or begin
}
if(WORD.index==17){ //variable
enterPTable(); //填过程名表
getWord();
}
else{
if(errflag_prog==false){
error_handle(10); //error:非法主程序名
errflag_prog=true;
skip(3); //jump to var or procedure or begin
}
}
if(WORD.index==33) //";"
getWord();
else{
if(errflag_prog==false){
error_handle(5); //error:缺少;
errflag_prog=true;
skip(3); //jump to var or procedure or begin
}
}
recurPP(); //过程
if(WORD.index==34){ //"."
op1.type=-1; //生成停机四元式
op2.type=-1;
op3.type=-1;
GEN(9,op1,op2,op3);
op1.type=-1; //生成停机四元式
op2.type=-1;
op3.type=1;
op3.offset=ProcTable.table[0].quaterposition;
GEN(22,op1,op2,op3);
getWord();
if(WORD.index!=0){
error_handle(16); //error:程序结束,无效语句
while(WORD.index!=0) //释放剩余二元式链表空间
getWord();
}
}
else{
if(WORD.index==0)
error_handle(9); //error:缺少.
else{
error_handle(16); //error:程序结束,无效语句
while(WORD.index !=0) //释放剩余二元式链表空间
getWord();
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//显示变量名表函数
void printVTable(){
int i;
printf("变量名表内容:\n");
printf("vname\tplevel\trelposition\n");
for(i=0;i<VariableTable.first;i++){
printf("%s\t",VariableTable.table[i].vname);
printf("%d\t",VariableTable.table[i].plevel);
printf("%d\n",VariableTable.table[i].relposition);
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//显示过程名表函数
void printPTable(){
int i;
printf("过程名表内容:\n");
printf("pname\tparanum\tvsum\tfirinvt\tplevel\toutp\tfirinqu\n");
for(i=0;i<=ProcTable.pointer;i++){
printf("%s\t",ProcTable.table[i].pname);
printf("%d\t",ProcTable.table[i].paranum);
printf("%d\t",ProcTable.table[i].variablenum);
printf("%d\t",ProcTable.table[i].firstinvtable);
printf("%d\t",ProcTable.table[i].plevel);
printf("%d\t",ProcTable.table[i].outposition);
printf("%d\n",ProcTable.table[i].quaterposition);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -