《编译原理实验三》由会员分享,可在线阅读,更多相关《编译原理实验三(19页珍藏版)》请在金锄头文库上搜索。
1、上海电力学院编译原理课程实验报告实验名称: 实验三 自下而上语法分析及语义分析院 系:计算机科学与技术学院专业年级:学生姓名: 学号:指导老师:实验日期:、实验目的:通过本实验掌握LR分析器的构造过程,并根据语法制导 翻译,掌握属性文法的自下而上计算的过程。二、实验学时:4学时。三、实验内容根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行 语法分析和语义分析。对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。四、实验方法米用LR分析法。首先给出S-属性文法的定义(为简便起见,每个文法符 号只设置一个综合属性,即该文法符号所
2、代表的表达式的 值。属性文法的定义可参照书137页表6.1),并将其改造成 用LR分析实现时的语义分析动作(可参照书145页表6. 5)。接下来给出LR分析表。然后程序的具体实现: LR分析表可用二维数组(或其他)实现。添加一个val栈作为语义分析实现的工具。编写总控程序,实现语法分析和语义分析的过程。注:对于整数的识别可以借助实验1。五、文法定义简单的表达式文法如下:(1) E-E+T(2) E-E-T(3) E-T(4) T-T*F(5) T-T/F(6) T-F(7) F-(E)(8) F-i状态ACTION (动作)GOTO (转换)i+-*/()#ETF0S5S41231S6S12a
3、cc2R3R3S7S13R3R33R6R6R6R6R6R64S5S48235R8R8R8R8R8R86S5S4937S5S4108S6R12S119R1R1S7S13R1R110R4R4R4R4R4R411R7R7R7R7R7R712S5S414313S5S41514R2R2S7S13R2R215R5R5R5R5R5R5五、处理程序例和处理结果例示例1: 20133191*(20133191+3191)+ 3191#20133191*(20133191+3191)+3191#步骤状态栈符号栈值栈当前词动作转向10020133191205#20133191020133191*RS33030201
4、33191本R62402#T020133191半S750270201331910CS460274#T*(0201331910020133191S5702745#T+(201331910201331910020133191+R338027430201331910020133191十肪2g02742#T*(T0201331910020133191亠R3S1002748#T*(E0201331910020133191+S611027486m(E+020133191002013319103191S5120274865#T*(E+3191020133191002013319103191)RS120274
5、863#T*(E+F020132191002013219102191)R6g140274869#T*(E+T020133191002013319103191)R1s1502748#T*(E02013319100201363S2)Sil160274811#T*(E)02013319100201363S204-R7101702710#T*F0201331910201363S24-R421802虹0-928149070十R311901#E0-928149070+S&200160-92814907003191S5210165#E+31910-928U907003191R83220163竝十F0-928
6、14907003191R&g230169#E+T0-92814907003191R1124010-928M5879岸分析成功!结果为:-928145879六、源代码【cifa.h】/cifa.h #includevstring using namespace std;单词结构定义struct WordType int code; string pro;函数声明WordType get_w();void getch(); void getBC(); bool isLetter(); bool isDigit(); void retract(); int Reserve(string str);
7、string concat(string str); 【Table.action.h】 /table_action.h class Table_action int row_num,line_num;int lineName8;string tableData168;public:Table_action() row_num=16; line_num=8; lineName0=30; lineName1=7; lineName2=13; lineName3=8; lineName4=14; lineName5=1; lineName6=2; lineName7=15; lineName8=0;for(int m=0;mrow_num;m+) for(int n=0;n=0&row=0&line=line_num) return tableDatarowline;elsereturn;int getLineNumber(int lineN)for(int i=0;iline_num;i+)if(lineNamei=lineN)return i;return -1;【Table_go.h】/table_go.hc