实验三 语法分析的C语言实现(DOC) 联系客服

发布时间 : 星期四 文章实验三 语法分析的C语言实现(DOC)更新完毕开始阅读

实验三 语法分析的C语言实现

一、 实验目的

加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法分析。

二、实验要求

1、 在实验一(用C语言实现词法分析的程序)的基础上,实现编写语法分析程序,语法

分析程序的实现可以采用任何一种编程工具。 2、对语法规则有明确的定义;

3、编写的分析程序能够对实验一的结果进行正确的语法分析;

4、对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程;

三、实验分工

个人完成

四、程序说明

有文法G[E]:E->TG T->FS G->+TG|ε S->*FS|=E|ε F->(E)|i 1.1 判断LL(1)文法

当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法,分析所给文法可知文法中不含左公因子,也不存在左递归,因而再对给定文法计算First集、Follow集以及Select集,对于求出的每个产生式的Select集,看对于同一个左部非终结符是否存在交集,如果它们的交为空则表示所给文法是LL(1)文法,否则不是L(1)文法。若所给文法是LL(1)文法,再根据求得的Select集合构造预测分析表,对于一个输入串,根据已知的预测分析表分析它是否是文法的句子。各非终结符的First集以及Follow集如下表所示:

表1-1

VN 集合 E T G F S First集 {(,i} {(,i} {+,ε} {(,i} {*,=,ε} Follow集 {#,)} {+,#,)} {#,)} {*,+,=,#} {+,#,)} 各产生式的Select集: Select(E->TG)={(,i}

Select(T->FS)={(,i}

Select(G->+TG)={+} Select(G->ε)={#,)}

Select(S->*FS)={*} Select(S->ε)={+,#,)} Select(S->=E)={=} Select(F->(E))={(} Select(F->i)={i} 由各产生式的Select集可以看出,每个非终结符的Select集交集为空,则可以确定该文法是LL(1)文法。 1.2 构造预测分析表

表1-2 VT VN i ->TG ->FS ->i + ->+TG ->ε * ->*FS ( ->TG ->FS ->(E) ) ->ε ->ε # ->ε ->ε = ->TG ->FS ->=E E T G F S

程序流程图 开始 结构体赋值 F F 提示错误 产生式 F 逆序入栈 预测分析表构造 读入分析串 有非法字符 F 为终结符 T T 为空 不入栈 T 提示错误 T 匹配 F 提示错误 T 出栈 T 分析成功 F T F 匹配 提示错误 分析结束 主要函数介绍:

1、void print();输出分析栈 2、void print1();输出剩余串 3、int main();程序主函数,在其中调用自定义函数,完成文法产生式的赋值,预测分析表的构建,以及对输入串的分析等主要功能。 程序主要代码:

1、初始化程序即分析栈、剩余串、非终结符与终结符的初始化

char A[20];/*分析栈*/ char B[20];/*剩余串*/

char v1[20]={'i','+','*','(',')','#',';','='};/*终结符 */ char v2[20]={'E','G','T','S','F'};/*非终结符 */ int j=0,b=0,top=0,l;/*L为输入串长度 */ 2、结构体的定义及结构体变量定义

typedef struct type/*产生式类型定义 */ {

char origin;/*大写字符 */

char array[5];/*产生式右边字符 */ int length;/*字符个数 */ }type;

type c,e,t,g,g1,s,s1,f,f1,s2;/*结构体变量 */ type C[10][10];/*预测分析表 */ 3、输出分析栈函数定义 void print() {

int a;

for(a=0;a<=top+1;a++) printf(\ printf(\}

4、输出剩余串函数定义 void print1() {

int j;

for(j=0;j

for(j=b;j<=l;j++) printf(\ printf(\}

5、在main函数中定义结构体,把文法产生式赋值给结构体 /*把文法产生式赋值结构体*/ e.origin='E';

strcpy(e.array,\ e.length=2; t.origin='T';

strcpy(t.array,\ t.length=2; g.origin='G';

strcpy(g.array,\ g.length=3; g1.origin='G';