电脑科学里面,lex是一个产生词法分析器(lexical analyzer,"扫描仪"(scanners)或者"lexers")的程序[1][2] Lex常常与yacc 语法分析器产生程序(parser generator)一起使用。Lex(最早是埃里克·施密特迈克·莱斯克制作)是许多UNIX系统的标准词法分析器(lexical analyzer)产生程序,而且这个工具所作的行为被详列为POSIX标准的一部分。

Lex
原作者Mike Lesk, Eric Schmidt
首次发布1975年,​49年前​(1975
原始码库 编辑维基数据链接
操作系统Unix类Unix系统
类型命令

Lex读进一个代表词法分析器规则的输入字符串流,然后输出以C语言实做的词法分析器原始码

虽然传统上是商业软件,但是有些根据原本AT&T代码这些版本的Lex可以以公开原始码的形式获得,并被视为某些系统的一部分,例如说OpenSolaris贝尔实验室九号项目。另一个有名的Lex公开原始码版本是flex,代表"快速的词法分析器"(fast lexical analyzer)

lex文件的结构

编辑

lex的文件结构故意设计的与yacc的文件格式相似;文件分成三个区块,均以一个只有两个百分比符号(%)的单行来分隔,如下:

定義區塊
%%
規則區塊
%%
C程式碼區塊
  • 定义区块是用来定义以及导入C写成的头文件所在区块。在这里面也可以写一些C代码,这一些代码会被复制到产生出来的C原始码的开头部分。
  • 规则区块是最重要的区块;这里将样式与C的陈述(statement)串连在一起。这一些样式都是正规表式。当lexer看到输入里面有合乎给定的样式时,则会操作相对应的C代码。这就是lex运作的基础。
  • C代码区块包含C的陈述与函数(function)会原封不动的照搬到产生出来的C原始码里面。这些陈述一般假设包含了在规则区块里面,各个规则分别调用的原始码。在大型程序里面,将这一些程序放在其他分开的文件并且在编译阶段作连接会更方便(在进行修改跟扩展的时候)。

lex文件示例

编辑

下面是一个flex版本的lex文件的示例。这个程序可以找出表示数字(整数)的字符串,并将它们打印出来。

/*** 定義區塊***/

%{
/* 會直接照搬放檔頭的C code */
#include <stdio.h>
%}

/* 這裡告訴flex只要讀取輸入的檔案(不需要其他檔案)*/
%option noyywrap

%%
    /*** 規則區塊***/

    /* [0-9]+代表包含一個或多個數字的字串*/
[0-9]+  {
            /* yytext是一個字串變數,內容是符合規則的字串本身。*/
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* 忽略所有其他的字*/   }

%%
/*** C程式碼區塊***/

int main(void)
{
    /* 呼叫lexer,然後結束程式*/
    yylex();
    return 0;
}

将这个文件输入给flex,它会将这个文件转换成一个C文件,文件名lex.yy.c。这个C文件可以被编译成一份可执行档,功能为找出并且输出代表整数的字符串。例如,给定输入:

abc123z.!&*2ghj6

这只程序会印出:

Saw an integer: 123
Saw an integer: 2
Saw an integer: 6

Lex和其他工具并用

编辑

Lex和语法分析产生程序(parser generator)并用

编辑

Lex和语法分析器产生程序,例如说Yacc或者Bison之类,常常一起使用。语法分析器产生程序使用形式文法来分析输入字符串流(input stream),这是Lex使用简单的正则表达式所作不到的事情(Lex的设计被限制于只能使用有限状态自动机)。然而,语法分析器产生程序不能直接读取简单的输入字符串流–他们需要使用一系列的单词(token)。Lex则常常被使用来提供语法分析器产生程序这一些单词。

Lex和make

编辑

make是一个便利程序(utility),在这里我们用它来维护跟lex相关的程序。make假设扩展名是.l的文件是一个lex原始码文件。make内部的宏LFLAGS可以用来详列make自动触发的lex选项。[3]

相关条目

编辑

参考文献

编辑
  1. ^ Levine, John R; Mason, Tony; Brown, Doug. LEX & YACC 2. O'Reilly. 1992: 1–2 [2010-03-16]. ISBN 1-56592-000-7. (原始内容存档于2014-12-02). 
  2. ^ Levine, John. flex & bison. O'Reilly Media. August 2009: 304 [2010-03-16]. ISBN 978-0-596-15597-1. (原始内容存档于2011-08-16). 
  3. ^ make, The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition (The IEEE and The Open Group), 2004 [2010-03-16], (原始内容存档于2010-10-31) 

外部链接

编辑