LR1分析法Word文档格式.docx

上传人:b****2 文档编号:15109667 上传时间:2022-10-27 格式:DOCX 页数:15 大小:49.94KB
下载 相关 举报
LR1分析法Word文档格式.docx_第1页
第1页 / 共15页
LR1分析法Word文档格式.docx_第2页
第2页 / 共15页
LR1分析法Word文档格式.docx_第3页
第3页 / 共15页
LR1分析法Word文档格式.docx_第4页
第4页 / 共15页
LR1分析法Word文档格式.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

LR1分析法Word文档格式.docx

《LR1分析法Word文档格式.docx》由会员分享,可在线阅读,更多相关《LR1分析法Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。

LR1分析法Word文档格式.docx

(3)接受acc:

当归约到文法符号栈中只剩文法的开始符号S时,并且输入符号串已结束即当前输入符是'

#'

,则为分析成功。

(4)报错:

当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入端不是该文法能接受的符号串。

四、实验要求

1、编程时注意编程风格:

空行的使用、注释的使用、缩进的使用等。

2、如果遇到错误的表达式,应输出错误提示信息。

3、程序输入/输出实例:

输入一以#结束的符号串(包括+—*/()i#):

在此位置输入符号串

输出过程如下:

步骤状态栈符号栈剩余输入串动作

10#i+i*i#移进 

i+i*i的LR分析过程

步骤

状态栈

符号栈

输入串

动作说明

1

#

i+i*i#

ACTION[0,i]=S5,状态5入栈

2

05

#i

+i*i#

r6:

F→i归约,GOTO(0,F)=3入栈

3

03

#F

r4:

T→F归约,GOTO(0,T)=3入栈

4

02

#T

r2:

E→T归约,GOTO(0,E)=1入栈

5

01

#E

ACTION[1,+]=S6,状态6入栈

6

016

#E+

i*i#

ACTION[6,i]=S5,状态5入栈

7

0165

#E+i

*i#

F→i归约,GOTO(6,F)=3入栈

8

0163

#E+F

T→F归约,GOTO(6,T)=9入栈

9

0169

#E+T

ACTION[9,*]=S7,状态7入栈

10

01697

#E+T*

i#

ACTION[7,i]=S5,状态5入栈

11

016975

#E+T*i

F→i归约,GOTO(7,F)=10入栈

12

0169710

#E+T*F

r3:

T→T*F归约,GOTO(6,T)=9入栈

13

r1:

E→E+T,GOTO(0,E)=1入栈

14

Acc:

分析成功

4、输入符号串为非法符号串(或者为合法符号串)

算术表达式文法的LR分析表

ACTION

GOTO

i

+

*

E

T

F

S5

S4

S6

acc

r2

S7

r4

r6

S11

r1

r3

r5

五、实验步骤

1、根据流程图编写出各个模块的源程序代码上机调试。

2、编制好源程序后,设计若干用例对系统进行全面的上机测试,并通过所设计的LR

(1)语法分析程序;

直至能够得到完全满意的结果。

3、书写实验报告;

实验报告正文的内容:

◆描述LR

(1)语法分析程序的设计思想。

◆程序结构描述:

函数调用格式、参数含义、返回值描述、函数功能;

函数之间的调用关系图。

◆详细的算法描述(程序执行流程图)。

◆给出软件的测试方法和测试结果。

◆实验总结(设计的特点、不足、收获与体会)。

源程序:

#include<

iostream>

cstdio>

cstdlib>

cstring>

stack>

usingnamespacestd;

intk=0;

structNode1

{

intstate;

charvt;

ints;

}map[100];

//当状态栈中的状态遇到终结符或者非终结符时应如何归约或移进

//用M代表S'

用R代表E'

W代表T'

e代表空

intss[12]={0,1,2,3,4,5,6,7,8,9,10,11};

charS[12][4]={"

S0"

"

S1"

S2"

S3"

S4"

S5"

S6"

S7"

S8"

S9"

S10"

S11"

};

charR[12][4]={"

r0"

r1"

r2"

r3"

r4"

r5"

r6"

charG[10][10]={"

M->

E"

E->

E+T"

T"

T->

T*F"

F"

F->

(E)"

i"

//存储文法中的产生式

charVN[6]={'

E'

'

T'

F'

//存储非终结符

charVT[6]={'

+'

*'

('

)'

i'

//存储终结符

charRight[10][8]={"

stack<

char>

stak1,stak2;

//stak用于状态栈,stak1用于符号栈

intACTION[12][6]={200,200,4,200,5,200,6,200,200,200,200,0,102,7,200,102,200,102,104,104,200,104,200,104,200,200,4,200,5,200,106,106,200,106,200,106,200,200,4,200,5,200,200,200,4,200,5,200,6,200,200,11,200,200,101,7,200,101,200,101,103,103,200,103,200,103,105,105,200,105,200,105};

intGOTO[12][3]={1,2,3,200,200,200,200,200,200,200,200,200,8,2,3,200,200,200,200,9,3,200,200,10,200,200,200,200,200,200,200,200,200,200,200,200};

intFind(intstate,charvt)

inti;

for(i=0;

i<

k;

i++)

{

if(map[i].vt==state&

&

map[i].vt==vt)

returnmap[i].s;

}

return200;

}

intempty1(intq[],intn)

{

for(inti=0;

n;

if(q[i]!

=-1)return1;

break;

return0;

intpoint(intstak[],intn)

inttemp=0;

for(inti=0;

if(stak[i]==-1)break;

temp=i-1;

returntemp;

voidpop1(intq[],intn){

inttemp;

temp=point(q,n);

q[temp]=-1;

voidpush1(intq[],intn,inte){

q[temp+1]=e;

inttop1(intq[],intn)

inttemp;

temp=point(q,n);

returnq[temp];

intvn_t(charc){

6;

if(VT[i]==c)returni;

for(i=0;

if(VN[i]==c)returni;

return100;

}

char*Analyse(char*word)

{

intstak[12];

intp,q;

inth;

intvt_n1;

intact;

charoutput[10];

inti=1,j,l=strlen(word),k=0,m;

for(intd=0;

d<

12;

d++)

stak[d]=-1;

while(!

stak1.empty())

stak1.pop();

while(empty1(stak,12))

pop1(stak,12);

push1(stak,12,100);

stak1.push('

);

push1(stak,12,0);

printf("

________________________________________________________________________________\n"

\n对符号串%s的分析过程\n"

word);

步骤状态栈元素符号栈顶元素剩余输入串ACTIONGOTO\n"

p=top1(stak,12);

h=stak1.top();

while(p!

=100)

%3d"

i++);

q=point(stak,12);

for(i=1;

=q;

printf("

%d"

stak[i

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

当前位置:首页 > 考试认证 > 从业资格考试

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

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