语法分析程序实验报告及代码.docx

上传人:b****6 文档编号:13171629 上传时间:2023-06-11 格式:DOCX 页数:11 大小:47.29KB
下载 相关 举报
语法分析程序实验报告及代码.docx_第1页
第1页 / 共11页
语法分析程序实验报告及代码.docx_第2页
第2页 / 共11页
语法分析程序实验报告及代码.docx_第3页
第3页 / 共11页
语法分析程序实验报告及代码.docx_第4页
第4页 / 共11页
语法分析程序实验报告及代码.docx_第5页
第5页 / 共11页
语法分析程序实验报告及代码.docx_第6页
第6页 / 共11页
语法分析程序实验报告及代码.docx_第7页
第7页 / 共11页
语法分析程序实验报告及代码.docx_第8页
第8页 / 共11页
语法分析程序实验报告及代码.docx_第9页
第9页 / 共11页
语法分析程序实验报告及代码.docx_第10页
第10页 / 共11页
语法分析程序实验报告及代码.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

语法分析程序实验报告及代码.docx

《语法分析程序实验报告及代码.docx》由会员分享,可在线阅读,更多相关《语法分析程序实验报告及代码.docx(11页珍藏版)》请在冰点文库上搜索。

语法分析程序实验报告及代码.docx

语法分析程序实验报告及代码

LL

(1)语法分析实验报告

一、实验题目 LL

(1)语法分析

二、实验目的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。

三、实验内容

构造LL

(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。

程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合则输出错误信息。

消除递归前的文法                  消除递归和提取公因子后的等价文法

SSaT|aT|aTSaTS’|vaTS’

TaT|a            S’ vaTS’|ε 

TaT’

T’aT’|ε            

根据已建立的分析表,对下列输入串:

aaa进行语法分析,判断其是否符合文法。

四、实验要求

1.根据已由的文法规则建立LL

(1)分析表;

a

#

S

SaTS’

S’

S’ ε 

T

TaT’

T’

T’aT’

T’ε

2.输出分析过程。

请输入待分析的字符串:

aaa

   符号栈        输入串         所用产生式

#Saaa#

#S’Taaaa#SaTS’

#S’Taa#

#S’T’aaa#TaT’

#S’T’aaa#

#S’T’a#

#S’T’aa#T’aT’

#S’T’aa#

#S’T’#

#S’#T’ε

##S’ ε

五、程序思路

模块结构:

1、定义部分:

定义常量、变量、数据结构。

2、初始化:

设立LL

(1)分析表、初始化变量空间(包括堆栈、结构体等);

3、运行程序:

让程序分析一个text文件,判断输入的字符串是否符合文法定义的规则;

4、利用LL

(1)分析算法进行表达式处理:

根据LL

(1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示简单的错误提示。

六、程序源代码 

/*程序名称:

LL

(1)文法分析程序*/

/*S->S>aT|aT|>aT*/

/*T->

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

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

/*程序相关说明*/

/*A=S’B=T’*/

/*0=S1=S’2=T3=T’*/

/*0=a1=<2=#*/

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

#include"iostream.h"

#include"stdio.h"

#include"malloc.h"

#include"conio.h"

structLchar{

charchar_ch;

structLchar*next;

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

charcurchar;

charcurtocmp;

intright;

inttable[4][3]={{1,0,0},

{0,0,1},

{0,1,0},

{0,1,1}};

inti,j;

voidpush(charpchar)

{

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

temp->char_ch=pchar;

temp->next=top;

top=temp;

}

voidpop(void)

{

curtocmp=top->char_ch;

if(top->char_ch!

='#')

top=top->next;

}

voiddoforpush(intt)

{

switch(t)

{

case3:

push('A');push('T');push('a');push('<');break;

case0:

push('A');push('T');push('a');break;

case6:

push('T');push('a');push('<');break;

case21:

push('B');push('a');push('<');break;

case31:

push('T');break;

}

}

voidchangchartoint()

{

switch(curtocmp)

{

case'S':

i=0;break;

case'A':

i=1;break;

case'T':

i=2;break;

case'B':

i=3;break;

}

switch(curchar)

{

case'a':

j=0;break;

case'<':

j=1;break;

case'#':

j=2;

}

}

voiddosome(void)

{

intt;

for(;;)

{

pop();

curchar=h->char_ch;

printf("\n%c\t%c",curchar,curtocmp);

if(curtocmp=='#'&&curchar=='#')

break;

if(curtocmp=='S'||curtocmp=='A'||curtocmp=='T'||curtocmp=='B')

{

if(curtocmp!

='#')

{

changchartoint();

if(table[i][j])

{

t=10*i+j;

doforpush(t);

continue;

}

else

{

right=0;

break;

}

}

else

if(curtocmp!

=curchar)

{

right=0;

break;

}

else

break;

}

else

if(curtocmp!

=curchar)

{

right=0;

break;

}

else

{

h=h->next;

continue;

}

}

}

voidmain(void)

{

charch;

cout<<"*文件名称:

语法分析"<

cout<<""<

cout<<"/*程序相关说明*/"<

cout<<"---------------------------------------------------------------------"<

cout<<"-/*A=S’B=T’*/"<

cout<<"-*目的:

对输入LL

(1)文法字符串,本程序能自动判断所给字符串是-"<

cout<<"-*否为所给文法的句子,并能给出分析过程。

-"<

cout<<"-*-------------------------------------------------------------------"<

cout<<"表达式文法为:

"<

cout<<"S->S>aT|aT|>aT"<

cout<<"T->

cout<<"请在下行输入要分析的串(#号结束):

"<

right=1;

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

base->next=NULL;

base->char_ch='#';

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

temp->next=base;

temp->char_ch='S';

top=temp;

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

h->next=NULL;

p=h;

do{

ch=getch();

putch(ch);

if(ch=='a'||ch=='<'||ch=='#')

{

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

temp->next=NULL;

temp->char_ch=ch;

h->next=temp;

h=h->next;

}

else

{

temp=p->next;

printf("\nInputawrongchar!

Inputagain:

\n");

for(;;)

{

if(temp!

=NULL)

printf("%c",temp->char_ch);

else

break;

temp=temp->next;

}

}

}while(ch!

='#');

p=p->next;

h=p;

dosome();

if(right)

printf("\n成功!

\n");

else

printf("\n错误!

\n");

getch();

}

 

七、程序调试与测试结果(输出结果截屏)

特别注明:

程序中使用“<”代替“”。

输入a

若输入aa#则显示错误信息如图:

注意:

所有的输入串都要以#结束。

八:

实验总结:

实验前首先要明白实验的目的,了解什么是LL

(1)语法,实验前首先要写出分析表,然后写出实验输出的分析过程,然后再写代码,分析实验结果。

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2