LIMSpec Wiki

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

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

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) 

外部链接