fbpx
维基百科

lex

電腦科學裡面,lex是一個產生詞法分析器(lexical analyzer,"掃描器"(scanners)或者"lexers")的程式[1][2] Lex常常與yacc 語法分析器產生程式(parser generator)一起使用。Lex(最早是埃里克·施密特迈克·莱斯克製作)是許多UNIX系統的標準詞法分析器(lexical analyzer)產生程式,而且這個工具所作的行為被詳列為POSIX標準的一部分。

Lex
原作者Mike Lesk, Eric Schmidt
首次发布1975年,​49年前​(1975
源代码库
  • minnie.tuhs.org/cgi-bin/utree.pl?file=4BSD%2Fusr%2Fsrc%2Fcmd%2Flex
操作系统Unix类Unix系统
类型命令

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) 

外部連結 编辑

提示, 此条目页的主题不是蕾丝或lexburner, 在電腦科學裡面, 是一個產生詞法分析器, ical, analyzer, 掃描器, scanners, 或者, 的程式, lex常常與yacc, 語法分析器產生程式, parser, generator, 一起使用, 最早是埃里克, 施密特和迈克, 莱斯克製作, 是許多unix系統的標準詞法分析器, ical, analyzer, 產生程式, 而且這個工具所作的行為被詳列為posix標準的一部分, lex原作者mike, lesk, eric, schmidt首. 提示 此条目页的主题不是蕾丝或LexBurner 在電腦科學裡面 lex是一個產生詞法分析器 lexical analyzer 掃描器 scanners 或者 lexers 的程式 1 2 Lex常常與yacc 語法分析器產生程式 parser generator 一起使用 Lex 最早是埃里克 施密特和迈克 莱斯克製作 是許多UNIX系統的標準詞法分析器 lexical analyzer 產生程式 而且這個工具所作的行為被詳列為POSIX標準的一部分 Lex原作者Mike Lesk Eric Schmidt首次发布1975年 49年前 1975 源代码库minnie wbr tuhs wbr org wbr cgi bin wbr utree wbr pl file 4BSD 2Fusr 2Fsrc 2Fcmd 2Flex操作系统Unix和类Unix系统类型命令 Lex讀進一個代表詞法分析器規則的輸入字串流 然後輸出以C語言實做的詞法分析器原始碼 雖然傳統上是商業軟體 但是有些根據原本AT amp T程式碼這些版本的Lex可以以公開原始碼的形式獲得 並被視為某些系統的一部份 例如說OpenSolaris和貝爾實驗室九號計畫 另一個有名的Lex公開原始碼版本是flex 代表 快速的詞法分析器 fast lexical analyzer 目录 1 lex檔案的結構 2 lex文件示例 3 Lex和其他工具並用 3 1 Lex和語法分析產生程式 parser generator 並用 3 2 Lex和make 4 相關條目 5 参考文献 6 外部連結lex檔案的結構 编辑lex的檔案結構故意設計的與yacc的檔案格式相似 檔案分成三個區塊 均以一個只有兩個百分比符號 的單行來分隔 如下 定義區塊 規則區塊 C程式碼區塊 定義區塊是用來定義巨集以及匯入C寫成的表頭檔所在區塊 在這裡面也可以寫一些C程式碼 這一些程式碼會被複製到產生出來的C原始碼的開頭部份 規則區塊是最重要的區塊 這裡將樣式與C的陳述 statement 串連在一起 這一些樣式都是正規表式 當lexer看到輸入裡面有合乎給定的樣式時 則會操作相對應的C程式碼 這就是lex運作的基礎 C程式碼區塊包含C的陳述與函式 function 會原封不動的照搬到產生出來的C原始碼裡面 這些陳述一般假設包含了在規則區塊裡面 各個規則分別呼叫的原始碼 在大型程式裡面 將這一些程式放在其他分開的檔案並且在編譯階段作連接會更方便 在進行修改跟擴充的時候 lex文件示例 编辑下面是一个flex版本的lex文件的示例 这个程序可以找出表示数字 整数 的字符串 并将它们打印出来 定義區塊 會直接照搬放檔頭的C code include lt stdio h gt 這裡告訴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 amp 2ghj6 這隻程式會印出 Saw an integer 123 Saw an integer 2 Saw an integer 6Lex和其他工具並用 编辑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 相關條目 编辑flex詞法分析器 Yacc Ragel Quex List of C lexer generators参考文献 编辑 Levine John R Mason Tony Brown Doug LEX amp YACC 2 O Reilly 1992 1 2 2010 03 16 ISBN 1 56592 000 7 原始内容存档于2014 12 02 Levine John flex amp bison O Reilly Media August 2009 304 2010 03 16 ISBN 978 0 596 15597 1 原始内容存档于2011 08 16 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 外部連結 编辑Using Flex and Bison at Macworld com 页面存档备份 存于互联网档案馆 取自 https zh wikipedia org w index php title Lex amp oldid 64335246, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。