(完整版)基于LEX的词法分析器实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 a.txt 回车后生成一个a.txt文件

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);}//标识符

相关文档
最新文档