跳转到内容

Lex:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
Qwe112留言 | 贡献
无编辑摘要
Qwe112留言 | 贡献
第102行: 第102行:
[[Category:Unix programming tools]]
[[Category:Unix programming tools]]
[[Category:Unix SUS2008 utilities]]
[[Category:Unix SUS2008 utilities]]
[[分類:程序設計工具]]


[[cs:Lex (software)]]
[[cs:Lex (software)]]

2011年1月22日 (六) 01:11的版本

電腦科學裡面,lex是一個產生詞法分析器(lexical analyzer) ("掃描器"(scanners)或者"lexers")的程式[1][2] Lex常常與yacc 語法分析器產生程式(parser generator)一起使用。 Lex(最早是埃里克·施密特Mike Lesk製作)是許多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. 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 

外部連接