2008-12-10 39 views
9

如何定義解析器和詞法分析器規則以解析使用縮進定義範圍的語言。你將如何解析縮進(python樣式)?

我已經用Google搜索,發現了一個聰明的做法通過在詞法分析器產生INDENT和DEDENT語言標記解析它。

我會去更深層次的對這個問題,併發佈一個答案,如果我到一些有趣的事情,但我想看看其他方法的問題。

編輯: 正如查理指出的,there is already another thread very similar if not the same.我的帖子是否應該刪除?

回答

1

您也可以在詞法分析器的地方跟蹤有多少的ident項第一行之前,並將其傳遞給解析器。最有趣的部分是試圖正確地將它傳遞給解析器:)如果您的解析器使用前瞻(這裏我的意思是解析器可能會查詢可變數量的標記,然後它真的會匹配甚至一個),然後試圖通過一個全局變量傳遞它這是一個非常糟糕的想法(因爲詞法分析器可能會滑入下一行並更改縮進計數器的值,而解析器仍然試圖解析前一行)。在其他許多情況下,全局變量也是邪惡的;)使用縮進計數器標記第一行'真實'令牌更合理。我不能給你確切的例子(我甚至不知道你會使用什麼語法分析器和詞法分析器,如果有的話),但是像在一線標記上存儲數據一樣(如果你能' t很容易從解析器中獲得這樣的標記)或保存自定義數據(將標記鏈接到縮進的映射,數組中源代碼中的每一行都作爲索引,縮進值作爲元素值)似乎就足夠了。這種方法的一個缺點是解析器的複雜性需要區分ident值並根據它改變它的行爲。像Java的LOOKAHEAD({yourConditionInJava})可能在這裏工作,但它是不是一個非常好的主意。很多在你的做法附加的標記似乎使用:)

作爲另一個備選方案,我建議少邪惡的東西就是這兩種方法混合。只有縮進計數器在下一行更改其值時,纔可以生成附加的標記。它就像人造的BEGIN和END令牌一樣。通過這種方式,您可以減少從詞法分析器饋入解析器的流中的「人造」令牌的數量。只有你的語法分析器應調整來了解更多的標記......

我沒有嘗試過這一點(有這樣的語言解析沒有實際經驗),公正地分享可能的解決方案我的想法。檢查已經構建的這種語言的解析器可能對您有很大的價值。開源是你的朋友;)

10

這是一種假設,因爲它取決於你的詞法分析器和解析器有哪些技術,但最簡單的方法似乎是將BEGINBLOCK和ENDBLOCK標記與花括號C.使用"offsides rule"您的詞法分析器需要跟蹤一系列的嵌入級別。當縮進級別增加時,爲解析器發出BEGINBLOCK;當縮進級別降低時,從堆棧中放出ENDBLOCK和彈出級別。

的這對SO Here's another discussion,順便說一句。