歷史
Vern Paxson於1987年以C語言寫作了flex。他引用了Jef Poskanzer為Ratfor寫作的詞法分析器。
實例
這是用於指令程式語言PL / 0的Flex掃描器的示例。
識別的標記是:'+',' - ','*','/','=","(',')',',',';','。',':=", "<','<=","<>','>','> ="; 數字:0-9 {0-9};
標識符:a-zA-Z {a-zA-Z0-9}
關鍵字:begin,call,const,do,end,if,odd,procedure,then,var,while。
內部
這些程式通過使用確定性有限自動機(DFA)執行字元解析和標記化。 DFA是接受常規語言的理論機器。 這些機器是圖靈機系列的一部分。 DFA相當於唯讀右移圖靈機。 語法基於正則表達式的使用。 另見非確定性有限自動機。
相關問題
時間複雜度
Flex詞法分析器通常在輸入的長度上具有時間複雜度{\ displaystyle O(n)} O(n)。也就是說,它對每個輸入符號執行恆定數量的操作。此常量非常低:GCC為DFA匹配循環生成12條指令。[需要引用]請注意,常量與令牌的長度,正則表達式的長度和DFA的大小無關。
但是,在具有匹配極長令牌的掃瞄器中使用REJECT宏可能會導致Flex生成具有非線性性能的掃瞄器。此功能是可選的。在這種情況下,程式設計師已明確告訴Flex在已經匹配某些輸入之後“返回並重試”。這將導致DFA回溯以找到其他接受狀態。默認情況下不啟用REJECT功能,並且由於其性能影響,在Flex手冊中不鼓勵使用它。[11]
重入
默認情況下,Flex生成的掃描程式不可重入。對於從不同執行緒使用生成的掃描程式的程式,這可能會導致嚴重問題。為了解決這個問題,Flex提供了一些選項以實現重入。有關這些選項的詳細說明,請參閱Flex手冊。[12]
非Unix環境下的使用
通常,生成的掃描程式包含對Unix特定的unistd.h頭檔案的引用。為避免生成包含unistd.h的代碼,應使用%option nounistd。另一個問題是調用isatty(一個Unix庫函式),它可以在生成的代碼中找到。 %選項從不互動強制flex生成不使用isatty的代碼。
使用其他語言的flex
Flex只能為C和C ++生成代碼。要使用flex從其他語言生成的掃描程式代碼,可以使用SWIG等語言綁定工具。
Flex++
flex ++是一個類似於C ++的詞法掃描程式,它作為flex包的一部分包含在內。 生成的代碼不依賴於任何運行時或外部庫,除了記憶體分配器(malloc或用戶提供的替代),除非輸入也依賴於它。 這在傳統作業系統或C運行時設施可能不可用的嵌入式和類似情況下非常有用。
flex ++生成的C ++掃描程式包含頭檔案FlexLexer.h,它定義了兩個C ++生成的類的接口。