完整版基于LEX的词法分析器实验报告.docx
- 文档编号:16925144
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:11
- 大小:113.33KB
完整版基于LEX的词法分析器实验报告.docx
《完整版基于LEX的词法分析器实验报告.docx》由会员分享,可在线阅读,更多相关《完整版基于LEX的词法分析器实验报告.docx(11页珍藏版)》请在冰点文库上搜索。
完整版基于LEX的词法分析器实验报告
编译原理课程实验报告
实验名称:
基于LEX的词法分析器
学生姓名:
赵宁
学生学号:
2013020109
、实验目标
自动构造C-语言的的词法分析器,要求能够掌握编译原理的基本理论,,理解编译程序的基本结构,掌握编译各阶段的基本理论和技术,掌握编译程序设计的基本理论和步骤.,增强编写和调试高级语言源程序的能力,掌握词法分析的基本概念和实现方法,熟悉C-语言的各种Token。
二、实验原理及方法
Lex输入文件由3个部分组成:
定义集(definition),规则集(rule)和辅助程序集(auxiliaryroutine)或用户程序集(userroutine)。
这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下
{definitions}
%%
{rules}
%%
{auxiliaryroutines}
而且第一部分用“%{”和“%}”括起来。
第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。
定义正则表达式如下
ID=letterletter*
NUM=digitdigit*
Letter=a|…|z|A|…|Z
Digit=0|…|9
Keyword=else|if|int|return|void|while
Specialsymbol=+|-|*|/|<|<=|>|>=|==|!
=|=|;|,|(|)|[|]|{|}|/*|*/
Whitespace=“”
Enter=\n
在lex中的构造
letter[A-Za-z]
digit[0-9]id({letter}|[_])({letter}|{digit}|[_])error_id({digit})+({letter})+
num{digit}+whitespace[\t]+enter[\n]+
构造DFA图
symbols
Other
keyword
Specialsymbol
Keyworti'*-
三、实验内容
Win7下lex与yacc的安装配置;
利用ParserGenarator的词法分析器构造
四、实验步骤
1)Win7下lex与yacc的安装配置
1、lex的安装
首先,下载下载flex和bison.
其次,安装完毕后,将c:
\gnuwin32\lib里面的libfl.a和liby.a复制到C:
\MinGW\lib里面再者,设置环境变量。
最后,测试安装是否成功。
2、使用lex生成此法分析器:
新建文本文件,更改名称为a.lex,敲入下面代码■------词法分析器的源代码
%{
intwordCount=0;
intnumcount=0;
%}
chars[A-Za-z\_\'\.\"]numbers([0-9])+delim[""\n\t]whitespace{delim}+words{chars}+
%%
while{ECHO;printf("%s\n",yytext);}
{words}{wordCount++;
/*increasethewordcountbyone*/}
{whitespace}{/*donothing*/}
([0-9])+{numcount++;/*onemaywanttoaddsomeprocessinghere*/}
%%
voidmain()
{
printf("ok1\n");
yylex();/*starttheanalysis*/
printf("ok2\n");
printf("Noofwords:
%d\nnumber:
%d\n",wordCount,numcount);
return0;
}
intyywrap()
{
return1;
}
2、新建文本文件,更名为b.c,敲入下面代码此为输入源代码
asdasdf23q
a1
b2
!
#@
while
3、打开菜单,运行,输入cmd。
输入:
cd文件夹路径
输入:
flexa.lex回车后生成一个lex.yy.c文件
输入:
gcc-oalex.yy.c-lfl回车后生成一个a.exe文件,现在我们已得到了一个简易的词法分析器,下面就是运用次词法分析器,分析下b.c文件
输入:
a.exe
2)利用ParserGenarator的词法分析器构造在Lex中的规则定义构造定义识别保留字规则
"int"|"else"|"return"|"void"|"if"|"while"
{Upper(yytext,yyleng);
printf("%d行",lineno);
保留字
printf("%sreservedword\n",yytext);}//定义识别数字规则
{num}
数字
|"="|"/*"|"*
{printf("%d行",lineno);printf("%sNUM\n",yytext);}//定义识别专用符号规则
","|";"|"("|")"|"{"|"}"|"*"|"/"|"+"|"-"|">"|"<"|">="|"<="|"=="|"!
="/"{printf("%d行",lineno);
printf("%sspecialsymbol\n",yytext);}//特殊符号
定义识别标识符规则
{id}
标识符
{printf("%d行",lineno);
printf("%sID\n",yytext);}//
定义识别错误的字符串规则当开头为数字的后面为字母的字符串时,是错误的标识符。
{error_id}
{printf("error:
%s\n",yytext);}//以数字开头的字符自动报错定义忽略空格规则
{whitespace}{/*skipwhitespace*/}//忽略空格定义忽略回车规则
{enter}
{lineno++;}//遇到回车自动加行号忽略辅助程序集中包括
主函数main()和辅助函数toupper()。
程序代码实现
Lex代码
//定义集,包括头文件和变量定义
%{
#include
#include
#include
#include
intlineno=1;//定义行号
%}
//定义正则表达式letter[A-Za-z]//字母digit[0-9]//数字id({letter}|[_])({letter}|{digit}|[_])*error_id({digit})+({letter})+num{digit}+whitespace[\t]+enter[\n]+//定义识别规则
//
//
//
//
开头为字母的标识符开头为数字的错误标识符数字集合
//
空格
回车
%%
//识别保留字
"int"|"else"|"return"|"void"|"if"|"while"
{Upper(yytext,yyleng);
printf("%d行",lineno);//打印行号
printf("%sreservedword\n",yytext);}//输出保留字
//识别数字
{num}
{printf("%d行",lineno);//打印行号printf("%sNUM\n",yytext);}//输出数字
//识别专用符号
","|";"|"("|")"|"{"|"}"|"*"|"/"|"+"|"-"|">"|"<"|">="
{printf("%d行",lineno);//打印行号
printf("%sspecialsymbol\n",yytext);}//输出特殊符号//识别标识符
{id}
{printf("%d行",lineno);//打印行号
printf("%sID\n",yytext);}//打印标识符
//识别错误的标识符
{error_id}
{printf("%d行",lineno);
printf("error:
%s\n",yytext);}//以数字开头的字符自动报错//识别空格
{whitespace}
{/*skipwhitespace*/}//忽略空格//识别回车
{enter}
{lineno++;}//遇到回车自动加行号忽略
%%
//转换大小写
Upper(char*s,intl){
inti;
for(i=0;i s[i]=toupper(s[i]); } }//将保留字变为大写 //主函数 main(void) { //定义输入文件名变量 charinfilename[400]; printf("输入文件名: "); scanf("%s",&infilename); yyin=fopen(infilename,"r");〃读取文件 printf("开始词法分析: \n"); returnyylex(); } 五、测试过程及结果 (1)Win7下lex与yacc的安装配置 测试安装是否成功,测试结果如图所示,当前文件夹多了两个文件,安装成功: (2)利用ParserGenarator的词法分析器构造 E: \>cdtest Es\te®t>flexa.lex >gcc-oaIsx-yy.c-If1 a.lex: 4712: uarningf-nonevilineatendofflie E: Xtest>a-exe丈h.u》bl・txt E: Xteslt 文件⑴赫閃查看叩)收味血工具⑴帮肋00 Q后退.…丁|按索文件夹 地址伺|LjEAtctt 圭能肯这T文件删这T文件复制煜亍文件捋富r: O牛友布到Veb 六、实验总结: 通过本实验,我了解了Lex的用法,并构造了ParserGenarator编译器。 成功将实例程序中的Token识别出来,并记录其value值。 在学习的过程中,感觉理解起来比较困难,所以操作过程中出现了很多错误。 但是,最终在老师和同学的帮助下完成了此次实验。 指导教师评阅成绩: 指导教师评阅意见: 提交报告时间: 2015年12月23日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整版 基于 LEX 词法 分析器 实验 报告