原作者 | Mike Lesk,Eric Schmidt |
---|---|
首次发布 | 1975年,50年前(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的檔案結構故意設計的與yacc的檔案格式相似;檔案分成三個區塊,均以一個只有兩個百分比符號(%)的單行來分隔,如下:
定義區塊%%規則區塊%%C程式碼區塊
下面是一个flex版本的lex文件的示例。这个程序可以找出表示数字(整数)的字符串,并将它们打印出来。
/*** 定義區塊***/%{/* 會直接照搬放檔頭的C code */#include<stdio.h>%}/* 這裡告訴flex只要讀取輸入的檔案(不需要其他檔案)*/%optionnoyywrap%%/*** 規則區塊***//* [0-9]+代表包含一個或多個數字的字串*/[0-9]+{/* yytext是一個字串變數,內容是符合規則的字串本身。*/printf("Saw an integer: %s\n",yytext);}.{/* 忽略所有其他的字*/}%%/*** C程式碼區塊***/intmain(void){/* 呼叫lexer,然後結束程式*/yylex();return0;}
將這個檔案輸入給flex,它會將這個檔案轉換成一個C檔案,檔名lex.yy.c。這個C檔案可以被編譯成一份可執行檔,功能為找出並且輸出代表整數的字串。例如,給定輸入:
abc123z.!&*2ghj6
這隻程式會印出:
Saw an integer: 123Saw an integer: 2Saw an integer: 6
Lex和語法分析器產生程式,例如說Yacc或者Bison之類,常常一起使用。語法分析器產生程式使用形式文法來分析輸入字串流(input stream),這是Lex使用簡單的正規表示式所作不到的事情(Lex的設計被限制於只能使用有限狀態自動機)。然而,語法分析器產生程式不能直接讀取簡單的輸入字串流–他們需要使用一系列的單詞(token)。Lex則常常被使用來提供語法分析器產生程式這一些單詞。
make是一個便利程式(utility),在這裡我們用它來維護跟lex相關的程式。make假設副檔名是.l
的檔案是一個lex原始碼檔案。make內部的巨集LFLAGS
可以用來詳列make自動觸發的lex選項。[3]