上海电力学院
编译原理 课程实验报告
实验名称: 实验三 自下而上语法分析及语义分析
院 系: 计算机科学与技术学院 专业年级: 学生姓名: 学号: 指导老师:
实验日期:
实验三自上而下的语法分析
一、实验目的:
通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时:
4学时。 三、实验内容
根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。
对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法
采用LR分析法。
首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书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
状态 i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 S5 S5 S5 S5 S5 S5 + S6 R3 R6 R8 S6 R1 R4 R7 R2 R5 - S12 R3 R6 R8 R12 R1 R4 R7 R2 R5 ACTION(动作) GOTO(转换) * S7 R6 R8 S7 R4 R7 S7 R5 / S13 R6 R8 S13 R4 R7 S13 R5 ( S4 S4 S4 S4 S4 S4 ) R3 R6 R8 S11 R1 R4 R7 R2 R5 # acc R3 R6 R8 R1 R4 R7 R2 R5 E 1 8 T 2 2 9 14 F 3 3 3 10 3 15 五、处理程序例和处理结果例
示例1:20133191*(20133191+3191)+ 3191#
六、源代码
【cifa.h】
//cifa.h
#include
//单词结构定义 struct WordType{ int code; string pro; };
//函数声明
WordType get_w(); void getch(); void getBC(); bool isLetter(); bool isDigit(); void retract();
int Reserve(string str); string concat(string str); 【Table.action.h】 //table_action.h class Table_action {
int row_num,line_num; int lineName[8];
string tableData[16][8]; public:
Table_action() { row_num=16; line_num=8; lineName[0]=30; lineName[1]=7; lineName[2]=13; lineName[3]=8; lineName[4]=14; lineName[5]=1; lineName[6]=2; lineName[7]=15; lineName[8]=0; for(int m=0;m