递归下降语法分析器实验报告
编译原理实验报告
题目: 递归下降语法分析器
学 院 计算机科学与技术
专 业 xxxxxxxxxxxxxxxx
学 号 xxxxxxxxxxxx
姓 名 宁剑
指导教师 xx
20xx年xx月xx日
递归下降语法分析器
一、实验目的?
???? 了解语法分析的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法。
算术表达式的文法可以是可以根据需要适当改变:
→E+E|E-E|E*E|E/E|(E)|i
??? ?根据递归下降分析法或预测分析法 ,对表达式进行语法分析 ,判断一个表达式是否正确 。
(1) 准备:1. 阅读课本有关章节,确定算术表达式的文法(设计出预测分析表2. 考虑好设计方案;3. 设计出模块结构 、测试数据,初步编制好程序。
(2) 上机调试,发现错误,分析错误,再修改完善。教师根据学生的设计方案与学生进行探讨,以修改方案和代码 。
(3)改造后的文法:E→E+T|E-T|T
T→TF|T/F|F
F→F^|P
P→c |id| (E)
四、实验环境?
计算机 VC++软件#include
#include
#include
#include
#include
void error();
void terror();
void Scanner();
char sym=' ';
int i=0;
char strToken[30]={""};
FILE *in;
void E();
void E1();
void F();
void Retract(char str[30]){
for(int j=0;j<30;j++){
str[j]=0;
}
}
void Scanner(){
sym=fgetc(in);
if (isspace(sym)){
while(1){
if(isspace(sym)){
sym=fgetc(in);
}
else break;
}
}
if(isdigit(sym)){
while(1){
if (isdigit(sym)){
strToken[i]=sym;
i++;
sym=fgetc(in);
}
else{
printf("%s",strToken);
i=0;
Retract(strToken);
fseek(in,-2,1);
sym=fgetc(in);
break;
}
}
}
else{
if(sym=='+'){
printf("+");
}
else if(sym=='-'){
printf("-");
}
else if(sym=='*'){
printf("*");
}
else if(sym=='/'){
printf("/");
}
else if(sym=='^'){
printf("^");
}
else if(sym=='('){
printf("(");
}
else if(sym==')'){
printf(")");
}
}
}
void F(){
if(isdigit(sym)){
Scanner();
}
else if (sym=='('){
Scanner();
E();
if(sym==')'){
Scanner();
}
else error();
}
else terror();
}
void T1(){
if(sym=='*'||sym=='/'||sym=='^'){
Scanner();
F();
T1();
}
}
void T(){
F();
T1();
}
void E1(){
if (sym=='+'||sym=='-'){
Scanner();
T();
E1();
}
}
void E(){
T();
E1();
}
void error(){
printf("\nThis is a wrong phrase!\n");
exit(0);
}
void terror(