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

上传人:b****3 文档编号:14182102 上传时间:2022-10-19 格式: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

LL

(1)语法分析程序*/

/*E->

E+T|T*/

/*T->

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)文法,写出详细的判断过程:

EE+T|E-T|T

TT*F|T/F|F

Fi|(E)

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

ETE’

E’+TE’|-TE’|ε

TFT’

T’*FT’|/FT’|ε

Fi|(E)

(2)可推出的非终结符表为:

E

E’

T

T’

F

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

FIRST(E)={(,i}

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

FIRST(T)={(,i}

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

FIRST(F)={(,i}

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

FOLLOW

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

当前位置:首页 > 工程科技 > 能源化工

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

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