Lex 编译器入门

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

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

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

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

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

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

(
3 ) 用户子程序部分
用户子程序部分可以包含用C语言编写的子程序,而这些子程序可以用在前面的动作中,这样就可以达到简化编程的目的。下面是带有用户子程序的lex程序片段。
" /* "  skipcmnts() ;
. /* rest of rules */
%%
skipcmnts()
{
for ( 
;  ; )
{
while (input()!
= ''*'') ;
if(input()! = ''/'')
unput(yytext
[ yylen-1 ] ) ;
else return ;

 以上是这个工具的简要说明。

我在这里以《编译原理》(龙书)的习题为例,
3.11 编写一个Lex程式,该程式复制一个文件,并将每一个非空的空白符序列用一个空格代替。
首先,这个“非空的空白符序列”是指由空格和制表符号组成的序列,其正则表达式是[ \t],大家注意在前面有一个空格。
再则就是做一个替换操作了。

代码为:

%{
#include 
" stdio.h "
%}

delim    
[   ]
ws    {delim}+

%%
{ws} printf(
"   " ) ;
. printf( " %c " , yytext [ 0 ] ) ;
%%

存为  P3-11.l
编译过程
lex P3-11.l
cc -c lex.yy.c
cc lex.yy.o -ll -o run

使用过程
run < in.txt
输入文件内容

I am     a best player   in the   world ,
And         I  am very    sorry     to trouble you.

Hehe.


输出结果为

I am a best player in the world ,
And I am very sorry to trouble you.

Hehe.


最后我提供一个脚本,方便编译。
我的系统环境是
Ubuntu 7.10
flex 2.5.33

安装Lex过程
sudo apt-get install flex

#  Copyright (C) 2003-2008 Wang Pengcheng <wpc0000@gmail.com>
#!/usr/bash

lex $ 1  
cc 
- c lex . yy . c
cc lex
. yy . - ll  - o run
rm lex
. yy .*
rm 
*~

 

Lex 编译器入门


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论