词法分析器的构造南邮201编译原理试验一报告Word下载.docx
- 文档编号:16259392
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:12
- 大小:65.44KB
词法分析器的构造南邮201编译原理试验一报告Word下载.docx
《词法分析器的构造南邮201编译原理试验一报告Word下载.docx》由会员分享,可在线阅读,更多相关《词法分析器的构造南邮201编译原理试验一报告Word下载.docx(12页珍藏版)》请在冰豆网上搜索。
文本内谷为待分析的类C语言程序。
、实验环境(实验设备)
硬件:
计算机
软件:
VisualC++6.0
二、实验原理及内容
1、实验内容:
设计并实现一个词法分析器,实现对指定位置的类C语言源程序文本文
件的读取,并能够对该源程序中的所有单词进行分类,指出其所属类型,实现简单的词法分析操作。
例如下面为一段C语言源程序:
main(){
inta,b;
a=10;
b=a+20;
}
要求输出如下:
(2,'
main'
)
(5,'
('
(5,'
)'
(5
(1
(2
(4
(3
2、
'
{'
int'
a'
b'
;
'
='
10'
+'
20'
}'
实验原理状态转换图
3、实验代码:
实验代码:
#include<
string.h>
#inelude<
iostream.h>
fstream>
#include<
stdlib.h>
#include<
stdio.h>
ctype.h>
structChar{//创建一个结构用于存贮关键字
chara[15];
};
typedefstructCharCH;
//定义关键字
CHkeyWord[67]={"
auto"
"
break"
case"
cout"
cin"
char"
const"
continue"
default"
"
do"
double"
else"
enum"
endl"
extern"
float"
for"
goto"
if"
main"
include"
int"
long"
register"
return"
short"
signed"
sizeof"
static"
"
string"
struct"
switch"
typedef"
union"
unsigned"
void"
stdio"
while"
cin"
."
catch"
calss"
ctype"
stdlib"
fstream"
export"
iostream"
false"
friend"
inline"
mutable"
namespace"
new"
operator"
private"
protected"
public"
static_cast"
template"
this"
throw"
true"
try"
typename"
using"
virtual"
asm"
};
//检测是否为数字,是返回true,否则返回false
boollsDigit(charA){if(A>
0'
&
&
A<
=9)returntrue;
else
returnfalse;
//检测是否为字符,是则返回true,否则返回false
boolIsLetter(charch){
if((ch>
A'
ch<
Z'
)||(ch>
z'
))
returntrue;
//检测是否为分隔符,是则返回true,否则返回false
boolIsSeparator(charch){
if(ch=='
||ch=='
||ch=='
;
.'
||ch=='
:
||ch==Y'
\"
['
||ch==T||ch==#||ch=='
_'
)returntrue;
//检测是否为关键字,是则返回true,否则返回false
boollsKeyWord(char*a){
inti=0;
for(i;
i<
67;
i++)
if(strcmp(a,keyWord[i].a)==0){
//预处理去掉注释、换行、空格等
voidScanner(chars[],chara[]){
inti=0,j=0,k=strlen(s);
for(i;
k;
i++){
if(s[i]=='
/'
s[i+1]=='
){
do{
}while(s[i]!
='
\n'
);
i--;
elseif(s[i]=='
s[i+1]=='
*'
){do{
i++;
||s[i-1]!
continue;
\t'
||s[i]=='
?
a[j++]='
a[j++]=s[i];
<
endl;
"
coutvv"
\n系统经过预处理后的输出(去掉注释和换行):
cout<
a<
\n\n"
系统经过预处理后的输出(去掉注释、换行、空格等)
for(i=0;
i<
strlen(a);
i++){
if(a[i]=='
)continue;
cout<
a[i];
cout«
endl«
voidHandle(chars[]){//词法分析
charch;
for(intj=0;
j<
strlen(s);
j++){
charword[20]={'
\0'
ch=s[j];
if(ch=='
elseif(lsLetter(ch)){do{
word[i++]=ch;
ch=s[++j];
}while(IsLetter(ch)||lsDigit(ch)||ch=='
j--;
word[i]='
if(lsKeyWord(word))
(1,'
word<
)"
v"
(2,'
vvwordvv"
vvendl;
elseif(lsDigit(ch)){
}while(IsDigit(ch));
j--;
(3,'
elseif(lsSeparator(ch)){
word[0]=ch;
else{
if(word[0]=='
||word[0]=='
-'
>
v'
||word[0]=='
|'
){if(s[j+1]==word[0]||s[j+1]=='
word[1]=s[++j];
(4,'
}else
elseif(word[0]=='
!
%'
||word[0]==z){if(s[j+1]=='
elseif(word[0]=='
\\'
if(s[j+1]=='
n'
||s[j+1]=='
t'
||s[j+i]=='
||s[j+1]=='
){word[1]=s[++j];
―U
(无法识别字符,'
endl;
}
}cout«
\n"
intmain(){
inti;
charb=32,ch;
FILE*fp;
i=0;
chars[10000];
chara[10000]={'
fp=fopen("
code.txt"
rb+"
if(fp==NULL){cout<
Cannotcreatefile"
exit(0);
fseek(fp,0,2);
Pleaseinputyoucode(endwithtwo'
):
«
do{ch=getchar();
s[i++]=ch;
if(ch=='
||ch=='
)for(intj=0;
4;
j++)fputc(b,fp);
fputc(ch,fp);
}while(s[i-1]!
||s[i-2]!
s[i]='
Scanner(s,a);
词法分析如下:
Handle(a);
fclose(fp);
}while(true);
return0;
、实验测试和截图
(1)、测试一截图
输入代码:
Pleaseinputyoucode'
ieoidwithtwo^T7):
intmainO
(
int辺,b;
//定义a・b
d+=10.
b-a十12.舛求b的值*/
}?
输出结果:
系统经HfOl理后的输出(去掉注释和换行):
intmainO{inta,b;
a+-10;
b-a+12;
return0;
.系统经ii预处理冶的输岀〔去掉注释、换行、空格等):
intminO{in坦b;
a+=10;
b-a+12!
returnO!
]
词袪分析如下:
(1,Jint'
(1,Jmair?
)(5,JC)(和门(5/f)(1;
int1〕⑵’『)⑸;
)(2f'
b'
)E;
)伦Ja)(4,7匸)(3,'
10'
)⑸’:
1、⑵'
b1)(4,,J、(2/『)(4,1匸)<
3,'
挖)
(1,?
return7)(3,'
0’)(5/r)(5,丁)
(2)测试二截图
Pleaseinputyoucode(endwithtwo*?
do[
ch=getchar(J;
s[i++]-ch;
if(ch==1\n|Ich==3)for(intj=0;
j++)fputc(b,fp);
fputc(ch,ip);
用Mle(s[i-l]!
=?
7||s[i-2]!
=J
系统经过预处理后的输出(±
4f注释和换行):
dnCch=setcha.rO:
s[i+*]=ch;
if(ch==1\n"
||ch==
|\t*)fcrLintj=U;
j€4bj++)fputc(b^fp);
fputc(ch,fp);
}wiiil日(s[iT]!
=?
1||s[i-2]I=?
?
系统经过预处理后的输出(去掉注釋■换了亍、空梅等)=
do呂etchar();
s[i■*-+■]-ch;
iftch==,\n||ch-=,\t?
or(inij=0;
j<
4;
j-h-)fpoitc(b,fp):
fputctch,fp):
}flhile(s[i^l]\-rr\|s[i-2]!
=,,):
词法分析如T:
(1/dD1)(5/C)
(2,'
ehJ)
任,』)
(2,11getchar?
)(5/(!
)(5QJ(5/;
5)Qd)
(5「['
)(2/iJ
(4,1卄'
(妇」)⑵’山)
(5,―)
⑸’f)
(2?
T川)
(5,…)他’\n)
(5,…)
四、实验小结(包括问题和解决方法、心得体会、意见与建议等)
\n)、
在本实验中,我进一步学习了如何运用输入输出流,对文件进行读写操作。
了解了什么是词法分析,熟悉了词法分析器的构造,更加深入了对词法分析原理的理解。
程序将字符分为五类:
保留字、标识符、整数、运算符、分隔符,对使用者输入的程序代码进行识别、分析和编码,简单分析了词法。
实验过程中开始时由于对换行符(制表符(\t)、和注释等处理不好导致实验失败,后来预处理时讲它们全部换成空格符和把注释去掉才成功。
五、指导教师评语
成绩
批阅人
日期
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 词法 分析器 构造 201 编译 原理 试验 报告