实验4-LR(1)分析法.doc

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

实验4-LR(1)分析法.doc

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

实验4-LR(1)分析法.doc

河南工业大学实验报告

课程名称编译原理_实验项目实验四LR

(1)分析法

院系____信息科学与工程学院____专业班级计科F1402班

姓名苏朋辉学号201416010211

指导老师侯惠芳日期2017.5.6

批改日期成绩

一.实验目的

1.掌握LR

(1)分析法的基本原理

2.掌握LR

(1)分析表的构造方法

3.掌握LR

(1)驱动程序的构造方法

二.实验内容及要求

构造LR

(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。

根据某一文法编制调试LR

(1)分析程序,以便对任意输入的符号串进行分析。

本次实验的目的主要是加深对LR

(1)分析法的理解。

程序输入/输出示例:

对下列文法,用LR

(1)分析法对任意输入的符号串进行分析:

(1)E->E+T

(2)E->E—T

(3)T->T*F

(4)T->T/F

(5)F->(E)

(6)F->i

输出的格式如下:

(1)LR

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

姓名,学号,班级

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

在此位置输入符号串

(3)输出过程如下:

步骤

状态栈

符号栈

剩余输入串

动作

1

0

#

i+i*i#

移进

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

备注:

(1)在“所用产生式”一列中如果对应有推导则写出所用产生式;如果为匹配终结符则写明匹配的终结符;如分析异常出错则写为“分析出错”;若成功结束则写为“分析成功”。

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

注意:

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

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

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

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

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

三.实验过程

3.1代码如下:

#include

#include

#include

#include

usingnamespacestd;

//初始化预测分析表

stringaction[12][6]={

{"s5","error","error","s4","error","error"},

{"error","s6","error","error","error","acc"},

{"error","r2","s7","error","r2","r2"},

{"error","r4","r4","error","r4","r4"},

{"s5","error","error","s4","error","error"},

{"error","r6","r6","error","r6","r6"},

{"s5","error","error","s4","error","error"},

{"s5","error","error","s4","error","error"},

{"error","s6","error","error","s11","error"},

{"error","r1","r7","error","r1","r1"},

{"error","r3","r3","error","r3","r3"},

{"error","r5","r5","error","r5","r5"}

};

stringgo[12][3]={

{"1","2","3"},

{"error","error","error"},

{"error","error","error"},

{"error","error","error"},

{"8","2","3"},

{"error","error","error"},

{"error","9","3"},

{"error","error","10"},

{"error","error","error"},

{"error","error","error"},

{"error","error","error"},

{"error","error","error"},

};

charVt[6]={'i','+','*','(',')','#'};//终结符表

stringLR[6]={"E->E+T","E->T","T->T*F","T->F","F->(E)","F->i"};//LR文法

stackS;//状态栈

stackX;//符号栈

charinput[10];//输入字符

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

inti;

stringstr="";

for(intj=0;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]!

='#';j++)

cout<

cout<

}

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

{

for(intj=i;c[j-1]!

='#';j++)

cout<

cout<<'\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班"<

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

"<

cin>>input;

cout<<"您输入的字符串为:

";

preview(input);

X.push('#');

S.push(0);

cout<<"步骤"<<'\t'<<"状态栈"<<'\t'<<"符号栈"<<'\t'<<"输入串"<<'\t'<<"动作"<

cout<

print(point,input);

cout<<"初始化"<

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++;

cout<

print(point,input);

cout<

'<<"移进"<

}

elseif(str1[0]=='r'){//**********归约动作

n=num(str1);

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;

str3=str3+ch2;

}

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

{

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

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

str3=str3+ch2;

}

cout<

print(point,input);

cout<

'<

}

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

elseif(str1=="error"){

cout<<"Error!

\n"<<"程序错误,分析结束!

"<

flag=false;

}

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

当前位置:首页 > 表格模板

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

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