实验三自下而上语法分析及语义分析_第1页
实验三自下而上语法分析及语义分析_第2页
实验三自下而上语法分析及语义分析_第3页
实验三自下而上语法分析及语义分析_第4页
实验三自下而上语法分析及语义分析_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、接下来给出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分析结果应为:错误的表达式:出错位置为附录:源程序#include #includestring.h #include using name

3、space 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 e*plen50; /解释说明 OutNode; /输出结果中每一行的类型 OutNode out20; /存放输出结果 c

4、har 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(请输入文法的第%d个产生式n,i); scanf(%s,GramSent+i-1); p

5、rintf(请输入文法的一个句子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; char mid4; printf(*n); printf(* 提示:每输入一个元

6、素后就回车 *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,mid); void output_LR(int row,int colno)

7、 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)/给定一个终结符或非终结符,返回其在ACTION表与GoTo表中的列位置 int i; char c2=0;

8、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,gra20; int s_num,r_num; int n,len,j; str

9、cpy(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+1.statestateTop=s_num; outi+1.state+sta

10、teTop=-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=CharChangeNum(mid+1);/r_num为r后的数字 strcpy(gra,*(Gra

11、mSent+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+1行的状态栈赋值 strcpy(outi+1.sign,outi.sign);

12、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); printf(*n); for(i=0;i=r;i+) j=0; printf(%2

13、d ,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,#); signTop=1; /符号栈赋值,置栈顶位 strcpy(out0.gra

14、sen, ); /产生式为空 strcpy(out0.input,Sentence); /以下两行为输入串赋值 strcat(out0.input,#); strcpy(out0.e*plen,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; printf(*n); printf(* 函数的输入: 文法的产生式,文法句型的一个句子,LR分析表 *n); printf(* 函数的输出: LR分析器的工作过程与说明 *n); printf(*n); printf(请输入LR分析表中终结符与非终结符的总个数n); scanf(%d,&col

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论