ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:31.95KB ,
资源ID:9708993      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9708993.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验三 自下而上语法分析及语义分析.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验三 自下而上语法分析及语义分析.docx

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

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

3、de #includestring.h #include using namespace std; #define R 30 #define C 20 typedef struct elem char e4; Elem; /ACTION表与GoTo表中的元素类型 Elem LRRC; /存放ACTION表与GoTo表中的内容 typedef struct out int order; /序号 int state10; /状态栈 char sign30; /符号栈 char grasen20; /产生式 char input30; /输入串 char explen50; /解释说明 OutNod

4、e; /输出结果中每一行的类型 OutNode out20; /存放输出结果 char Sentence20; /存放文法的一个句子 char GramSent1020; /存放文法的一组产生式 int row,colno; /row为状态个数数,colno为ACTION表与GoTo表列总数 int stateTop=0,signTop=0; /状态栈与符号栈的栈顶位置(值与栈中元素的个数相等) void input_GramSent() int i,num; printf(请输入文法中产生式的个数n); scanf(%d,&num); for(i=0;inum;i+) printf(请输入文

5、法的第%d个产生式n,i); scanf(%s,GramSent+i-1); printf(请输入文法的一个句子n); scanf(%s,Sentence); printf(*n); printf(* 文法的产生式如下: *n); printf(*n); for(i=0;inum;i+) printf(%sn,GramSent+i); printf(*n); printf(* 文法的句子如下: *n); printf(*n); printf(%sn,Sentence); void input_LR(int row,int colno) /row为行总数,colno为列总数 int i,j; c

6、har mid4; printf(*n); printf(* 提示:每输入一个元素后就回车 *n); printf(*n); printf(请输入LR分析表的终结符(包括#)与非终结符n); for(j=0;jcolno;j+) scanf(%s,LR0j.e); for(i=0;irow;i+) printf(请输入%d号状态所对应的各列的元素,空白的地方用s代替n,i); for(j=0;jcolno;j+) scanf(%s,mid); if(strcmp(mid,s)=0|strcmp(mid,S)=0) strcpy(LRi+1j.e, ); else strcpy(LRi+1j.e

7、,mid); void output_LR(int row,int colno) int i,j; printf(*n); printf(* LR分析表如下: *n); printf(*n); printf(n); printf( ); 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)/给定一个终结符或非终结符,返

8、回其在ACTION表与GoTo表中的列位置 int i; char c2=0; c0=ch; for(i=0;icolno;i+) if(strcmp(c,LR0i.e)=0) return i; return -1; int CharChangeNum(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,

9、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|strcmp(mid,ACC)=0) printf(规约成功n); return -1; outi+1.order=i+2; if(mid0=s|mid0=S) s_num=CharChangeNum(mid+1);/s_num为S后的数字 for(j=0;jstateTop;j+) outi+1.statej=outi.statej; outi

10、+1.statestateTop=s_num; outi+1.state+stateTop=-1; /完成第i+1行的状态栈赋值 strcpy(outi+1.sign,outi.sign); outi+1.signsignTop=outi.input0; outi+1.sign+signTop=0; /完成第i+1行的符号栈的赋值 strcpy(outi+1.grasen, ); /完成第i+1行的产生式的赋值 strcpy(outi+1.input,outi.input+1); /完成第i+1行的输入符号串的赋值 else if(mid0=r|mid0=R) r_num=CharChange

11、Num(mid+1);/r_num为r后的数字 strcpy(gra,*(GramSent+r_num-1); len=strlen(gra); for(j=0;j) break; n=strlen(gra+j+2); stateTop-=n; signTop-=n; for(j=0;jstateTop;j+) outi+1.statej=outi.statej; j=SignNum(gra0); outi+1.statestateTop=CharChangeNum(LRouti+1.statestateTop-1+1j.e); outi+1.state+stateTop=-1; /完成第i+

12、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行的产生式的赋值 strcpy(outi+1.input,outi.input); /完成第i+1行的输入符号串的赋值 return 1; void OutputResult(int r) int i,j; printf(*n); printf(* 句子:%s 用LR分析表 规约过程如下: *n,Sentence); pr

13、intf(*n); for(i=0;i=r;i+) j=0; printf(%2d ,outi.order); while(outi.statej!=-1) printf(%d,outi.statej+); printf( %s %s %sn,outi.sign,outi.grasen,outi.input); int OutControl()/输出结果的总控函数 int s_num,i=0; out0.order=1; /序号赋值 out0.state0=0; stateTop=1; out0.statestateTop=-1; /状态栈赋值,置栈顶位 strcpy(out0.sign,#)

14、; signTop=1; /符号栈赋值,置栈顶位 strcpy(out0.grasen, ); /产生式为空 strcpy(out0.input,Sentence); /以下两行为输入串赋值 strcat(out0.input,#); strcpy(out0.explen,0和#进栈); /解释说明 /初使化输出结果的第一行 while(1) s_num=SignNum(outi.input0); /if(s_num!=-1) if(OutResult(outi.statestateTop-1,s_num,i)!=1) break; i+; return i; main() int r; pr

15、intf(*n); printf(* 函数的输入: 文法的产生式,文法句型的一个句子,LR分析表 *n); printf(* 函数的输出: LR分析器的工作过程与说明 *n); printf(*n); printf(请输入LR分析表中终结符与非终结符的总个数n); scanf(%d,&colno); printf(请输入LR分析表中状态的总个数n); scanf(%d,&row); input_LR(row,colno); output_LR(row,colno); input_GramSent(); r=OutControl(); /r为输出结果的行数 OutputResult(r); 七、实验小结这个程序是从网上下载下来的,根据这个实验要求做了些更改,但是总是出现溢出错误,只能运行到LR分析表的部分(如截图),没有找到解决问题的办法。 (注:专业文档是经验性极强的领域,无法思考和涵盖全面,素材和资料部分来自网络,供参考。可复制、编制,期待你的好评与关注)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1