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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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");

相关文档
最新文档