一、实验目的及要求 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验设备(环境)及要求 PC机及vc6.0软件及环境 三、实验内容与步骤 1.实验内容: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|-TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F-> (E) (8)F->i 编写相应的程序,实现上述功能。 2.实验步骤: (1)根据文法编写相应的函数,如E(),G()等函数,并且每个函数都用全局变量temp的相应值表示其在文法中的位置。 (2)编写error()函数,当与文法不匹配时,打印出错误信息,并用exit(0)退出。 (3)编写output()函数:根据定义的全局变量temp值得出当前分析的串的所处的文法位置,并将其打印出来,接着将分析串、分析字符、剩余串打印出来。 (4)编写main():用word来存储要分析的串(以“#”结束),用循环对每个字符进行分析。 四、实验结果与数据处理 1.串:i+i*i# 结果:
2.串:i*i++i# 结果:出现错误。
五、代码清单 #include<stdio.h> #include<string.h> void E(); void G(); void T(); void S(); void F(); void error(); void output(int count);
char word[50]; int i = 0; int temp = 0; char analysisw[50]; int main() { printf("请输入字符串(长度<50,以#号结束):\n"); scanf("%s",word); printf("%-10s %-20s %-10s %-10s\n","文法","分析串","分析字符","剩余串"); while(word[i] != '#') { E(); }
return 0; }
void E() { temp = 1; output(i); T(); G(); }
void G() { temp = 2; if(word[i] == '+') { analysisw[i] = word[i]; output(i+1); i++; T(); G(); } else if(word[i] == '-') { analysisw[i] = word[i]; output(i+1); i++; T(); G(); } else { temp = 3; output(i); } }
void T() { temp = 4; output(i); F(); S(); }
void S() { temp = 5; if(word[i] == '*') { analysisw[i] = word[i]; output(i+1); i++; F(); S(); } else if(word[i] == '/') { analysisw[i] = word[i]; output(i+1); i++; F(); S(); } else { temp = 6; output(i); } }
void F() { if(word[i] == '(') { analysisw[i] = word[i]; temp = 7; output(i+1); i++; E(); if(word[i] == ')') { analysisw[i] = word[i]; temp = 7; output(i+1); i++; } else { error(); } } else if(word[i] == 'i') { analysisw[i] = word[i]; temp = 8; output(i+1); i++; } else { error(); }
}
void error() { strcpy(analysisw, "analysis error"); output(i); exit(0); }
void output(int count) { switch(temp) { case 1: printf("%-10s","E->TG"); break; case 2: printf("%-10s","G->+TG|-TG"); break; case 3: printf("%-10s","G->ε"); break; case 4: printf("%-10s","T->FS"); break; case 5: printf("%-10s","S->*FS|/FS"); break; case 6: printf("%-10s","S->ε"); break; case 7: printf("%-10s","F-> (E)"); break; case 8: printf("%-10s","F->i"); break; } printf(" %-20s %-10c ",analysisw,word[i]); for(;word[count] != '\0';count++) { printf("%c",word[count]); } printf("\n"); } |
递归下降分析法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.