免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6530 | 回复: 12
打印 上一主题 下一主题

词法分析程序的生成程序lex [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-02 17:47 |只看该作者 |倒序浏览
lex是一个词法分析程序的生成程序,它是为了对字符输入流进行词法分析而设计的,在lex源程序里,用户说明正则表达式,lex对用户使用lex语言写的源程序进行处理,得到一个程序,该程序从输入流中识别出与某个用户所提供的正则表达式匹配的字符串,并在识别出字符串时执行由用户提供的程序。
   与c,pascal等语言不同,lex语言并不是一个完整的语言:lex只是把用户的lex语言源程序转换为一个C语言源程序,用户再用c语言编译程序编译lex生成的c语言源程序,才能得到最终的可执行程序。因此,我们把c语言叫做lex语言的宿主语言。我们也可以把lex语言看作是对c语言的补充,在lex语言中,用户除了可以以c语言的形式来写函数外,还可以以一种非常高级的形式来描述想要从输入流中识别出的字符串和档这些字符串被识别出来时要执行的动作,实际上就是执行一段c语言程序,在unix系统中,fortran语言的一种改进形式ratfor也是可以用lex语言的宿主语言。



           未完-----待续

论坛徽章:
0
2 [报告]
发表于 2003-06-02 18:08 |只看该作者

词法分析程序的生成程序lex

期待中,一直没有看到过很好的lex和yacc的中文资料。。。。

论坛徽章:
0
3 [报告]
发表于 2003-06-02 18:35 |只看该作者

词法分析程序的生成程序lex

买一本啊,O'Reilly的,非常好。

论坛徽章:
0
4 [报告]
发表于 2003-06-03 08:15 |只看该作者

词法分析程序的生成程序lex

lex自动地把表示输入串词法结构的正则表达式及相应的动作的lex源文件转换成一个C语言源文件lex.yy.c,在该源文件中,有一个函数yylex,他就是语法分析程序。他可以识别出输入串中的单词(token),并且在识别出某单词完成指定的动作(执行一段c语言程序)。
   lex的工作原理是把源程序中的正则表达式转换成相应的确定有限自动机DFA,而相应的动作则插入到词法分析程序yylex中适当的地方,控制流则由该DFA的解释程序掌握,对于不同的源程序,这个解释程序是相同的。
   作为一个简单的例子,我们看一个统计文本文件行数的程序:
   $cat lex.l
%{
int nline=0;
%}
%%
\n {++nline;}
. ;
%%
int yywrap()
{
printf("%d\n",nline);
}


$lex lex.l
$cc lex.yy.c -ll
$a.out </usr/include/stdio.h
271
$

论坛徽章:
0
5 [报告]
发表于 2003-06-03 08:23 |只看该作者

词法分析程序的生成程序lex

十分感兴趣,希望多介绍点资料。
请 yuxq和JohnBull 多介绍点!

论坛徽章:
0
6 [报告]
发表于 2003-06-03 08:30 |只看该作者

词法分析程序的生成程序lex

在lex源程序中,用户用正则表达式来描述输入串的词法结构的。一个正则表达式表示一个字符串的集合,换句话说,他秒数了一组要匹配的字符串。正则表达式由正文字符与运算符组成。正文字符组成了基本的正则表达式,表示某一个字符串,运算符则把基本的正则表达式组合成为更复杂的正则表达式,表示字符串的集合。
  例如:正则表达式ab仅表示字符串ab,而正则表达式(ab)+则表示字符串的集合;(ab,abab,ababab,.......}.
   在lex中,正则表达式运算符共有20个:
“ \  [ ] ^ - ? . * + | ( ) $ / { } % < >;
   上述运算符需要作为正文字符出现在正则表达式中时,必须借助于双引号“或者反斜线\,如:正则表达式ab"++"或ab\+\+都表示字符串ab++,而正则表达式ab+则表示字符串的集合:{ab,abb,abbb,.......}。为了避免死记上述20个运算符,建议在使用非字母和数字字符时都使用双引号或者反斜线。要表示双引号本身可以用\“,要表示反斜线本身用"\"或者\\。用\还可以表示几个特殊符号:\n是回车还行,\t是制表符,\b是退格符。
   未完-----待续

下面分别按照功能介绍上述的运算符

论坛徽章:
0
7 [报告]
发表于 2003-06-03 08:57 |只看该作者

词法分析程序的生成程序lex

1、字符的集合
    [xyz]:方括号表示字符的集合,即x,y,z单个字符匹配。
    -:表示字符的范围
    ^:必须写在第一个位置,它的作用是求方括号中除了^之外的字符组成的字符集合相对于计算机字符集的补集,如正则表达式[^abc]和除去a,b,c外的所有符号匹配。
   2、闭包运算
    运算符*和+是lex正则表达式中的闭包运算符,他们表示正则表达式中某子式的重复,例如a*表示由0个或者多个a组成的字符串的集合,而a+表示由1个或者多个a组成的字符串的集合,如[_a-zA-Z][_a-zA-Z0-9]*表示第一个字符是字母或者下划线,其余字符是字母,下划线或者数字的字符串,如c语言中的标识符。
   3、选择和字符组
    运算符|表示选择,如正则表达式(ab|cb)与字符串ab或者cb匹配。运算符()表示一组字符。注意()和[]的不同:(ab)表示字符串ab,而[ab]则表示单个字符a或者b。圆括号()用于表示复杂的正则表达式,例如:正则表达式(ab|cd+)?(ef)*与字符串abefef,efef,cdef,cddd等匹配,但不与字符串abc,abcd,或者abcdef匹配。
   4、重复和辅助定义
   当被{}括起来的是数字时,{}表示重复,当他括起来的是第一个标识符时,则表示辅助定义的展开。例如正则表达式a{1,5}表示字符串集合{a,aa,aaa,aaaa,aaaaa}。而{digit}则把digit所定义的正则表达式插入到他所在的位置上。
   5、其他
   运算符.匹配除了\n外的所有字符。运算符?指出正则表达式中可有可无的子式,例如正则表达式ab?c与字符串ac或者abc匹配,即b是可有可无的。


常用的一些运算符:
x                     字符x
"x"                  字符x
\x                    字符x
[xy]                 字符x或者字符y
[x-z]                字符x,y或者z
[^x]                 除了x外的所有字符
.                       除了\n外的所有字符
^x                   出现在一行开始处的字符x
<S>;x               当lex处于开始条件S下时的x
x$                    出现在行尾的x
x?                    可有可无的x
x*                    0个或者多个x
x+                    1个或者多个x
x|y                    x或者y
(x)                    字符x
x/y                    其后紧随y的字符x
x{m,n}              m到n个x



未完----待续

论坛徽章:
0
8 [报告]
发表于 2003-08-19 15:32 |只看该作者

词法分析程序的生成程序lex

lex和yacc结合起来用,再加上c,c++很是不错,建议大家多多讨论一下lex和yacc

论坛徽章:
0
9 [报告]
发表于 2003-08-19 15:37 |只看该作者

词法分析程序的生成程序lex

lex程序的输入和输出
lex生成的lex.yy.c里边,所有的输入都是从流yyinput读,写道流yyoutput的,不过在初始化时,yyinput被初始化成stdin,故和标准输出相连,yyoutput被初始化成stdout,故和标准输出相连,lex.yy.c的片断如下:FILE *yyin = {stdin},*yyout = {stdout};
因此当我们想从另外一个文件而不是标准输入读入时,只要在程序中打开该文件,把fopen返回的指针付给yyin即可

论坛徽章:
0
10 [报告]
发表于 2003-08-19 15:47 |只看该作者

词法分析程序的生成程序lex

lex从字符串中读输入的方法
有时候lex从字符串中读输入,而不是从文件中读输入,我们可以修改lex锁调用的lex锁调用的I/O函数这些函数是:
input()        返回下一个输入字符
output(c)    把字符c写到输出上
unput(c)      把字符c放回输入流,以便让下一个input()可以读取他
实际上这些函数都是用宏来定义的,用户可以重定义这些宏
例如:
%{
char s[256];
char *sptr = s;

#define input()                (*sptr++)
#define unput(c)             (*--sptr = (c))
#define output(c)             /*null*/
%}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP