新-编译原理语法分析实验报告

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

目录

一.语法分析方法 (1)

1.判断为算符优先文法: (1)

2.求FirstVT集和LastVT集 (1)

3.根据FirstVT和LastVT集构造算符优先表 (1)

二.程序设计 (2)

1.总体设计 (2)

2.子程序设计 (2)

三.程序中的结构说明 (3)

1.重要函数介绍 (3)

2.函数代码 (3)

四.程序测试 (13)

五、实验总结 (15)

一.语法分析方法

有文法G[S]:

(0)S’→#S#

(1)S→V

(2)V→T|ViT

(3)T→F|T+F

(4)F→)V*|(

分析的句子为(+(i(

1.判断为算符优先文法:

文法没有A->…BC…且BC均为非终结符,因此它为OG文法

文法没有同时存在

①A->…ab…或A->….aBb….

②A->…aB…且B=>b….或B=>Cb….

③A->…Bb….且B=>…a或B=>…aC

文法为算符优先文法

2.求FirstVT集和LastVT集

有产生式(0)S’→#S# 可得’#’ ’#’

表1-1 非终结符的FIRSTVT和LASTVT集合表

FIRSTVT LASTVT

S’# #

S i, +,),( i,+,*,(

V i,+, ),( i,+,*,(

T +, ) ,( +,(,*

F ),( *,(

3.根据FirstVT和LastVT集构造算符优先表

表1-2 G[S]的算符优先关系矩阵表

# i + * ( ) #

i

+

* (

)

二.程序设计

1.总体设计

图2-1 总体设计图

2.子程序设计

创建文法关系表模块

图2-2 子程序设计创建文法关系模块图

读入文法规则

创建文法关系表模块

求FIRSTVT 模块 求LASTVT 模块 识别终结符模块 求下标模块

读取语法分析串

输入串分析模块 求FIRSTVT 模块

求LASTVT 模块

识别终结符模块

求下标模块 F

T

三.程序中的结构说明

1.重要函数介绍

int deal(); //对输入串的分析函数

int zhongjie(char c); //判断字符c是否是终结符函数

int xiabiao(char c); //求字符c在算符优先关系表中的下标

void out(int j,int k,char *s); //打印s栈

void firstvt(char c); //求非终结符c的FIRSTVT集

void lastvt(char c); //求非终结符c的LASTVT集

void table(); //创建文法优先关系表

void prtfun(char biao[10][10]); //打印firstvt或者lastvt集

2.函数代码

#include "stdio.h"

#include "stdlib.h"

char data[20][20]; //算符优先关系

char s[100]; //模拟符号栈s

char lable[20]; //文法终结符集

char input[100]; //文法输入符号串

char string[20][10]; //用于输入串的分析

int k;

char a;

int j;

char q;

int r; //文法规则个数

int r1; //转化后文法规则个数

char st[10][30]; //用来存储文法规则

char first[10][10]; //文法非终结符FIRSTVT集

char last[10][10]; //文法非终结符LASTVT集

int fflag[10]={0}; //标志第i个非终结符的FIRSTVT 集是否已求出

int lflag[10]={0}; //标志第i个非终结符的LASTVT集是否已求出

int deal(); //对输入串的分析

int zhongjie(char c); //判断字符c是否是终结符

int xiabiao(char c); //求字符c在算符优先关系表中的下标

void out(int j,int k,char *s); //打印s栈

void firstvt(char c); //求非终结符c的FIRSTVT集

void lastvt(char c); //求非终结符c的LASTVT集

void table(); //创建文法优先关系表

void prtfun(char biao[10][10]); //打印firstvt或者lastvt集

int main()

{

int i,j,k=0;

printf("请输入文法规则数:");

scanf("%d",&r);

printf("请输入文法规则:\n");

for(i=0;i

{

scanf("%s",st[i]); //存储文法规则,初始化FIRSTVT集和LASTVT集 first[i][0]=0; //first[i][0]和last[i][0]分别表示st[i][0]非终结

符的FIRSTVT集和LASTVT集中元素的个数*/

last[i][0]=0;

}

for(i=0;i

{

for(j=0;st[i][j]!='\0';j++)

{

if(st[i][0]<'A'||st[i][0]>'Z') //判断首字母若不是非终结符 { printf("不是算符文法!\n");

exit(-1);

}

if(st[i][j]>='A'&&st[i][j]<='Z') //判断两个非终结符相连

{

if(st[i][j+1]>='A'&&st[i][j+1]<='Z')

{ printf("不是算符文法!\n");

exit(-1);

}

}

}

}

for(i=0;i

{

for(j=0;st[i][j]!='\0';j++)

{

if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i] [j]!='|')

lable[k++]=st[i][j];

}

}

lable[k]='#';

lable[k+1]='\0';

table();

相关文档
最新文档