Lex

在電腦科學裡面，lex是一個產生詞法分析器（lexical analyzer，"掃描器"（scanners）或者"lexers"）的程式。 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選項。

相關條目
flex詞法分析器
Yacc
Ragel
Quex
List of C# lexer generators

参考文献

外部連結
Using Flex and Bison at Macworld.com 

编译工具
分析器生成器
Unix编程工具
Unix SUS2008实用工具
程序設計工具