- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理 实验一 词法分析程序开发
集美大学计算机工程学院实验报告
课程:编译原理 指导教师:付永钢 实验成绩: 实验编号: 实验一 实验名称:词法分析程序开发 班级:计算1214 姓名: 学号: 上机实践日期:2014.11 上机实践时间: 4学时
一、实验目的掌握根据语言的词法规则构造识别其单词的有限自动机的方法;
4、深入理解词法分析程序自动生成原理。
二、实验环境
Windows7 x64、VC6.0
三、
词法分析是编译过程的第一阶段。它的任务就是对输入的字符串形式的源程序按顺序进行扫描,根据源程序的词法规则识别具有独立意义的单词(符号),并输出与其等价的Token序列。
有限自动机是描述程序设计语言单词构成的工具,而状态转换图是有限自动机的比较直观的描述方法。我们使用确定的有限状态自动机,简记为DFA。
PL/0的语言的词法分析器将要完成以下工作:
下面给出能够识别PL0语言中各类单词的DFA:
根据语言的词法规则构造出识别其单词的确定有限自动机DFA, 仅仅是词法分析程序的一个形式模型,距离词法分析程序的真正实现还有一定的距离。状态转换图的实现通常是直接转向法。直接转向法又称程序中心法,是把状态转换图看成一个流程图,从状态转换图的初态开始,对它的每一个状态结点都编一段相应的程序。四在命令行下执行命令flex解析自动生成lex.yy.c文件lex.yy.c,生成可执行文件lex.yy.exe对测试用例进行测试
2、根据DFA在C环境下构造词法分析器对测试用例进行测试
五、procedure divide;
var w;
begin
r := x; q := 0; w := y;
end
1、自动生成工具LEX测试:
2、C环境分析器测试:
六、实验小结
1、通过本次实验,对有限自动机及其应用有了进一步的了解,对词法分析程序的开发有了一定的认识;
2、第一次使用自动生成工具LEX,对LEX语法不熟悉,通过查阅网上资料,词法分析程序自动生成原理有了一定的认识,能够基本完成本实验的需求,同时对本课程的实际意义也有了全面的理解;
3、在通过C语言编写词法分析器的过程中,用二维数组构造分析表,但是不断出现栈溢出问题,后将分析表缩小,仅存保留字,对其他符号逐一判断,实现本实验要求词法分析器;
4、利用C语言构造词法分析器,考虑到分隔符问题,在本次实验中,仅考虑了‘\n’、‘\t’、空格、以及‘;’,凡不以这四个字符结束的串都被视为错误。
程序代码:
1、LEX:
digit [0-9]
letter [A-Za-z]
id ({letter}|[_])({letter}|{digit}|[_])*
%%
[ |\t|\n]+
var {printf(21,\%s\\n,yytext);}
if {printf(22,\%s\\n,yytext);}
then {printf(23,\%s\\n,yytext);}
else {printf(24,\%s\\n,yytext);}
while {printf(25,\%s\\n,yytext);}
for {printf(26,\%s\\n,yytext);}
begin {printf(27,\%s\\n,yytext);}
writeln {printf(28,\%s\\n,yytext);}
procedure {printf(29,\%s\\n,yytext);}
end {printf(30,\%s\\n,yytext);}
{id} {printf(1,\%s\\n,yytext);}
{digit}+ {printf(2,\%s\\n,yytext);}
+ {printf(3,\%s\\n,yytext);}
- {printf(4,\%s\\n,yytext);}
* {printf(5,\%s\\n,yytext);}
/ {printf(6,\%s\\n,yytext);}
= {printf(7,\%s\\n,yytext);}
{printf(8,\%s\\n,yytext);}
{printf(9,\%s\\n,yytext);}
{printf(10,\%s\\n,yytext);}
= {printf(11,\%s\\n,yytext);}
= {printf(12,\%s\\n,yytext);}
( {printf(13,\%s\\n,yytext);}
) {printf(14,\%s\\n,yytext);}
{ {printf(15,\%s\\n,yytext);}
} {printf(16,\%s\\n,yytext);}
; {printf(17,\%s\\n,yytext);}
, {printf(18,\%s\\n,yytext
文档评论(0)