实验三 自下而上语法分析及语义分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三自下而上语法分析及语义分析
一、实验目的:
通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。
二、实验学时:
4学时。
三、实验内容
根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。
对于正确的表达式,给出表达式的值。
对于错误的表达式,给出出错位置。
四、实验方法
采用LR分析法。
首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。
接下来给出LR分析表。
然后程序的具体实现:
●LR分析表可用二维数组(或其他)实现。
●添加一个val栈作为语义分析实现的工具。
●编写总控程序,实现语法分析和语义分析的过程。
注:对于整数的识别可以借助实验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
#include"string.h"
#include
using namespace std;
#define R 30
#define C 20
typedef struct elem
{
char e[4];
}Elem; //ACTION表与GoTo表中的元素类型
Elem LR[R][C]; //存放ACTION表与GoTo表中的内容
typedef struct out
{
int order; //序号
int state[10]; //状态栈
char sign[30]; //符号栈
char grasen[20]; //产生式
char input[30]; //输入串
char explen[50]; //解释说明
}OutNode; //输出结果中每一行的类型
OutNode out[20]; //存放输出结果
char Sentence[20]; //存放文法的一个句子
char GramSent[10][20]; //存放文法的一组产生式
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;i { printf("请输入文法的第%d个产生式\n",i); scanf("%s",GramSent+i-1); } printf("请输入文法的一个句子\n"); scanf("%s",Sentence); printf("**********************************************************\n"); printf("* 文法的产生式如下: *\n"); printf("**********************************************************\n"); for(i=0;i printf("%s\n",GramSent+i); printf("**********************************************************\n"); printf("* 文法的句子如下: *\n"); printf("**********************************************************\n"); printf("%s\n",Sentence); } void input_LR(int row,int colno) //row为行总数,colno为列总数 { int i,j; char mid[4]; printf("**********************************************************\n"); printf("* 提示:每输入一个元素后就回车 *\n"); printf("**********************************************************\n"); printf("请输入LR分析表的终结符(包括#)与非终结符\n");