文档详情

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

发布:2017-02-12约字共10页下载文档
文本预览下载声明
南华大学 计算机科学与技术学院 实 验 报 告 ( 2007 ~2008 学年度 第二学期 ) 课程名称 编译原理 实验名称 语法分析 姓名 寻友旭 学号 20054350227 专业 软件工程 班级 软件工程052班 地点 6—413 教师 陈星 1.实验目的及要求 编制一个递归下降分析程序,实现对词法分析程序所提供得单词序列得语法检查和结构分析。 软件、硬件环境 VC6.0 要求: 利用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’ (ε)=( SELECT(T’ (*FT’)∩SELECT(T’ ( ∕FT’)∩SELECT(T’ (ε)=( SELECT(F((E) )∩SELECT(F(i)= ( 由上可知,有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。因此,转化后的文法可以用递归下降分析法作语法分析。 2.实验步骤 分析试验资料,结合书本得出实验大体思路; 根据资料画出语法分析程序的流程图; 根据流程图与程序大体框架完善程序; 将代码输入电脑中,调试; 根据资料中数据测试程序得基本功能; 根据测试结果,设计测试数据完善程序; 根据实验结果分析总结。 3. 实验内容 词法分析程序的主要子函数模块流程图 程序: #include stdio.h #includedos.h #includestdlib.h #includestring.h 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;
显示全部
相似文档