实验4-LR(1)分析法Word文档下载推荐.doc

上传人:b****9 文档编号:13086722 上传时间:2022-10-04 格式:DOC 页数:7 大小:148.50KB
下载 相关 举报
实验4-LR(1)分析法Word文档下载推荐.doc_第1页
第1页 / 共7页
实验4-LR(1)分析法Word文档下载推荐.doc_第2页
第2页 / 共7页
实验4-LR(1)分析法Word文档下载推荐.doc_第3页
第3页 / 共7页
实验4-LR(1)分析法Word文档下载推荐.doc_第4页
第4页 / 共7页
实验4-LR(1)分析法Word文档下载推荐.doc_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

实验4-LR(1)分析法Word文档下载推荐.doc

《实验4-LR(1)分析法Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《实验4-LR(1)分析法Word文档下载推荐.doc(7页珍藏版)》请在冰豆网上搜索。

实验4-LR(1)分析法Word文档下载推荐.doc

i

输出的格式如下:

(1)LR

(1)分析程序,编制人:

姓名,学号,班级

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

在此位置输入符号串

(3)输出过程如下:

步骤

状态栈

符号栈

剩余输入串

动作

1

#

i+i*i#

移进

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

备注:

(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;

如果为匹配终结符则写明匹配的终结符;

如分析异常出错则写为“分析出错”;

若成功结束则写为“分析成功”。

(2)在此位置输入符号串为用户自行输入的符号串。

注意:

1.表达式中允许使用运算符(+-*/)、分割符(括号)、字符i,结束符#;

2.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好);

3.对学有余力的同学,测试用的表达式事先放在文本文件中,一行存放一个表达式,同时以分号分割。

同时将预期的输出结果写在另一个文本文件中,以便和输出进行对照;

4.可采用的其它的文法。

三.实验过程

3.1代码如下:

#include<

iostream>

stack>

stdlib.h>

string>

usingnamespacestd;

//初始化预测分析表

stringaction[12][6]={

{"

s5"

"

error"

s4"

},

s6"

acc"

r2"

s7"

r4"

},

r6"

s11"

r1"

r7"

r3"

r5"

}

};

stringgo[12][3]={

1"

2"

3"

8"

9"

10"

charVt[6]={'

i'

'

+'

*'

('

)'

#'

//终结符表

stringLR[6]={"

E->

E+T"

T"

T->

T*F"

F"

F->

(E)"

i"

//LR文法

stack<

int>

S;

//状态栈

char>

X;

//符号栈

charinput[10];

//输入字符

intnum(strings){//判断字符串中的数字

inti;

stringstr="

"

;

for(intj=0;

j<

s.length();

j++)

{

if(s[j]>

='

0'

&

&

s[j]<

9'

)str=str+s[j];

}

i=atoi(str.c_str());

returni;

voidpreview(char*c)

{

for(intj=0;

c[j]!

='

cout<

<

c[j];

cout<

endl;

voidprint(inti,char*c)//剩余输入串的输出

for(intj=i;

c[j-1]!

'

\t'

intsame(chara){//用于查找终结符

for(inti=0;

i<

6;

i++){

if(a==Vt[i])

returni;

}

return-1;

voidanalyse(){//**********分析程序

boolflag=true;

//循环条件控制

intstep=1,point=0,state=0;

//步骤、指针、状态

charch1,ch2;

intm,n,l;

//用于判断终结符,分析表,表达式右部的长度

stringstr1;

//用于判断对应分析表中的符号

stringstr2="

#"

str3="

0"

//记录符号栈的所有元素

cout<

姓名:

苏朋辉学号:

201416010211班级:

计科F1402班"

endl<

endl;

请输入要规约的字符串,并以#号结束:

cin>

>

input;

"

您输入的字符串为:

preview(input);

X.push('

);

S.push(0);

步骤"

<

状态栈"

符号栈"

输入串"

动作"

step++<

str3<

str2<

print(point,input);

初始化"

//*************初始化

while(flag){//************进入循环

state=S.top();

ch1=input[point];

m=same(ch1);

str1=action[state][m];

//***********移进动作

if(str1[0]=='

s'

){

n=num(str1);

S.push(n);

X.push(ch1);

str2=str2+ch1;

ch2=n+48;

str3=str3+ch2;

point++;

print(point,input);

str1<

:

'

移进"

}

elseif(str1[0]=='

r'

){//**********归约动作

l=LR[n-1].length()-3;

for(inti=1;

i<

=l;

i++)

{

S.pop();

str3=str3.substr(0,str3.length()-1);

X.pop();

str2=str2.substr(0,str2.length()-1);

}

X.push(LR[n-1][0]);

str2=str2+LR[n-1][0];

state=S.top();

if(LR[n-1][0]=='

E'

S.push(num(go[state][0]));

ch2=num(go[state][0])+48;

str3=str3+ch2;

elseif(LR[n-1][0]=='

T'

S.push(num(go[state][1]));

ch2=num(go[state][1])+48;

F'

S.push(num(go[state][2]));

ch2=num(go[state][2])+48;

cout<

print(point,input);

LR[n-1]<

归约"

//*********出错

elseif(str1=="

Error!

\n"

程序错误,分析结束!

flag=false;

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

当前位置:首页 > 求职职场 > 社交礼仪

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

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