实验5 LL1语法分析程序的设计与实现C语言Word格式.docx

上传人:b****5 文档编号:20804071 上传时间:2023-01-25 格式:DOCX 页数:23 大小:2.32MB
下载 相关 举报
实验5 LL1语法分析程序的设计与实现C语言Word格式.docx_第1页
第1页 / 共23页
实验5 LL1语法分析程序的设计与实现C语言Word格式.docx_第2页
第2页 / 共23页
实验5 LL1语法分析程序的设计与实现C语言Word格式.docx_第3页
第3页 / 共23页
实验5 LL1语法分析程序的设计与实现C语言Word格式.docx_第4页
第4页 / 共23页
实验5 LL1语法分析程序的设计与实现C语言Word格式.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

实验5 LL1语法分析程序的设计与实现C语言Word格式.docx

《实验5 LL1语法分析程序的设计与实现C语言Word格式.docx》由会员分享,可在线阅读,更多相关《实验5 LL1语法分析程序的设计与实现C语言Word格式.docx(23页珍藏版)》请在冰豆网上搜索。

实验5 LL1语法分析程序的设计与实现C语言Word格式.docx

T*F|F*/

/*F->

(E)|i*/

/*目的:

对输入LL

(1)文法字符串,本程序能自动判断所给字符串就是否为所给文法的句子,并能给出分析过程。

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

/*程序相关说明*/

/*A=E'

B=T'

*/

/*预测分析表中列号、行号*/

/*0=E1=E'

2=T3=T'

4=F*/

/*0=i1=+2=*3=(4=)5=#*/

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

#include"

iostream"

#include"

stdio、h"

malloc、h"

conio、h"

/*定义链表这种数据类型参见:

*/

