欢迎来到天天文库
浏览记录
ID:56071111
大小:53.50 KB
页数:9页
时间:2020-06-19
《实验三 自下而上语法分析报告及语义分析报告.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验三自下而上语法分析及语义分析一、实验目的:通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。二、实验学时:4学时。三、实验容根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。对于正确的表达式,给出表达式的值。对于错误的表达式,给出出错位置。四、实验方法采用LR分析法。首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145
2、页表6.5)。接下来给出LR分析表。然后程序的具体实现:lLR分析表可用二维数组(或其他)实现。l添加一个val栈作为语义分析实现的工具。l编写总控程序,实现语法分析和语义分析的过程。注:对于整数的识别可以借助实验1。五、文法定义简单的表达式文法如下:E->E+T
3、E-T
4、TT->T*F
5、T/F
6、FF->(E)
7、i上式中,i为整数。六、处理程序例例1:正确源程序例:23+(45+4)*40分析结果应为:正确的表达式。其值为:1983例2:错误源程序例:5+(56+)-24分析结果应为:错误的表达式:出错位置为)附录:源程序#include#include"stri
8、ng.h"#includeusingnamespacestd;#defineR30#defineC20typedefstructelem{chare[4];}Elem;//ACTION表与GoTo表中的元素类型ElemLR[R][C];//存放ACTION表与GoTo表中的容typedefstructout{intorder;//序号intstate[10];//状态栈charsign[30];//符号栈chargrasen[20];//产生式charinput[30];//输入串charexplen[50];//解释说明}OutNode;//输出结果中每一行的
9、类型OutNodeout[20];//存放输出结果charSentence[20];//存放文法的一个句子charGramSent[10][20];//存放文法的一组产生式introw,colno;//row为状态个数数,colno为ACTION表与GoTo表列总数intstateTop=0,signTop=0;//状态栈与符号栈的栈顶位置(值与栈中元素的个数相等)voidinput_GramSent(){inti,num;printf("请输入文法中产生式的个数");scanf("%d",&num);for(i=0;i10、生式",i);scanf("%s",GramSent+i-1);}printf("请输入文法的一个句子");scanf("%s",Sentence);printf("**********************************************************");printf("*文法的产生式如下:*");printf("**********************************************************");for(i=0;i11、f("**********************************************************");printf("*文法的句子如下:*");printf("**********************************************************");printf("%s",Sentence);}voidinput_LR(introw,intcolno)//row为行总数,colno为列总数{inti,j;charmid[4];printf("**********************************12、************************");printf("*提示:每输入一个元素后就回车*");printf("**********************************************************");printf("请输入LR分析表的终结符(包括#)与非终结符");for(j=0;j
10、生式",i);scanf("%s",GramSent+i-1);}printf("请输入文法的一个句子");scanf("%s",Sentence);printf("**********************************************************");printf("*文法的产生式如下:*");printf("**********************************************************");for(i=0;i11、f("**********************************************************");printf("*文法的句子如下:*");printf("**********************************************************");printf("%s",Sentence);}voidinput_LR(introw,intcolno)//row为行总数,colno为列总数{inti,j;charmid[4];printf("**********************************12、************************");printf("*提示:每输入一个元素后就回车*");printf("**********************************************************");printf("请输入LR分析表的终结符(包括#)与非终结符");for(j=0;j
11、f("**********************************************************");printf("*文法的句子如下:*");printf("**********************************************************");printf("%s",Sentence);}voidinput_LR(introw,intcolno)//row为行总数,colno为列总数{inti,j;charmid[4];printf("**********************************
12、************************");printf("*提示:每输入一个元素后就回车*");printf("**********************************************************");printf("请输入LR分析表的终结符(包括#)与非终结符");for(j=0;j
此文档下载收益归作者所有