实验三自下而上语法分析报告及语义分析报告

上传人:cn****1 文档编号:492477275 上传时间:2023-03-19 格式:DOC 页数:10 大小:151.50KB
返回 下载 相关 举报
实验三自下而上语法分析报告及语义分析报告_第1页
第1页 / 共10页
实验三自下而上语法分析报告及语义分析报告_第2页
第2页 / 共10页
实验三自下而上语法分析报告及语义分析报告_第3页
第3页 / 共10页
实验三自下而上语法分析报告及语义分析报告_第4页
第4页 / 共10页
实验三自下而上语法分析报告及语义分析报告_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《实验三自下而上语法分析报告及语义分析报告》由会员分享,可在线阅读,更多相关《实验三自下而上语法分析报告及语义分析报告(10页珍藏版)》请在金锄头文库上搜索。

1、实验三 自下而上语法分析及语义分析一、实验目的:通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的 自下而上计算的过程。二、实验学时:4学时。三、实验容根据给出的简单表达式的语法构成规则(见五),编制LF分析程序,要求能对用给定的语法规则书写的源程序进行 语法分析 和语义分析 。对于正确的表达式,给出表达式的值。对于错误的表达式,给出出错位置。四、实验方法采用LR分析法。首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性, 即该文法符号所代表的表达式的值。属性文法的定义可参照书 137页表6.1) ,并将 其改造成用LR分析实现时的语义分析动作(可参照书

2、 145页表6.5 )。接下来给出LR分析表。然后程序的具体实现:LF分析表可用二维数组(或其他)实现。 添加一个 val 栈作为语义分析实现的工具。 编写总控程序,实现语法分析和语义分析的过程。注:对于整数的识别可以借助实验 1。五、文法定义简单的表达式文法如下:E-E+T|E-T|TT-T*F|T/F|FF-(E)|i 上式中, i 为整数。六、处理程序例例 1: 正确源程序例:23+(45+4)* 40分析结果应为: 正确的表达式。其值为: 1983例 2: 错误源程序例:5+(56+)-24分析结果应为: 错误的表达式:出错位置为)附录:源程序#i nclude #i ncludest

3、ri ng.h #in elude using n amespace std;#defi ne R 30#defi ne C20typedef struct elem 表与GoToft中的元素类型char e4;Elem; /ACTIONElem LRRC;/的容存放ACTIO表与GoT(表中typedef struct out intorder;/序号intstate1O;/状态栈charsig n30;/符号栈chargrase n 20;/产生式charin put30;/输入串charexple n50;/解释说明OutNode;/输出结果中每一行的类型OutNode out20;/存

4、放输出结果char Senten ce20;/存放文法的一个句子char GramSe nt1020;/存放文法的一组产生式int row,colno; /row 为状态个数数, colno 为ACTIO表与GoT(表列总数int stateTop=0,signTop=0; /状态栈与符号栈的栈顶位置( 值与栈中元素的个数相等 )void input_GramSent()int i,num;printf(请输入文法中产生式的个数 n);scanf(%d,&num);for(i=0;inum;i+)printf(请输入文法的第个产生式n,i);scanf(%s,GramSent+i-1);pri

5、ntf(请输入文法的一个句子 n);printf(printf(scanf(%s,Sentence);printf(*文法的产生式如下:*n);“*n);*n);for(i=0;inum;i+)printf(%sn,GramSent+i);printf(*n);printf(*文法的句子如下:*n);printf(*n);printf(%sn,Sentence);voidinput_LR(int/row 为行总数, colno 为列总数int i,j;char mid4;row,intcolno)printf(*n);printf(*提示:每输入一个元素后就回车*n);printf(*n);f

6、or(j=0;jcolno;j+)scanf(%s,LR0j.e);for(i=0;irow;i+)printf(”请输入c号状态所对应的各列的元素,空白的地方用s代替n,i);for(j=0;jcolno;j+) scanf(%s,mid);if(strcmp(mid,s)=0|strcmp(mid,S)=0)strcpy(LRi+1j.e, );elsestrcpy(LRi+1j.e,mid);void output_LR(int row,int colno)int i,j;printf(“*n);printf(* LR分析表如下:*n);printf(*n);printf(n);prin

7、tf( );for(j=0;jcolno;j+)printf(%s ,LR0j.e);printf(n);for(i=1;i=row;i+)printf(%d ,i-1);for(j=0;jcolno;j+)printf(%s ,LRij.e);printf(n);printf(n);int SignNum(char ch)/GoT(表中的列位置给定一个终结符或非终结符,返回其在ACTIONS与int i;char c2=0;c0=ch;for(i=0;icolno;i+) if(strcmp(c,LR0i.e)=0) return i;return -1;int CharChangeNum(

8、char* ch)/ 给定一数字字符串 , 返回其所对应的数字int result=0;while(*ch!=0) result=result*10+(*ch-0); ch+;return result;int OutResult(int s,int c,int i)/ 输出结果的第 i+1 行处理函数 ,(s 为状态,c为列)char mid4,gra20;int s_num,r_num;int n,len,j;strcpy(mid,LRs+1c.e);if(strcmp(mid, )=0) printf( 不能规约 n); return -2; if(strcmp(mid,acc)=0|s

9、trcmp(mid,ACC)=0) printf( 规约成功 n); return -1; outi+1.order=i+2;if(mid0=s|mid0=S)为S后的数字完成第 i+1 行的状s_num=CharChangeNum(mid+1);/s_num for(j=0;jstateTop;j+)outi+1.statej=outi.statej; outi+1.statestateTop=s_num; outi+1.state+stateTop=-1; /态栈赋值strcpy(outi+1.sign,outi.sign); outi+1.signsignTop=outi.input0;

10、outi+1.sign+signTop=0; / 完成第 i+1 行的符号 栈的赋值strcpy(outi+1.grasen, ); / 行的产生式的赋值完成第 i+1strcpy(outi+1.input,outi.input+1); /第i+1行的输入符号串的赋值完成else if(mid0=r|mid0=R)r_num=CharChangeNum(mid+1);/r_num strcpy(gra,*(GramSent+r_num-1); len=strlen(gra);for(j=0;j) break;n=strlen(gra+j+2);stateTop-=n; signTop-=n;为

11、r后的数字for(j=0;jstateTop;j+)outi+1.statej=outi.statej;j=SignNum(gra0);j.e);态栈赋值outi+1.state+stateTop=-1; /完成第 i+1 行的状栈的赋值strcpy(outi+1.sign,outi.sign);outi+1.signsignTop=gra0;outi+1.sign+signTop=0; /完成第 i+1 行的符号strcpy(outi+1.grasen,gra);/完成第 i+1 行的产outi+1.statestateTop=CharChangeNum(LRouti+1.statestateTop-1+1生式的赋值i+1 行的输入符号串的赋值return 1;void OutputResult(int r) int i,j;printf(H*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 活动策划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号