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

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

实验三语法分析的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

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、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("%c",A[a]);

printf("\t\t");

}

4、输出剩余串函数定义

void print1()

{

int j;

for(j=0;j

printf(" ");

for(j=b;j<=l;j++)

printf("%c",B[j]);

printf("\t\t\t");

}

5、在main函数中定义结构体,把文法产生式赋值给结构体

/*把文法产生式赋值结构体*/

e.origin='E';

strcpy(e.array,"TG");

e.length=2;

t.origin='T';

strcpy(t.array,"FS");

t.length=2;

g.origin='G';

strcpy(g.array,"+TG");

g.length=3;

g1.origin='G';

g1.array[0]='^';

g1.length=1;

s.origin='S';

strcpy(s.array,"*FS");

s.length=3;

s1.origin='S';

s1.array[0]='^';

s1.length=1;

f.origin='F';

strcpy(f.array,"(E)");

f.length=3;

f1.origin='F';

f1.array[0]='i';

f1.length=1;

s2.origin='S';

strcpy(s2.array,"=E");

s2.length=2;

6、预测分析表的初始化及构造

for(m=0;m<=7;m++)/*初始化分析表*/

for(n=0;n<=7;n++)

C[m][n].origin='N';/*全部赋为空*/

/*填充分析表*/

C[0][0]=e;C[0][3]=e;

C[1][1]=g;C[1][4]=g1;C[1][5]=C[1][7]=g1;

C[2][0]=t;C[2][3]=t;

C[3][1]=s1;C[3][2]=s;C[3][4]=C[3][5]=s1;C[3][7]=s2;

C[4][0]=f1;C[4][3]=f;

7、读入分析串,对输入串进行分析,判断输入串是否符合文法的定义,是否有非法字符,是否在分析过程中出现错误信息,是否被接受为文法的句子

do

{

x=A[top--];/*x为当前栈顶字符*/

printf("%d",k++);

printf("\t\t");

for(j=0;j<=7;j++)/*判断是否为终结符*/

if(x==v1[j])

{

flag=1;

break;

}

if(flag==1)/*如果是终结符*/

{

if(x=='#')

{

相关文档
最新文档