资源预览内容
第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
第9页 / 共9页
亲,该文档总共9页全部预览完了,如果喜欢就下载吧!
资源描述
实验三 自下而上语法分析及语义分析一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。对于正确的表达式,给出表达式的值。对于错误的表达式,给出出错位置。四、实验方法 采用LR分析法。首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。接下来给出LR分析表。然后程序的具体实现:l LR分析表可用二维数组(或其他)实现。l 添加一个val栈作为语义分析实现的工具。l 编写总控程序,实现语法分析和语义分析的过程。注:对于整数的识别可以借助实验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 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; /解释说明 OutNode; /输出结果中每一行的类型 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(请输入文法的第%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; char 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,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)/给定一个终结符或非终结符,返回其在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 Ou
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号