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