主题:怎样使用lex?
jqww2002
[专家分:80] 发布于 2006-05-26 15:38:00
我是一个刚自学计算机的小菜。现在在学编译原理(买了一本 [美]Andrew W.Appel著的《现代编译原理 C语言描述》,基本上能看懂书上写的内容)可是不知道怎样使用Lex。
会使用Lex的同仁,能不能指点一下!先在这儿谢了。
回复列表 (共1个回复)
沙发
冷月星光 [专家分:16520] 发布于 2006-05-26 16:58:00
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
#
我来回复