1 / 37
文档名称:

编译原理语法分析实验报告.doc

格式:doc   大小:200KB   页数:37页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

编译原理语法分析实验报告.doc

上传人:zxwziyou8 2018/6/3 文件大小:200 KB

下载得到文件列表

编译原理语法分析实验报告.doc

相关文档

文档介绍

文档介绍:南华大学
计算机科学与技术学院
实验报告
( 2007 ~2008 学年度第二学期)
课程名称
编译原理
实验名称
语法分析
姓名
寻友旭
学号
20054350227
专业
软件工程
班级
软件工程052班
地点
6—413
教师
陈星

编制一个递归下降分析程序,实现对词法分析程序所提供得单词序列得语法检查和结构分析。
软件、硬件环境

要求:
利用C语言编制递归下降分析程序,并对简单语言进行语法分析。
待分析的简单语言得语法:
EàE+T | E-T | T
TàT*F | T/F |F
                   Fà(E) | i
输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“Accept! Right Expression!”,否则输出“Error!!!”。
语法分析:
a) ∵E=>E+T=>E+T*F=>E+T*(E)即有E=>E+T*(E)存在左递归。用直接改写法消除左递归,得到如下:
E à TE’
E’à +TE’| −TE’|ε
T à FT’
T’à *FT’| /FT’|ε
F à (E) | i
b) 对于以上改进的方法。可得:
对于E’:  FIRST( E’)=FIRST(+TE’)∪FIRST(-TE’)∪{ε}={+,−,ε}
对于T’: FIRST( T’)=FIRST(*FT’)∪FIRST(/FT’)∪{ε}={*,∕,ε}
而且: FIRST( E ) = FIRST( T ) = FIRST( F )=FIRST((E))∪FIRST(i)={(,i }
由此我们容易得出各非终结符的FOLLOW集合如下:
FOLLOW( E )= { ),#}
FOLLOW(E’)= FOLLOW(E)={ ),#}
FOLLOW( T )= FIRST(E’)\ε∪FOLLOW(E’)={+,−,),#}
FOLLOW( T’) = FOLLOW( T ) ={+,−,),#}
FOLLOW( F )=FIRST(T’)\ε∪FOLLOW(T’)={*,∕,+,−,),#}
由以上FOLLOW集可以我们可以得出SELECT集如下:
对E SELECT(EàTE’)=FIRST(TE’)=FIRST(T)={ (,i }
对E’ SELECT(E’à+TE’)={ + }
       SELECT(E’à −TE’)={ −}
       SELECT(E’àε)={ε,),#}
对T SELECT(TàFT’)={(,i}
对T’ SELECT(T’à*FT’)={ * }
SELECT(T’à ∕FT’)={ ∕}
SELECT(T’àε)={ε,+,−,),#}
对F SELECT(Fà(E) )={ ( }
SELECT(Fài)={ i }
∴ SELECT(E’à+TE’)∩SELECT(E’à −TE’)∩SELECT(E’àε)=F
SELECT(T’à*FT’)∩SELECT(T’à ∕FT’)∩SELECT(T’àε)=F
SELECT(Fà(E) )∩SELECT(Fài)= F
由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。因此,转化后的文法可以用递归下降分析法作语法分析。

分析试验资料,结合书本得出实验大体思路;
根据资料画出语法分析程序的流程图;
根据流程图与程序大体框架完善程序;
将代码输入电脑中,调试;
根据资料中数据测试程序得基本功能;
根据测试结果,设计测试数据完善程序;
根据实验结果分析总结。
3. 实验内容
词法分析程序的主要子函数模块流程图
\
程序:
#include <>
#include<>
#include<>
#include<>
char a[50] ,b[50],d[200],e[10];
char ch;
int n1,i1=0,flag=1,n=5;
int total=0;

int E();
int E1();
int T();
int G();
int S();
int F();
void input();
void input1();
void output();
void main() /*递归分析*/
{
int f,p,j=0;
char x;
d[0]='E';
d[1]='=';
d[2]='>';
d[3]='T';