实验1 词法分析器优选.docx
《实验1 词法分析器优选.docx》由会员分享,可在线阅读,更多相关《实验1 词法分析器优选.docx(11页珍藏版)》请在冰豆网上搜索。
![实验1 词法分析器优选.docx](https://file1.bdocx.com/fileroot1/2023-1/14/154da258-4961-437d-85cd-3ca593aaf4c8/154da258-4961-437d-85cd-3ca593aaf4c81.gif)
实验实验1词法分析器优选词法分析器优选青岛理工大学实验报告实验课程:
编译原理实验日期:
2014年5月28日交报告日期:
2014年6月4日成绩:
实验地点:
现代教育技术中心101(计算机实验室)计算机工程学院,计算机科学与技术专业,班级:
计算113实验指导教师:
批阅教师:
同组学生姓名学号一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。
二、实验要求1.待分析的简单语言的词法1)关键字:
beginifthenwhiledoend所有关键字都是小写。
2)运算符和界符:
:
=+*/=;()#3)其他单词是标识符(ID)和整型常数(NUM),通过以下正规式定义:
ID=letter(letter|digit)*NUM=digitdigit*4)空格由空白、制表符和换行符组成。
空格一般用来分隔ID、NUM,运算符、界符和关键字,词法分析阶段通常被忽略。
2.各种单词符号对应的种别码单词符号种别码单词符号种别码begin1long21if2end22else3letter(letter|digit)*23then4digitdigit*24while5*25do6/26for7+27switch8-28case9:
29until10:
=30break1131goto1233constant13=34return14=37float16=38double17;39string18(40char19)41short20#003.词法分析程序的功能输入:
所给文法的源程序字符串。
输出:
二元组(syn,token或sum)构成的序列。
其中:
syn为单词种别码;token为存放的单词自身字符串;sum为常数。
例如:
对源程序beginx:
=9;ifx0thenx:
=2*x+1/3;end#经词法分析后输出如下序列:
(1,beigin)(10,x)(18,:
=)(11,9)(26,;)(2,if).三、算法思想1.主程序示意图主程序示意图如下所示:
其中初值包括如下两个方面。
1)关键字表的初值。
关键字作为特殊标识符处理,把它们预先安排在关键字表,当扫描程序识别出标识符时,查关键字表。
若查到匹配的单词,则该单词为关键字,否则为一般标识符。
关键字表作为一个字符串数组,其描述如下:
char*rwtab22=begin,if,else,then,while,do,for,switch,case,until,break,goto,constant,return,int,float,double,string,char,short,long,end;2)程序中的主要变量为syn,token和sum。
2.扫描子程序的算法思想首先设置3个变量:
token用于存放构成单词符号的字符串;sum用于存放整型单词;syn用于存放单词符号的种别码。
3.词法分析程序流程图四、结果分析及讨论1.正确输入演示输入测试语句:
begininti=12;if(i=12)y=1;elsez=1;end#运行结果如下所示:
分析:
测试语句中不存在无法识别的字符,运行正确。
2.错误输入输入测试语句:
begindox=;while(z=$);end#运行结果如下:
分析:
测试语句中存在无法识别的符号、$,因此出现报错提示,提示中将显示无法识别的符号所在行号。
五、总结通过此次实验,使我们了解到如何设计、编制并调试词法分析程序。
在实验的过程中加深了对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理;能够根据识别语言单词的状态转换图,使用某种高级语言直接编写词法分析程序。
六、源程序代码#include#include#includecharprog80,token8;charch;intsyn,p,m=0,n,row=0,sum=0;char*rwtab22=begin,if,else,then,while,do,for,switch,case,until,break,goto,constant,return,int,float,double,string,char,short,long,end;voidscaner()for(n=0;n=a&ch=A&ch=0&ch=a&ch=A&ch=Z)tokenm+=ch;ch=progp+;tokenm+=0;p-;syn=23;for(n=0;n=0&ch=0&ch32767)/数据范围越界syn=-1;elseswitch(ch)case)/符号:
syn=34;tokenm+=ch;elseif(ch=)/符号:
=syn=35;tokenm+=ch;else/符号:
:
m=0;tokenm+=ch;ch=progp+;if(ch=)/符号:
=syn=37;tokenm+=ch;else/符号:
syn=38;p-;break;case:
m=0;tokenm+=ch;ch=progp+;if(ch=)/符号:
:
=syn=31;tokenm+=ch;else/符号:
:
syn=30;p-;break;case*:
syn=26;token0=ch;break;/符号:
*case/:
syn=27;token0=ch;break;/符号:
/case+:
syn=28;token0=ch;break;/符号:
+case-:
syn=29;token0=ch;break;/符号:
-case=:
syn=38;token0=ch;break;/符号:
=case;:
syn=39;token0=ch;break;/符号:
;case(:
syn=40;token0=ch;break;/符号:
(case):
syn=41;token0=ch;break;/符号:
)case#:
syn=00;token0=ch;break;/符号:
#casen:
syn=-2;break;/换行操作,修改行数default:
syn=-1;break;/无法识别,报错voidmain()coutendl;cout*endl;cout1.ANALYSISOFSTRINGendl;cout2.EXITTHEPROGEAMendl;cout*endl;intchoose;coutPleaseenteryourchoice:
endl;scanf(%d,&choose);if(choose=1)/根据用户选择进行操作p=0;row=1;cout-endl;coutPleaseinputastringlikebegin*end#:
endl;docin.get(ch);progp+=ch;while(ch!
=#);p=0;cout-endl;coutTheanalysisprocessisasfollows:
endl;do/对用户输入字符串进行分析scaner();switch(syn)/数字输出:
(种别码,常数)case24:
cout(syn,sum)endl;break;/报错输出:
输出错误行数case-1:
coutErrorinrowrow!
endl;break;case-2:
row=row+;break;/其他输出:
(种别码,单词符号)default:
cout(syn,token)endl;break;while(syn!
=0);coutAnalysisoftheendendl;main();最新文件-仅供参考-已改成word文本-方便更改