合肥工业大学编译原理实验报告(完整代码版)x
时间:2020-10-13 12:44:38 来源:勤学考试网 本文已影响 人
计算机与信息学院
编译原理 实验报告
专业班级
学生姓名及学号 课程教学班号 任课教师 实验指导教师 实验地点
信息安全13-1班
马骏69
实验楼机房
2015?2016 学年第 二 学期
= (4
= (4 ,=)
实验1词法分析设计
、实验目的
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设 计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和 清楚的
理解,并能正确地、熟练地运用
、实验要求
1 、编程时注意编程风格:空行的使用、注释的使用、缩进的使用等。
2、 将标识符填写的相应符号表须提供给编译程序的以后各阶段使用。
3、 根据测试数据进行测试。测试实例应包括以下三个部分 :
全部合法的输入。
各种组合的非法输入。
由记号组成的句子。
4、词法分析程序设计要求输出形式
例:输入VC+语言的实例程序:
If i=0 the n n++;
a< = 3b %);
输出形式为:
类型
位置(行,列)
关键字
(1,
标识符
(1,
关系运算符
(1,
单词 二元序列
(单词种别,单词属性)
for (1,for )
1)
i ( 6,i )
2)
3) 12
0
(
5,0 )
常数
(1,4)
then
(
1 , then)
关键字
(1,5)
n
(6,n
)
标识符
( 1,6)
++
Error
Error
(1,7)
?
( 2, ; )
分界符
(1,
8)
a
(6,a )
标识符
(2,
1)
V =
(4,<=
)
关系运算符
( 2,2)
3b
Error
Error
(2,4)
%
Error
Error
(2,4)
)
(
2, ) )
分界符
(2,
5)
?
(
2, ; )
分界符
(2,
6)
、 实验内容
用 VC++/VB/JAVA 语言实现对 C 语言子集的源程序进行词法分析。通过
输
入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编 码及单
词符号自身值;若遇到错误则显示“ Error”,然后跳过错误部分继续显示 ;
同时
进行标识符登记符号表的管理。
以下是实现词法分析设计的主要工作:
1) 从源程序文件中读入字符。
2) 统计行数和列数用于错误单词的定位。
3)删除空格类字符,包括回车、制表符空格
(4) 按拼写单词,并用(内码,属性)二元式表示。(属性值——token的机内 表示)
(5) 如果发现错误则报告出错 7
(6) 根据需要是否填写标识符表供以后各阶段使用。
四、 实验步骤
1、 根据流程图编写出各个模块的源程序代码上机调试。
2、 编制好源程序后,设计若干用例对系统进行全面的上机测试, 并通过所设计 的词法分析程序;直至能够得到完全满意的结果。
3、 书写实验报告;实验报告正文的内容:
功能描述:该程序具有什么功能
程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数 之间的调用关系图。
详细的算法描述(程序总体执行流程图) 。
给出软件的测试方法和测试结果。
实验总结(设计的特点、不足、收获与体会)。
五、 实验截图
先创建文件
输入
If i=0 the n n++;
a<= 3b %);
六、核心代码
#in clude<iostream>
#in clude<stri ng>
#in clude<fstream>
#i nclude <sstream>
using n amespace std;
const char* salaryfile="";
const int max=40;
stri ng
id[max]={"do","e nd","for","if","pri ntf","sca nf","the n" ,"while"};
*D
*D sc- + documentz\§T^lS^^\DeD-Ljg\bisnyi2w2.ezce'
0
he
l+i*i4
1
HE
i+i*i4
E->TG
POP,PUSH(Gr>
2
nci
T->FS
pop,push(sp>
3
HN38F
F->i
POP,PUSH(i>
4
1*±*±1
GETNEXT(l)
b
flGG
s->$
POP,PUSHC$>
6
flG
G->+TG
POP,PUSH(Gr+>
BGI +
GETNEXTCI>
flGI
i*itt
T-JFS
POP,PUSHCGF>
ttCSF
i*itt
F->1
POP,PUSHCi>
19
ttGSi
GETNEXTCI>
11
ttGS
*itt
S->*FS
POP,PU£ll<SI^>
12
#GSF*
*itt
GETNEXTCI>
13
#GSF
iU
F->i
POPFPUSH<i>
14
ttGSi
m
GETNEXTCI>
1S
ttGS
t
s->5
FOP. PUSH
ttG
t
G->$
POP.PUSH<?>
17
tt
t
suces?ed! f!?
over!f!?
匚
to cvntiiu?
SetDlgltemText(IDC_EDIT2,s2);
*/
入栈
入栈"<<e ndl;
ctype;umber<<",状态"<<smarttable[i][j].number<<"
pp=pp+"ACTION[";
char buffer[max];
sprintf(buffer,"%d",i);
string s=buffer;
pp=pp+s;
pp=pp+",";
pp=pp+fu;
pp=pp+"]=S";
char buf[max];
sprintf(buf,"%d",smarttable[i][j].number); s=buf;
pp=pp+s;
pp=pp+", 状态 ";
pp=pp+s+"入栈"+hh;
}
if(checkstyle==3)
{
umbervv"入栈"<<e ndl;
char bf[max];
sprintf(bf,"%d",i);
string s=bf;
pp=pp+s;
pp=pp+","+endfureal[j]+")=";
char bfff[max];
sprintf(bfff,"%d",smarttable[i][j].number);
s=bfff;
pp=pp+s+" 入栈 "+hh;
}
(fu);
(smarttable[i][j].number);
umber];
umber+1<<": "<<l<<" 归约 ,GOTO("; pp=pp+"r";
int dd=smarttable[i][j].number+1;
char bfc[max];
sprintf(bfc,"%d",dd);
string ss=bfc;
pp=pp+ss+": "+l+" 归约 ,GOTO(";
char n;ction(0,5);
smarttable[0][3].action(0,4);
smarttable[0][6].action(3,1);
smarttable[0][7].action(3,2);
smarttable[0][8].action(3,3);
smarttable[1][1].action(0,6);
smarttable[1][5].action(2,0);
smarttable[2][1].action(1,1);
smarttable[2][2].action(0,7);
smarttable[2][4].action(1,1);
smarttable[2][5].action(1,1);
smarttable[3][1].action(1,3);
smarttable[3][2].action(1,3);
smarttable[3][4].action(1,3);
smarttable[3][5].action(1,3);
smarttable[4][0].action(0,5);
smarttable[4][3].action(0,4);
smarttable[4][6].action(3,8);
smarttable[4][7].action(3,2);
smarttable[4][8].action(3,3);
smarttable[5][1].action(1,5);
smarttable[5][2].action(1,5);
smarttable[5][4].action(1,5);
smarttable[5][5].action(1,5);
smarttable[6][0].action(0,5);
smarttable[6][3].action(0,4);
smarttable[6][7].action(3,9);
smarttable[6][8].action(3,3);
smarttable[7][0].action(0,5);
smarttable[7][3].action(0,4); smarttable[7][8].action(3,10); smarttable[8][1].action(0,6);
smarttable[8][4].action(0,11);
smarttable[9][1].action(1,0);
smarttable[9][2].action(0,7);
smarttable[9][4].action(1,0);
smarttable[9][5].action(1,0);
smarttable[10][1].action(1,2);
smarttable[10][2].action(1,2);
smarttable[10][4].action(1,2);
smarttable[10][5].action(1,2);
smarttable[11][1].action(1,4);
smarttable[11][2].action(1,4);
smarttable[11][4].action(1,4);
smarttable[11][5].action(1,4);
string enter=str;
int i;
int x;
stylebox st;
readybox ready;
for(i=0;i<();)
{
// cout<<" enter: "<<enter[i]<<"
"<<endl;
x=program(st,ready,enter[i],i,enter,1);
if(x==1)i++;
if(x==2)
{
// cout<<"Acc: 分析成功 "<<endl;
pp=pp+"Acc: 分析成功 "+hh; break;
}
if(x==4) break;
// cout<<endl;
// cout<<endl;
// pp=pp+hh;
}
cout<<pp;
// CDialog::OnOK();
}
七、实验总结
而且提高了编程能通过本次试验使我不仅对 LR(1) 分析法有了更深的了解, 力,希望在以后的学习中可以解决 LR(1) 中确定化的问题。
而且提高了编程能