跳至內容

Lex

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 05:24 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

佇咧電腦科學內底,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 檔案的範例。這个程式會當揣出表示講數字(整數)的字攕,嘛共伊列印出來。

將這个檔案輸入予 flex,伊會共這个檔案轉做一个 C 檔案,檔名 lex . yy . c。這乎 C 檔案會當予人編譯做一份會當執行檔,功能為著揣出並且輸出代表整數字串。比如講,予定輸入:

` ` ` abc 一百二三 z . ! & * 二 ghj 六 ` ` `

這隻程式會印出:

` ` ` Saw an integer : 一百二三 Saw an integer : 二 Saw an integer : 六 ` ` `

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