回 帖 发 新 帖 刷新版面

主题:怎样使用lex?

我是一个刚自学计算机的小菜。现在在学编译原理(买了一本  [美]Andrew W.Appel著的《现代编译原理 C语言描述》,基本上能看懂书上写的内容)可是不知道怎样使用Lex。
    会使用Lex的同仁,能不能指点一下!先在这儿谢了。

回复列表 (共1个回复)

沙发

Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识别程序,由该程序识别出输入文本中的各个单词。 
1、lex程序的结构 

-定义部分 
-规则部分 
-用户子程序部分 

其中规则部分是必须的,定义和用户子程序部分是任选的。 

(1) 定义部分 
定义部分起始于"%{"符号,终止于"%}"符号,其间可以是包括include语句、声明语句在内的C语句。 
%{ 
#include "stdio.h" 
#include "y.tab.h" 
extern int lineno; 
%} 

(2) 规则部分 
规则部分起始于"%%"符号,终止于"%%"符号,其间则是词法规则。词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext[]字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。 

%% 
[\t] {;} 
[0-9]+\.?|[0-9]*\.[0-9]+ 
{ sscanf(yytext,"%1f", &yylval.val); 
return NUMBER; } 
\n { lineno++;return '\n'; } 
. { return yytex+[0]; } 
%% 

(3) 用户子程序部分 
用户子程序部分可以包含用C语言编写的子程序,而这些子程序可以用在前面的动作中,这样就可以达到简化编程的目的。下面是带有用户子程序的lex程序片段。 
"/*" skipcmnts(); 
. /* rest of rules */ 
%% 
skipcmnts() 

for ( ; ; ) 

while (input()!='*'); 
if(input()!='/') 
unput(yytext[yylen-1]); 
else return; 


2、lex工具的使用方法 
首先编写一个lex程序 
vi lex.l 
%{ 
#include "stdio.h" 
%} 
%% 
[\n] ; 
[0-9]+ printf("Interger: %s \n",yytext); 
[0-9]*\.[0-9]+ printf("Float: %s\n",yytext); 
[a-zA-Z][a-zA-Z0-9]* printf("Word:%s\n",yytext); 
. printf("Other symbol:%c\n",yytext[0]); 
%% 

然后使用lex将lex.l转换成C语言程序 
$lex lex.l 
使用上述命令产生的C语言程序为lex.yy.c 
然后使用C编译程序将lex.yy.c编译成可执行程序regn 
$cc -c lex.yy.c 
$cc lex.yy.o -ll -o regn 
下面可以使用regn来识别单词 
$vi testfile 
x=355 
y=113 
p=x/y 

# ./regn < testfile 
Word:x 
Other symbol:= 
Interger: 355 
Word:y 
Other symbol:= 
Interger: 113 
Word:p 
Other symbol:= 
Word:x 
Other symbol:/ 
Word:y 


我来回复

您尚未登录,请登录后再回复。点此登录或注册