编译原理词法分析器.docx
- 文档编号:20237008
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:11
- 大小:34.06KB
编译原理词法分析器.docx
《编译原理词法分析器.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析器.docx(11页珍藏版)》请在冰豆网上搜索。
编译原理词法分析器
目录
一:
【开发语言及实现平台或实验环境】2
二:
【实验目的】2
三:
【实验内容】2
四:
【实验要求】2
(1)待分析的简单语言的词法2
(2)各种单词符号对应的种别编码3
(3)词法分析程序的功能3
五:
【实验步骤】3
(1)根据图1.1构建主程序框架3
(2)关键字表置初值4
(3)编写扫描子程序4
(4)结果分析:
9
六:
【总结】9
词法分析器
一:
【开发语言及实现平台或实验环境】
C/C++/C#/Java
MicrosoftVisualStudio6.0/MicrosoftVisualStudio.NET2003-2005/Java
二:
【实验目的】
(1)理解词法分析在编译程序中的作用
(2)加深对有穷自动机模型的理解
(3)掌握词法分析程序的实现方法和技术
三:
【实验内容】
对一个简单语言的子集编制一个一遍扫描的词法分析程序。
四:
【实验要求】
(1)待分析的简单语言的词法
1)关键字
beginifthenwhiledoend
2)运算符和界符
:
=+-*/<<=>>=<>=;()#
3)其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*
NUM=digitdigit*
4)空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。
(2)各种单词符号对应的种别编码
单词符号
种别码
单词符号
种别码
begin
1
:
17
if
2
:
=
18
then
3
<
20
while
4
<>
21
do
5
<=
22
end
6
>
23
letter(letter|digit)*
10
>=
24
digitdigit*
11
=
25
+
13
;
26
-
14
(
27
*
15
)
28
/
16
#
0
(3)词法分析程序的功能
输入:
所给文法的源程序字符串
输出:
二元组(syn,token或sum)构成的序列。
syn为单词种别码;
token为存放的单词自身字符串;
sum为整形常数。
例如:
对源程序beginx:
=9;ifx>0thenx:
=2*x+1/3;end#经词法分析后输出如下序列:
(1,begin)(10,’x’)(18,:
=)(11,9)(26,;)(2,if)……
五:
【实验步骤】
(1)根据图1.1构建主程序框架
图1.1词法分析主程序示意图
代码提示:
main()
{
p=0;
printf(“\npleaseinputstring:
\n”);
do{
输入源程序字符串,送到缓冲区prog[p++]中
}
while(ch!
=’#’);
p=0;
do
{
scanner();//调用扫描子程序
switch(syn)
{
case11:
输出(数的二元组);break;
case–1:
输出(错误);break;
default:
输出(其他单词二元组);
}
}while(syn!
=0);
}
(2)关键字表置初值
关键字作为特殊标识符处理,把它们预先安排在一张表格中(关键字表),当扫描程序识别标识符时,查关键字表。
如能查到匹配的单词,则为关键字,否则为一般标识符。
(3)编写扫描子程序
代码如下:
#include
#include
#include
charprog[80],token[8];
charch;
intsyn,p,m=0,n,row,sum=0;
char*rwtab[6]={"begin","if","then","while","do","end"};
voidscaner()
{
for(n=0;n<8;n++)token[n]=NULL;
ch=prog[p++];
while(ch=='')
{
ch=prog[p];
p++;
}
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
m=0;
while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
elseif((ch>='0'&&ch<='9'))
{
{
sum=0;
while((ch>='0'&&ch<='9'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
}
p--;
syn=11;
if(sum>32767)
syn=-1;
}
elseswitch(ch)
{
case'<':
m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
elseif(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case'>':
m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case':
':
m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
break;
case'*':
syn=13;token[0]=ch;break;
case'/':
syn=14;token[0]=ch;break;
case'+':
syn=15;token[0]=ch;break;
case'-':
syn=16;token[0]=ch;break;
case'=':
syn=25;token[0]=ch;break;
case';':
syn=26;token[0]=ch;break;
case'(':
syn=27;token[0]=ch;break;
case')':
syn=28;token[0]=ch;break;
case'#':
syn=0;token[0]=ch;break;
case'\n':
syn=-2;break;
default:
syn=-1;break;
}
}
voidmain()
{
p=0;
row=1;
cout<<"Pleaseinputstring:
"< do { cin.get(ch); prog[p++]=ch; } while(ch! ='#'); p=0; do { scaner(); switch(syn) { case11: cout<<"("< case-1: cout<<"Errorinrow"< "< case-2: row=row++;break; default: cout<<"("< } } while(syn! =0); } (4)结果分析: (1)给定源程序 beginx: =5;ifx>0thenx: =2*x+2/3;end# 输出结果: 图5-1 六: 【总结】 词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 通过本试验的完成,更加加深了对词法分析原理的理解。 七: 【参考文献】 1.胡伦骏、徐兰芳等,编译原理(第2版),电子工业出版社,246,2005.7 2.王雷、刘志成等,编译原理课程设计,机械工业出版社,138,2005.3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 词法 分析器