编译原理-语法分析器
token[m]=NULL; m=0;sum=0; ch=prog[p++]; while(ch==' ') ch=prog[p++];//读取下一个字符; if(ch>=65&&ch<=122 /*是字母字符*/) { while(ch>=65&&ch<=122||ch>=48&&ch<=57)/*为字母字符或数字字 符*/ { token[m++]=ch; ch=prog[p++];//读取下一个字符; } token[m++]='\0'; p=p-1; syn=10; for(n=0;n<6;n++) if(strcmp(token,rwtab[n])==0) { syn=n+1;//给出syn值; break; } } else if(ch>=48&&ch<=57/*ch为数字字符*/) { while(ch>=48&&ch<=57/*ch为数字字符*/) { sum=sum*10+ch-'0'; ch=prog[p++];//读取下一个字符; } p=p-1;//回退一个字符; syn=11; } else switch(ch) { case '<': m=0;token[m++]=ch; ch=prog[p++];//读取下一个字符; if(ch=='>') { syn=21; token[m++]=ch; } else if(ch=='=') { syn=22; token[m++]=ch;
case')': syn=28;token[0]=ch; break; case'#': syn=0;token[0]=ch; break; default: syn=-1; break; } } void statement() { if(syn==10) { scaner();//读下一个单词符号; if(syn==18) { scaner();//读下一个单词符号; expression();//调用expression函数; } else { cout<<"赋值符号错误!"<<endl; kk=1; } } else { cout<<"语句错误!"<<endl; kk=1; } return; } void yucu() { statement();//调用 statement(); while(syn==26) { scaner();//读下一个单词符号; statement();//调用statement()函数; } return; } void expression() { term();//调用term函数; while(syn==13||syn==14) { scaner();//读下一个单词符号; term();//调用term函数 }
} else { if(kk!=1) cout<<"缺end'错误!"<<endl; kk=1; } } else { cout<<"begin错误!"<<endl; kk=1; } return; } void main() { char A; cout<<"*****************************************"<<endl; cout<<" 欢迎使用语法分析程序 "<<endl; loop: p=0; cout<<"*****************************************"<<endl; printf("please input string (以#结束):\n"); do { scanf("%c",&ch); prog[p++]=ch;//输入源程序字符串,送到缓冲区prog[p++]中; } while(ch!='#'); p=0; lrparser(); cout<<"*****************************************"<<endl; cout<<"请确定是否继续输入:Y为继续;其它为退出;"<<endl; cout<<"是否继续:"; cin>>A; switch(A) { case 'Y': goto loop; default: cout<<"*****************************************"<<endl; cout<<"Thank you ! Bye Bye !"<<endl; cout<<"*****************************************"<<endl; break; } }
return; } void term() { factor();//调用 factor 函数; while(syn==15||syn==16) { scaner();//读下一个单词符号; factor();//调用factor函数; } return; } void factor() { if(syn==10||syn==11) scaner();//读下一个单词符号; else if(syn==27) { scaner();//读下一个单词符号; expression();//调用expression()函数; if(syn==28) scaner();//读下一个单词符号; else { cout<<"输出')'错误"<<endl; kk=1; } } else { cout<<"输出表达示错误"<<endl; kk=1; } return; } void lrparser() { scaner();//读下一个单词符号; if(syn==1) { scaner();//读下一个单词符号; yucu();//调用yucu函数; if(syn==6) { scaner();//读下一个单词符号; if(syn==0&&(kk==0)) cout<<"Success"<<endl;
洛阳理工学院计算机与信息工程系 实 验 报 告
日期:2011 年 5 月 10 日
学号 课程 实验名称
B08050423
班级 编译原理 语法分析器Fra bibliotekB080504
姓名 实验 成绩
陈志福
一 实验目的
编制一个递归下降分析程序, 实现对词法分析程序所提供的单词序列的语法检查和结 构分析。
二 实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。 待分析的简单语言的语法: 用扩充的BNF表示如下: <程序>::=begin<语言串>end <语言串>::=<语句>{;<语句>} <语句>::=<赋值语句> <赋值语句>::=ID:= <表达式> <表达式>::=<项>{+<项>|-<项>} <项>::=<因子>{*<因子>|/<因子>} <因子>::=ID|NUM|(<表达式>) 实验要求说明: 输入单词串,以”#”结束,如果是正确的文法句子,则输出成功信息,打印“success”, 否则输出“error”。
} else { syn=20; p=p-1;//回退一个字符; } break; case'>': token[m++]=ch;; ch=prog[p++];//读取下一个字符; if(ch=='=') { syn=24;//将>=的中别码=>syn; token[m++]=ch;; } else { syn=23; p=p-1;//回退一个字符; } break; case':': token[m++]=ch;; ch=prog[p++];//读取下一个字符; if(ch=='=') { syn=18; token[m++]=ch;; } else { syn=17; p=p-1;//回退一个字符; } break; case'+': syn=13;token[0]=ch; break; case'-': syn=14;token[0]=ch; break; case'*': syn=15;token[0]=ch; break; case'/': syn=16;token[0]=ch; break; case'=': syn=25;token[0]=ch; break; case';': syn=26;token[0]=ch; break; case'(': syn=27;token[0]=ch; break;