structLchar{

charchar_ch;

structLchar*next;

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

/*p指向终结符线性链表的头结点,h指向动态建成的终结符线性链表节点,top与base分别指向非终结符堆栈的顶与底*/

charcurchar;

//存放当前待比较的字符:

终结符

charcurtocmp;

//存放当前栈顶的字符:

非终结符

intright;

inttable[5][6]={{1,0,0,1,0,0},

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

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

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

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

/*存放预测分析表,1表示有产生式,0表示无产生式。

inti,j;

voidpush(charpchar)/*入栈函数*/

{

temp=(structLchar*)malloc(sizeof(Lchar));

temp->

char_ch=pchar;

next=top;

top=temp;

}

voidpop(void)/*出栈函数*/

curtocmp=top->

char_ch;

if(top->

char_ch!

='

#'

top=top->

next;

voiddoforpush(intt)/*根据数组下标计算的值找对应的产生式,并入栈*/

switch(t)

case0:

push('

A'

);

T'

break;

case3:

case11:

+'

case20:

B'

F'

case23:

case32:

*'

case40:

i'

case43:

)'

E'

('

/*根据curchar与curtocmp转为数字以判断就是否有产生式*/

voidchangchartoint()

switch(curtocmp)/*非终结符:

栈顶*/

case'

:

i=0;

i=1;

i=2;

i=3;

i=4;

switch(curchar)/*终结符:

待识别的表达式中*/

j=0;

j=1;

j=2;

j=3;

j=4;

j=5;

/*识别算法*/

voiddosome(void)

intt;

for(;

;

pop();

/*读取栈顶的字符存curtocmp中*/

curchar=h->

/*读取输入字符链表h中一个字符存入curchar*/

printf("

\n%c\t%c"

curchar,curtocmp);

if(curtocmp=='

&

&

curchar=='

)/*如果都就是终结符P94图5、11圈1、圈5、圈7*/

||curtocmp=='

)/*如果curtocmp不就是终结符P94图5、11圈1*/

if(curtocmp!

)/*如果curtocmp不就是终结符,也不就是结束符,则根据预测分析表找到产生式并入栈P94图5、11圈1*/

changchartoint();

if(table[i][j])/*[1、1]有产生式P94图5、11圈2*/

t=10*i+j;

/*计算产生式在数组中的位置*/

doforpush(t);

/*找对应t的产生式并入栈P94图5、11圈3*/

continue;

else/*[1、2]没有产生式P94图5、11圈4*/

right=0;

/*出错*/

elseif(curtocmp!

=curchar)/*如果curtocmp不就是终结符,并且就是结束符,判断终结符链表字符就是否也为终结符P94图5、11圈1、1、5、6*/

else

/*正确P94图5、11圈1、1、5、7*/

=curchar)/*如果curtocmp就是终结符,并且不等于当前终结符链表中的终结符,则出错。

P94图5、11圈1、8、9*/

else/*如果curtocmp就是终结符,并且等于当前终结符链表中的终结符,则匹配成功,可以读取下一个链表头的终结符P94图5、11圈10*/

h=h->

/*读取下一字符*/

intmain(void)

charch;

right=1;

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

/*初始化非终结符堆栈,栈底为#,栈顶为文法开始符号*/

base->

next=NULL;

char_ch='

next=base;

/*初始化非终结符堆栈,栈底为#,栈顶为文法开始符号E*/

/*初始化存放待识别的表达式(终结符)的线性链表头*/

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

h->

p=h;

/*开辟了一个空的链表空间,p与h同时指向该空间,该空间将作为终结符链表的头部。

请输入要分析的字符串(#号结束)\n"

do{/*输入待识别的表达式*/

ch=getch();

putch(ch);

//在屏幕上输出一个字符

if(ch=='

||ch=='

{/*将输入的ch存入链表*/

char_ch=ch;

next=temp;

/*如果输入正确,h不断的指向新输入的字符,而p始终指向输入终结符字符串的头位置,即前面开辟的空的链表空间。

temp=p->

/*如果输入错误,提示输入有错,请重新输入,让temp指向输入字符串的头部,并将前面正确输出的字符串再次输出*/

\nInputawrongchar!

Inputagain:

\n"

if(temp!

=NULL)

%c"

temp->

char_ch);

temp=temp->

}while(ch!

p=p->

/*消去第一个空头节点,并使头结点指向非空线性链表表头*//*如果输入正确,h不断的指向新输入的字符,而输入字符串的头位置被记录在p里面。

h=p;

/*h重新指向头结点,以便后面识别操作*/

dosome();

/*开始识别*/

if(right)

\n成功!

输入的表达式可以被该文法识别!

\n错误!

表示输入的表达式不可以被该文法识别!

getch();

return0;

3.测试数据及运行结果

七、简单LL

(1)文法判别程序设计

1、判断以下文法就是不就是LL

(1)文法,写出详细的判断过程:

E+T|E-T|T

T*F|T/F|F

i|(E)

(1)消除左递归,文法变为:

TE’

E’

+TE’|-TE’|ε

FT’

T’

*FT’|/FT’|ε

i|(E)

(2)可推出

的非终结符表为:

就是

(3)各非终结符的FIRST集合为:

FIRST(E)={(,i}

FIRST(E’)={+,-,ε}

FIRST(T)={(,i}

FIRST(T’)={*,/,ε}

FIRST(F)={(,i}

(4)各非终结符的FOLLOW集合为:

FOLLOW(E)={),#}

FOLLOW(E’)={),#}

FOLLOW(T)={),#,+,-}

FOLLOW(T’)={),#,+,-}

FOLLOW(F)={*,/,+,-,),#}

(5)各产生式的SELECT集合为:

SELECT(E

TE’)={(,i}

SELECT(E’

+TE’)={+}

-TE’)={-}

ε)={),#}

SELECT(T

FT’)={(,i}

SELECT(T’

*FT’)={*}

/FT’)={/}

ε)={+,-,),#}

SELECT(F

(E))={(}

i)={i}

(6)有相同左部产生式的SELECT集合的交集就是否为空?

该文法就是否为LL

(1)文法?

(7)该文法的预测分析表为:

i

+

-

*

/

#

+TE’

-TE’

ε

*FT’

/FT’

(E)

2、设计LL

(1)文法判别程序设计,源代码如下:

E+T|E-T/T*/

T*F|T/F/F*/

/*0=i1=+2=-3=*4=/5=(6=)7=#*/

inttable[5][8]={{1,0,0,0,0,1,0,0},

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

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

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

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

case5:

case12:

-'

case25:

case33:

case34:

/'

case45:

j=6;

j=7;

 

ch=getchar();

putchar(ch);

3、测试数据及运行结果,运行结果截图应包含姓名或学号信息、

截图应包含一个正例i*(i+i)-i/i#一个反例i*(i+i)-i-/i#

正例成功截图如下:

反例成功截图如下:

4、实验总结、心得体会

在进行此次实验上机前应该做好准备:

按照老师提供的教材P93页的图4、11预测分析程序的流程图熟悉预测分析的工作过程。

计算出要分析的文法的FIRST集合、FOLLOW集合与SELECT集合。

根据

得出的各个集合得出构造预测

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1