《编译原理》词法分析实验报告模板课程上机Word文档下载推荐.docx
- 文档编号:17340809
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:15
- 大小:57.25KB
《编译原理》词法分析实验报告模板课程上机Word文档下载推荐.docx
《《编译原理》词法分析实验报告模板课程上机Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《编译原理》词法分析实验报告模板课程上机Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
用来表示各种名字,如变量等。
常数:
常数的类型有整型,实型等。
运算符:
算术运算符,关系运算符,逻辑运算符。
界限符:
逗号,分号等。
(3)实验步骤:
1、确定词法分析器的接口关系;
2、设计算法参考教材图2.5。
4.实验准备:
1:
pc机一台;
2:
VC++编译器
5.实验过程:
1,分析问题
2,算法步骤:
:
将文件中每行读入的字符串存入数组buffer[100],不跳过空格;
利用构造函数传递数组,和每行的长度length;
调用成员函数scan,i=0,while(i<
length)开始检测buffer的字符;
if(isletter(),接收完成后比较是否为关键字,不是则将其存入标示符id[50][10]中;
elseif(isdigit()),接收完成后存入cst[50][10]中;
elseif为界符,比较符,运算符,输出对应的二元编码;
接受完毕,输出id[50][10]--标示符,cst[50][10]--常数,列表;
3:
程序代码
#include<
iostream.h>
fstream.h>
string.h>
intm=0;
intn=0;
intx[50],y[50];
//存放对应常数表和字母表每列的长度。
char*reservechar[]={"
PROGRAM"
"
CONST"
VAR"
INTEGER"
LONG"
PROCEDURE"
"
IF"
THEN"
WHILE"
DO"
READ"
WRITE"
BEGIN"
END"
ODD"
};
//指针数组地址每次加1读取下一个字符串
//关键字表
charid[50][10];
//符号表
charcst[50][10];
//常数表
classScanner
{
private:
inti,j;
//指针
intlength;
charch,buffer[100],strtoken[20];
public:
Scanner(charstr[],intn);
//构造函数
intisdigit();
//判断是否整数
intisletter();
//首字母的判断
intreserve();
//对stroken进行关键字表的查找,返回其编码值
intinsertid();
//将stroken中的标识符插入符号表,返回在符号表中的位置
intinsertconst();
//将stroken中的常数插入常数表,返回在常数表中的位置
voidgetchar();
//将下一输入字符读到ch中,指针后移一字符位置
voidgetbc();
//保证ch是一个非空白字符
voidconcat();
//将ch连接到字符串stroken的末尾
voidretract();
//置ch为空白字符,指针前移一字符位置
voidscan();
Scanner:
:
Scanner(charstr[],intn)//构造函数
strcpy(buffer,str);
length=n;
i=j=0;
}
intScanner:
isdigit()//判断是否整数
if(ch>
='
0'
&
&
ch<
9'
)
return1;
else
return0;
isletter()//首字母的判断
if((ch>
a'
z'
)||(ch>
A'
Z'
))
voidScanner:
getchar()//将下一输入字符读到ch中,指针后移一字符位置
ch=buffer[i];
i++;
getbc()//保证ch是一个非空白字符
while(ch=='
'
getchar();
concat()//将ch连接到字符串stroken的末尾
strtoken[j]=ch;
j++;
retract()//置ch为空白字符,指针前移一字符位置
i--;
reserve()//对stroken进行关键字表的查找,返回其编码值
inti,flag=0;
for(i=0;
i<
15;
i++)
{
if((strncmp(reservechar[i],strupr(strtoken),j)==0)&
(j!
=1))//比较出错第一个interger和i无法区分
flag=1;
break;
}
if(flag==1)returni+1;
elsereturn0;
insertid()//将stroken中的标识符插入符号表,返回在符号表中的位置
for(inta=0;
a<
j;
a++)
id[m][a]=strtoken[a];
x[m]=j;
m++;
returnm;
insertconst()//将stroken中的常数插入常数表,返回在常数表中的位置
for(inti=0;
cst[n][i]=strtoken[i];
y[n]=j;
n++;
returnn;
scan()
while(i<
length)
j=0;
//自动清0,让strtoken重置
intcode,value;
//{ch=buffer[i];
}
getbc();
//{while(ch=='
)getchar();
if(isletter())//如果打头的是字母
while(isletter()||isdigit())
concat();
//将ch连接到字符串stroken的末尾
retract();
//{i--;
code=reserve();
//检测是否是关键字
if(code==0)//如果扫描到的是标识符
value=insertid();
cout<
<
"
字母位置,"
value<
行>
'
\n'
;
//表示字母所在数组的位置
elsecout<
code<
关键字>
//如果扫描到的是关键字
elseif(isdigit())//如果打头的是数字
while(isdigit())
value=insertconst();
数字位置,"
elseif(ch=='
+'
16__+,*>
-'
17__-,*>
*'
18--*,*>
/'
19--/,*>
20--=,*>
if(ch=='
>
(21--<
*)"
(23--<
=,*)"
(22--<
(25-->
(24-->
.'
26--.,*>
'
27--,,*>
28--;
*>
30--:
=,*>
29--:
('
31--(,*>
)'
32--),*>
出错"
voidmain(void)
fstreamfile;
file.open("
D:
\\pl.txt"
ios:
in||ios:
nocreate);
//以只读方式打开
file.unsetf(ios:
skipws);
//不跳过文本中的空格
charbuffer[100];
//缓冲区定义
扫描结果如下所示"
while(file.getline(buffer,100))//while每次接收一行字符。
ScannerSS(buffer,strlen(buffer));
SS.scan();
标识符表如下:
\n"
编号\t"
值\n"
m;
i+1<
\t'
for(intj=0;
j<
x[i];
j++)
id[i][j];
常数表如下:
n;
y[i];
cst[i][j];
4:
\\pl.txt文件内容
varn,i,j,num,s:
integer;
a:
array[0..maxint]ofinteger;
begin
readln(n);
fori:
=1tondo
read(a[i]);
s:
=0;
begain
end.
writeln(s);
End.
5:
程序运行结果
6:
校验试验结果正确。
6.实验总结:
词法分析程序的设计思路比较清晰,但是对于其中实现的细节还不是很熟练,比如C++文件的读取操作,string函数的使用,二维数组的使用,以及函数调用过程中变量值的改变等等。
经过自己精心修改,终于初步完成了词法的分析程序,其中可能还存在不足,希望自己能够逐渐掌握程序设计的脉路。
说明:
1.实验名称、实验目的、实验内容、实验要求由教师确定,实验前由教师事先填好,然后作为实验报告模版供学生使用;
2.实验准备由学生在实验或上机之前填写,教师应该在实验前检查;
3.实验过程由学生记录实验的过程,包括操作过程、遇到哪些问题以及如何解决等;
4.实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;
5.源程序、代码、具体语句等,若表格空间不足时可作为附录另外附页。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 编译 原理 词法 分析 实验 报告 模板 课程 上机
![提示](https://static.bdocx.com/images/bang_tan.gif)