算符优先文法及语义分析程序设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算符优先文法及语义分析程序设计

1.设计目的

掌握算符优先文法进行语法分析,通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。进一步培养编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,综合使用程序设计语言、数据结构和编译原理的知识。

2.设计要求

用算符优先文法进行二---十进制的语法分析及语义分析程序设计,编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

3.设计方案

3.1算符优先分析方法原理:

算符优先分析方法是根据算符之间的优先关系而设计的一种自下而上的分析方法。算符优先分析的基本思想是只规定算符之间的优先关系,也就是只考虑终结符之间的优先关系。算符优先分析过程是自下而上的归约过程,所谓的算符优先分析就是定义算符之间(确切地说,终结符之间)的某种优先关系,借助于这种优先关系寻找“可归约串”和进行归约。

该文法必须满足以下条件:

文法它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下产生式右部:…QR…;

首先求出该文法的优先关系表,在程序中用2维数组表示,-1表示小于或者等于,大于为1,其它为0表示错误。

在输入一串字符串以后进行按照文法一步一步的进行规约,我所进行的是直接规约到文法的符号而不是规约到N。

数据结构使用的是链表,用一个STRUCT来表示一个元素,其中包含符号和下一个符号的指针。

3.2算法描述:

首先建立一个符号栈S,既用它寄存终结符,也用它寄存非终结符。以下给出分析算法,其中k代表符号栈S的深度。

k:=1; S[k]:=’#’;

REPEAT

把下一个输入符号读进a中;

IF S[k]属于firstVT THEN j:= k ELSE j:=k-1;

WHILE S[j]>a DO

BEGIN

REPEAT

Q:=S[j];

IF S[j-1] 属于firstVT THEN j:=j-1 ELSE j:=j-2

UNTIL S[j]

把S[j+1]…S[k]归约为某个N;

K:=j+1;

S[k]:=N

END OF WHILE;

IF S[j]

BEGIN k:=k+1; S[k]:=a END

ELSE ERROR //出错

UNTIL a=’#’

在这个程序的设计中主要先显示语法分析所需要通道的文法,然后再进行词法分析,词法分析成功后再进行语义分析并生成中间代码,否则就提示语义分析出错并不进行语义分析生成中间代码。

4.设计内容

4.1 程序流程图:

4.2 程序分析步骤:

在程序的主界面中首先用cout列出了在词法分析中需要用到的几个文法: 直接输入根据已知文法构造的算符优先关系矩阵。

输入已知文法的FIRSTVT和LASTVT集合,由程序自动生成该文法的算符优先关系矩阵。

S → A

A → V:=E

E → E + T | T

T → T * F | F

F → (E) | i

V → i

确定文法的机内表示形式;

确定优先关系矩阵的存放方式。

4.3 程序运行结果:

输入i*i+i#,得出归约失败图:

输入i+i*i#,得到归约成功的图:

4.4程序源代码

/****************************************/

/* 算符优先分析程序*/

/****************************************/

#include

#include

#include "malloc.h"

void push(char pchar); //入栈函数

char pop(void); //出栈函数

int CharToInt(char ch); //将字符转为数字,以得到算符优先值void GoBreakTo(); //归约

void dosome(void); //开始识别

const int table[7][7]={

{ 0, 1, 1, 1, 0, 1, 1},

{-1, 1, 0,-1,-1, 1, 1},

{-1,-1, 0,-1,-1, 0, 1},

{-1, 1, 0, 1,-1, 1, 1},

{-1,-1, 0,-1,-1, 0, 0},

{ 0, 1, 0, 1, 0, 1, 1},

{-1, 0,-1, 0, 0, 0,-1}

};

const char fuhao[7]={')','(','!','*','+',':','|'};

void display()

{

printf("**********************************************************\n");

printf(" | i | ) | ( | ! | * | + | : |\n");

printf("**********************************************************\n");

printf("i");

for(int i=0;i<7;i++)

{

for(int j=0;j<7;j++)

if(table[i][j]==1)

printf("| >\t");

else if(table[i][j]==-1)

printf("| <\t");

else printf("| null\t");

printf("|\n%c",fuhao[i]);

}

printf("**********************************************************\n"); }

//存储算符优先关系表,大于为1,小于或等于为-1,其它为0表示出错

char curchar;

char curcmp;

int right; /*设置开关项,当出错时为0*/

int i,j;

int k; /*比较字符在栈的位置*/

struct Lchar

{

char char_ch;

struct Lchar *next;

}LLchar,*p,*h,*temp,*top,*base;

void main(void)

{

char ch;

right=1;

base=(Lchar*)malloc(sizeof(LLchar));

base->next=NULL;

base->char_ch='#';

top=base;

h=(Lchar*)malloc(sizeof(LLchar));

相关文档
最新文档