编译原理实验三-自下而上语法分析及语义分析x 下载本文

内容发布更新时间 : 2024/5/28 2:02:34星期一 下面是文章的全部内容请认真阅读。

上海电力学院

编译原理 课程实验报告

实验名称: 实验三 自下而上语法分析及语义分析

院 系: 计算机科学与技术学院 专业年级: 学生姓名: 学号: 指导老师:

实验日期:

实验三自上而下的语法分析

一、实验目的:

通过本实验掌握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 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); 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