簡體   English   中英

你會如何解析縮進(python風格)?

[英]How would you parse indentation (python style)?

如何定義解析器和詞法分析器規則來解析使用縮進來定義范圍的語言。

我已經google了一下,通過在詞法分析器中生成INDENT和DEDENT令牌,找到了一種解析它的聰明方法。

如果我談到一些有趣的東西,我會更深入地研究這個問題並發表答案,但我希望看到解決問題的其他方法。

編輯:正如查理指出的, 如果不是相同的話已經有另一個非常相似的線程。 我的帖子應該被刪除嗎?

這是一種假設,因為它取決於你的詞法分析器和解析器的技術,但最簡單的方法似乎是讓BEGINBLOCK和ENDBLOCK標記類似於C中的大括號。使用你的詞法分析器所需的“越位規則”跟蹤一堆壓力水平。 當縮進級別增加時,為解析器發出BEGINBLOCK; 當縮進級別減小時,從堆棧中發出ENDBLOCK和彈出級別。

這是關於SO 的另一個討論 ,順便說一下。

您還可以在詞法分析器中的某個位置跟蹤第一行之前有多少個標識項並將其傳遞給解析器。 最有趣的部分是試圖正確地將它傳遞給解析器:)如果你的解析器使用lookahead(這里我的意思是解析器可能在它真正匹配之前查詢可變數量的令牌,然后嘗試通過一個全局變量傳遞它)是一個非常糟糕的主意(因為詞法分析器可以在下一行滑動並更改縮進計數器的值,而解析器仍在嘗試解析前一行)。 在許多其他情況下,全局變量也是邪惡的;)用縮進計數器標記第一行“真實”令牌更合理。 我不能給你一個確切的例子(我甚至不知道你將使用什么解析器和lexer生成器,如果有的話......)但是就像在第一行令牌上存儲數據一樣(如果可以的話,它可能會不舒服)很容易從解析器獲取這樣的令牌)或保存自定義數據(將令牌鏈接到縮進的映射,源代碼中的每一行作為索引和縮進值作為元素值的數組)似乎就足夠了。 這種方法的一個缺點是解析器的額外復雜性,需要區分ident值並基於它改變其行為。 像JavaCC的LOOKAHEAD({yourConditionInJava})這樣的東西可以在這里工作,但這不是一個好主意。 你的方法中有很多額外的令牌似乎不那么邪惡的東西:)

作為另一種選擇,我建議將這兩種方法混合使用。 只有當縮進計數器在下一行更改其值時,才可以生成其他標記。 它就像人工BEGIN和END令牌。 通過這種方式,您可以降低從lexer輸入解析器的流中的“人工”令牌數量。 只應調整您的解析器語法以了解其他令牌...

我沒有嘗試過這個(對這些語言解析沒有真正的經驗),只是分享我對可能解決方案的看法。 檢查已經構建的這種語言解析器對您來說非常有價值。 開源是你的朋友;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM