必威电竞|足球世界杯竞猜平台

flex詞法分析器
來源:互聯網

flex詞法分析器是替代lex的免費開源軟件。它是一個生成詞法分析器(也稱為“掃描儀”或“詞法分析器”)的計算機程序。它經常在BSD派生的操作系統上與Berkeley Yacc解析器生成器一起用作lex實現(因為lex和yacc都是POSIX的一部分),或者與GNU bison(一個版本的 yacc)在* BSD端口和Linux發行版中。與Bison不同,flex不是GNU項目的一部分,也不是根據GNU通用公共許可證發布的。

歷史

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手冊中不鼓勵使用它。

重入

默認情況下,Flex生成的掃描程序不可重入。對于從不同線程使用生成的掃描程序的程序,這可能會導致嚴重問題。為了解決這個問題,Flex提供了一些選項以實現重入。有關這些選項的詳細說明,請參閱Flex手冊。

非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 ++生成的類的接口。

參考資料 >

生活家百科家居網