(完整版)基于LEX的词法分析器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理课程实验报告
实验名称:基于LEX的词法分析器
学生姓名:**
学生学号: ********** 指导教师毛静
一、实验目标
自动构造C-语言的的词法分析器,要求能够掌握编译原理的基本理论,,理解编译程序的基本结构,掌握编译各阶段的基本理论和技术,掌握编译程序设计的基本理论和步骤.,增强编写和调试高级语言源程序的能力,掌握词法分析的基本概念和实现方法,熟悉C-语言的各种Token。
二、实验原理及方法
Lex输入文件由3个部分组成:定义集(definition),规则集(rule)和辅助程序集(auxiliary routine)或用户程序集(user routine)。这三个部分由位于新一行第一列的双百分号分开,因此,Lex输入文件的格式如下
{definitions}
%%
{rules}
%%
{auxiliary routines}
而且第一部分用“%{”和“%}”括起来。
第一和第三个部分为C语言的代码和函数定义,第二个部分为一些规则。
定义正则表达式如下
ID = letter letter*
NUM = digit digit*
Letter = a|…|z|A|…|Z
Digit = 0|…|9
Keyword = else|if|int|return|void|while
Special symbol = +|-|*|/|<|<=|>|>=|==|!=|=|;|,|(|)|[|]|{|}|/*|*/
White space = “”
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图
三、实验内容
●Win7下lex 与 yacc的安装配置;
●利用Parser Genarator的词法分析器构造
四、实验步骤
1)Win7下lex 与 yacc的安装配置
1、lex的安装
首先,下载下载flex和bison.
其次,安装完毕后,将c:\gnuwin32\lib里面的libfl.a和liby.a复制到C:\MinGW\lib 里面。
再者,设置环境变量。
最后,测试安装是否成功。
2、使用lex生成此法分析器:
新建文本文件,更改名称为a.lex,敲入下面代码-------词法分析器的源代码
%{
int wordCount = 0;
int numcount = 0;
%}
chars [A-Za-z\_\'\.\"]
numbers ([0-9])+
delim [" "\n\t]
whitespace {delim}+
words {chars}+
%%
while {ECHO; printf("%s\n",yytext);}
{words} { wordCount++;
/* increase the word count by one*/ }
{whitespace} { /* do nothing*/ }
([0-9])+ { numcount++; /* one may want to add some processing here*/ } %%
void main()
{
printf("ok1\n");
yylex(); /* start the analysis*/
printf("ok2\n");
printf(" No of words: %d\n number: %d\n", wordCount, numcount);
return 0;
}
int yywrap()
{
return 1;
}
2、新建文本文件,更名为b.c,敲入下面代码 --------此为输入源代码
asd asdf 23 q
a1
b2
!#@
while
3、打开菜单,运行,输入cmd。
输入:cd 文件夹路径
输入:flex a.lex 回车后生成一个 lex.yy.c文件
输入:gcc -o a lex.yy.c -lfl 回车后生成一个a.exe文件,现在我们已得到了一个简易的词法分析器,下面就是运用次词法分析器,分析下b.c文件
输入:a.exe
2)利用Parser Genarator的词法分析器构造
在Lex中的规则定义构造
定义识别保留字规则
"int"|"else"|"return"|"void"|"if"|"while"
{Upper(yytext,yyleng);
printf("%d 行 ",lineno);
printf("%s reserved word\n",yytext);}//保留字
定义识别数字规则
{num}
{printf("%d 行 ",lineno);
printf("%s NUM\n",yytext);}//数字
定义识别专用符号规则","|";"|"("|")"|"{"|"}"|"*"|"/"|"+"|"-"|">"|"<"|">="|"<="|"=="|"!="|"="|"/*"|"* /"
{printf("%d 行 ",lineno);
printf("%s special symbol\n",yytext);}//特殊符号
定义识别标识符规则
{id}
{printf("%d 行 ",lineno);
printf("%s ID\n",yytext);}//标识符