最近,我一直在研究關於詞法分析的編譯器理論。 據我瞭解,有些構建詞法掃描儀的方法,如:使用lex /創建掃描儀?
- 使用Lex/Flex自動生成掃描儀。
- 建立你自己的一個。在示例中,我遇到了使用預讀技術(模擬DFA,NFA)的switch case模型。
我的問題是哪一個更適合實現基本的編程語言(包括變量,條件,循環)? 他們應該如何在實踐中使用?是否可以同時使用它們?
最近,我一直在研究關於詞法分析的編譯器理論。 據我瞭解,有些構建詞法掃描儀的方法,如:使用lex /創建掃描儀?
我的問題是哪一個更適合實現基本的編程語言(包括變量,條件,循環)? 他們應該如何在實踐中使用?是否可以同時使用它們?
法爲簡單語言很有用,但在那些與複雜語法不使用(例如,柔性/法不使用寫入法的掃描器來處理輸入法)。有時候會有人問如何管理多個語法掃描程序(很久以前,我使用sed幫助多個lex的程序員使用多個lex 和 yacc文件—,因爲這是在flex/bison之前有幫助重命名的選項)。
對於實際演示,vi-like-emacs使用語法高亮模塊的lex/flex 最。並非全部。 Perl和ruby在lex/flex中顯得太複雜了,因爲他們嵌入正則表達式的方式毫無頭緒。另一方面,它有一個可操作的(但很大的)掃描儀,用lex寫成的lex/lex —。爲了舉例,我在vile's FAQ(見result)中添加了一份。
可以列出類似的東西,但作爲一條規則,使用lex的原因是語法的複雜性。此外,管理錯誤恢復是(根據一些)選擇的原因。
掃描儀與語法無關。 – EJP
我們可以爭論術語,但你顯然有太多的業餘時間。 –
一個詞法掃描器只將來源分成標記;它不會幫助您將令牌解析爲循環和條件等結構。如果你想構建真正的軟件,使用(f)lex;滾動你自己的詞法掃描器需要更多的工作,更容易維護,需要更多的調試,而且不可能更快。 – rici
您可以使用任意一種,但使用兩者都沒有意義。顯然,像lex/flex這樣的工具存在的原因是,手動編寫和維護掃描器可能非常麻煩且耗時 - 尤其是如果您正在發展編程語言以及詞法分析器。 –