《编译原理》实验报告 实验二:语法分析程序设计 班级: 08 计算计(3)班 姓名: 斯军浩 学号: E08620325 递归下降分析器设计 [实验目的]: 1. 了解语法分析的主要任务。 2. 熟悉编译程序的编制。 [实验内容]:根据某文法,构造一基本递归下降语法分析程序。给出分析过程中所用的产生式序列。 [实验要求]: 1. 构造一个小语言的文法,例如,Pascal语言子集的文法(同实验一),考虑其中的算术表达式文法: G[<表达式>]: G[E]: <表达式>→<表达式>+<项>|<表达式>-<项>|<项> E→E+T|T <项>→<项>*<因式>|<项>/<因式>|<因式> T→T*F|F <因式>→<标识符>|<无符号整数>|(<表达式>) F→i|(E) 2. 设计语法树的输出形式,例如: 产生式 …… 3. 编写递归下降语法分析程序dgxj.c 实现基本的递归下降分析器,能够分析任给的符号串是否为该文法所定义的合法算术表达式。实验报告中要说明分析使用的方法。 4. 生成并输出分析过程中所用的产生式序列: 1 产生式1 2 产生式2 …… [实验步骤]: 1. 写出一个小语言的文法,根据情况自由选择C语言或Pascal语言。 2. 写出该小语言的算术表达式等价的LL(1)文法。 G[E]: 其中 E→TG G为E’ G→+TG|∧ ∧为ε T→FS S为T’ S→*FS|∧ F→i|(E) 3. 编写递归下降语法分析程序。 4. 调试运行程序。 5. 结果分析。 6. 撰写实验报告。 实验代码 #include void E(); void T(); void E1(); void T1(); void F(); char s[100]; int i, SIGN; int main() { printf("请输入一个语句,以#号结束语句(直接输入#号推出)\n"); while( 1 ) { SIGN = 0; i=0; scanf("%s",&s); if( s[0] == '#') return 0; E(); if(s[i]=='#') printf("正确语句!\n"); printf("请输入一个语句,以#号结束语句\n"); } return 1; } void E() { if(SIGN==0) { T(); E1(); } } void E1() { if(SIGN==0) { if(s[i]=='+') { ++i; T(); E1(); } else if(s[i]!='#'&&s[i]!=')') { printf("语句有误!\n"); SIGN=1; } } } void T() { if(SIGN==0) { F(); T1(); } } void T1() { if(SIGN==0) { if(s[i]=='*') { ++i; F(); T1(); } else if(s[i]!='#'&&s[i]!=')'&&s[i]!='+') { printf("语句有误!\n"); SIGN=1; } } } void F() { if(SIGN==0) { if(s[i]=='(') { ...