跳转到内容

lex

维基百科,自由的百科全书

这是本页的一个历史版本,由Flamerecca留言 | 贡献2010年3月17日 (三) 19:39编辑。这可能和当前版本存在着巨大的差异。

電腦科學裡面,lex是一個產生詞法分析器(lexical analyzer) ("掃描器"(scanners)或者"lexers")的程式[1][2] Lex常常與yacc 語法分析器產生程式(parser generator)一起使用。 Lex(最早是埃里克·施密特Mike Lesk製作)是許多UNIX系統的標準詞法分析器(lexical analyzer)產生程式,and a tool exhibiting its behavior is specified as POSIX標準的一部分。

Lex讀進一個代表詞法分析器規則的輸入字串流,然後輸出以C語言實做的詞法分析器原始碼

Though traditionally proprietary software, versions of Lex based on the original AT&T code are available as 公開原始碼, as part of systems such as OpenSolaris and Plan 9 from Bell Labs. Another popular 公開原始碼 version of Lex is flex,代表"快速的詞法分析器"(fast lexical analyzer)

lex檔案的結構

lex的檔案結構故意設計的與yacc的檔案格式相似; files are divided up into three sections, 以只有兩個百分比符號(%)的一行來分隔,如下:

定義區塊
%%
規則區塊
%%
C程式碼區塊
  • The 定義區塊 is the place to define 巨集 and to 匯入C寫成的表頭檔。 It is also possible to write any C code here, which will be copied verbatim into the generated source file.
  • The 規則區塊 is the most important section; it associates patterns with C statements. Patterns are simply regular expressions. When the lexer sees some text in the input matching a given pattern, it executes the associated C code. This is the basis of how lex operates.
  • The C程式碼區塊 contains C statements and functions that are copied verbatim to the generated source file. These statements presumably contain code called by the rules in the rules section. In large programs it is more convenient to place this code in a separate file and link it in at compile time.

lex檔案的範例

下方是一個flex 版本的lex檔的範例。這隻程式分辨出哪裡是表示數字(整數)的字串,並且把他們印出來。

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

%{
/* C code to be copied verbatim */
#include <stdio.h>
%}

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

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

    /* [0-9]+ matches a string of one or more digits */
[0-9]+  {
            /* yytext is a string containing the matched text. */
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* Ignore all other characters. */   }

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

int main(void)
{
    /* Call the lexer, then quit. */
    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),that can be used to maintain programs involving lex。 Make assumes that a file that has an extension of .l is a lex source file. The make internal macro LFLAGS can be used to specify lex options to be invoked automatically by make。[3]

相關條目

參考項目

  1. ^ Levine, John R; Mason, Tony; Brown, Doug. LEX & YACC 2. O'Reilly. 1992: 1–2. ISBN 1-56592-000-7. 
  2. ^ Levine, John. flex & bison. O'Reilly Media. August 2009: 304. ISBN 978-0-596-15597-1. 
  3. ^ make, The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition (The IEEE and The Open Group), 2004 

外部連接