编译原理 词法分析实验报告完整版可运行Word文件下载.docx
《编译原理 词法分析实验报告完整版可运行Word文件下载.docx》由会员分享,可在线阅读,更多相关《编译原理 词法分析实验报告完整版可运行Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
![编译原理 词法分析实验报告完整版可运行Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/16/9ef8f71b-269d-4ccd-b29e-edf39c67600b/9ef8f71b-269d-4ccd-b29e-edf39c67600b1.gif)
(2)掌握词法分析程序的作用。
3、实验要求
(1)对任给的一个C语言源程序,能够滤掉空格、回车换行符、tab键及注释。
(2)识别各类单词符号,如关键字、标识符、运算符、常数、界符,结果以二元式形式输出,并构造符号表。
(3)输出有词法错误的单词及所在行号。
(在此阶段只能识别有限的词法错误)
4、实验原理
根据扫描到的单词符号的第一个字符的种类,分别转到相应的程序进行处理。
这些程序的功能就是识别以相应字符开头的各类单词符号。
5、实验步骤
(1)根据C语言各类单词的正规式,构造能识别各类单词的状态转换图。
(2)根据状态转换图,构造识别各类单词的词法分析器。
6、状态转换图及词法分析程序
(1)状态转换图
否
能
是
否
是
(2)程序源代码
#include<
iostream>
#include<
string>
usingnamespacestd;
#defineMAX22
charch='
'
;
stringkey[15]={"
begin"
"
end"
if"
then"
else"
while"
write"
read"
"
do"
"
call"
const"
char"
until"
procedure"
repeat"
};
intIskey(stringc){//关键字判断
inti;
for(i=0;
i<
MAX;
i++){
if(key[i].compare(c)==0)return1;
}
return0;
}
intIsLetter(charc){//判断是否为字母
if(((c<
='
z'
)&
&
(c>
a'
))||((c<
Z'
A'
)))return1;
elsereturn0;
intIsDigit(charc){//判断是否为数字
if(c>
0'
c<
9'
)return1;
voidanalyse(FILE*fpin){
stringarr="
while((ch=fgetc(fpin))!
=EOF){
arr="
if(ch=='
||ch=='
\t'
\n'
){}
elseif(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)){
if((ch<
(ch>
))ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if(Iskey(arr)){cout<
<
arr<
\t$关键字"
endl;
}
elsecout<
\t$普通标识符"
elseif(IsDigit(ch)){
while(IsDigit(ch)||ch=='
.'
IsDigit(fgetc(fpin))){
cout<
\t$无符号实数"
elseswitch(ch){
case'
+'
:
-'
:
*'
/'
cout<
ch<
\t$运算符"
break;
('
)'
['
]'
'
'
{'
}'
\t$界符"
{ch=fgetc(fpin);
)cout<
="
else{cout<
}break;
case'
>
)cout<
\t$输入控制符"
elseif(ch=='
\t$输出控制符"
else{cout<
default:
\t$无法识别字符"
voidmain(){
charin_fn[30];
FILE*fpin;
请输入源文件名(包括路径和后缀名):
for(;
){
cin>
in_fn;
if((fpin=fopen(in_fn,"
r"
))!
=NULL)break;
文件路径错误!
\n********************分析如下*********************"
analyse(fpin);
fclose(fpin);
getchar();
7、测试及结果
8、心得
通过本次试验我对编译原理这门课程有了一种不一样的感觉,我发现在编写程序之前应该要有一个整体的规划,然后在考虑细节问题,不断地发现问题,修改程序,使之精益求精。
通过实验,我对词法分析有了更进一步的认识和了解,在实验中还遇到了许多问题,通过不断地解决遇到的问题,我的能力也得到了提高。
另外,编写代码时一定要有耐心,不怕错,只要有了这种精神什么困难都可以克服。
在实验过程中我遇到许多问题,衷心感谢在这过程中帮助我的老师和同学们,谢谢你们,我会更加努力学习这门课程,迎难而上,学好这门课程!