资源描述:
《LR分析器的实现》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、LR分析器的实现一.实验目的1、掌握下推机这一数学模型的结构和理论,并深刻理解下推自动机在LR分析法中的应用(即LR分析器)。2、掌握LR分析法的思想,学会特定分析表的构造方法,利用给出的分析表进行LR分析。二.实验内容根据课堂讲授的形式化算法,编制程序实现LR分析器,结合给定的分析表,对一个输入语句语法分析,判断是否符合相应的文法要求。三.实验要求要求实现以下功能:a) 组织分析表(可以是SLR、LR(0)、LR(1)或者LALR(1)分析表)和语句的输入b) 要实现通用的LR分析思想的源代码c) 输出对语句的语法分
2、析判断结果,如果可能给出错误的信息提示四.实现方法根据课本的LR分析器模型和LR分析算法,实现一高级语言程序,完成LR分析。分析表可以上面提到的任何一种,只输入即可,不要求构造分析表。对c要求中的错误信息提示,指的是对应分析表中的空白处,每一个空白的地方都应该有对应的错误情况,因而有相应的错误信息。注意这里的语法分析,是在词法分析的基础上进行的。五.设计题目及内容设计题目:根据LR分析表构造LR分析器内容:已知文法G:(1)E→E+T(2)E→T(3)T→T*F(4)T→F(5)F→(E)(6)F→ILR分析表: AC
3、TION(动作)GOTO(转换)状态 I + * ( ) # E T F0S5 S4 1231 S6 Acc 2 R2S7 R2R2 3 R4R4 R4R4 4S5 S4 8235 R6R6 R6R6 6S5 S4 937S5 S4 108 S6 S11 9 R1S7 R1R1 10 R3R3 R3R3 11 R5R5 R5R5 六.实验代码#include#include//0--11表示状态结点,21--26表示规
4、约标号,//-1表示error(出错),12表示acc(接受)inttable[13][9]={{5,-1,-1,4,-1,-1,1,2,3}, {-1,6,-1,-1,-1,12,-1,-1,-1}, {-1,22,7,-1,22,22,-1,-1,-1}, {-1,24,24,-1,24,24,-1,-1,-1}, {5,-1,-1,4,-1,-1,8,2,3}, {-1,26,26,-1,26,26,-1,-1,-1}, {5,-1,-1,4,-1,-1,-1,9,3}, {5,-1,
5、-1,4,-1,-1,-1,-1,10}, {-1,6,-1,-1,11,-1,-1,-1,-1}, {-1,21,7,-1,21,21,-1,-1,-1}, {-1,23,23,-1,23,23,-1,-1,-1}, {-1,25,25,-1,25,25,-1,-1,-1}};//规约规则structrule{charx;int y;}r[6]={{'E',3},{'E',1},{'T',3},{'T',1},{'F',3},{'F',1}};//输入字符charindex_char[9]={'i',
6、'+','*','(',')','#','E','T','F'};////获取index_char[9]中元素的位置intget_index_char(chari){for(intj=0;j<9;j++){if(index_char[j]==i) returnj;}return-1;} #defineMAX20typedefstruct{int stack[MAX];inttop;}status;//初始化栈voidinit_stack(status*p){if(!p)printf("初始化状态栈出错!");p
7、->top=-1;}//压栈voidpush(status*p,intx){if(p->toptop++;p->stack[p->top]=x;}elseprintf("状态栈溢出!");}//弹栈intpop(status*p){intx;if(p->top!=0){x=p->stack[p->top];p->top--;returnx;}else{printf("状态栈1空!");return0;}}//取栈顶元素intget_top(status*p){intx;if(p->
8、top!=-1){x=p->stack[p->top];returnx;}else{printf("状态栈2空!");return0;}}//遍历栈元素voidout_stack(status*p){inti;if(p->top<0)printf("状态栈3空!");for(i=0;i<=p->top;i++){p