回答
根據您的問題,我假設你正在寫自己的遞歸下降解析器的壓痕敏感的語言。
之前我已經嘗試過使用基於縮進的語言,並且我通過保持跟蹤當前縮進級別的狀態和兩個與縮進匹配的不同終端來解決問題。它們都匹配縮進單位(比如兩個空格或一個製表符)並對它們進行計數。我們調用匹配的縮進級別matched_indentation
和當前縮進級別expected_indentation
。
對於第一個,我們稱之爲indent
:
- 如果
matched_indentation < expected_indentation
,這是一個dedent
,而比賽是失敗的。 - if
matched_indentation == expected_indentation
,這場比賽是成功的。匹配器消耗縮進。 - 如果
matched_indentation > expected_indentation
,你有一個語法錯誤(從無處縮進的縮進),並應該像這樣處理它(拋出一個異常或其他東西)。
對於第二個,我們稱之爲dedent
:
如果
matched_indentation < expected_indentation
,匹配成功。您將expected_indentation
減1,但不會消耗輸入。這樣可以鏈接多個dedent
終端以關閉多個範圍。如果
matched_indentation == expected_indentation
,匹配成功,並且這次你消耗輸入(這是最後的dedent
終端,所有範圍都關閉)。如果
matched_indentation > expected_indentation
,匹配只是失敗,您在這裏沒有dedent
。
這些端子和非終端之後你希望增加縮進應該由一個增加expected_indentation
。
比方說,要實現一個Python類if語句(我將使用EBNF般的符號),它會是這個樣子:
indented_statement : indent statement newline;
if_statement : 'if' condition ':' newline indented_statement+ dedent ;
現在讓我們來看看下面的一段碼,也假設一個if_statement
是你statement
規則的一部分:
1|if cond1: <- expected_indentation = 0, matched_indentation = 0
2| if cond2: <- expected_indentation = 1, matched_indentation = 1
3| statement1 <- expected_indentation = 2, matched_indentation = 2
4| statement2 <- expected_indentation = 2, matched_indentation = 2
5| <- expected_indentation = 2, matched_indentation = 0
- 在第一次四行,你會成功匹配
indent
終端 - 就上線,你會在那裏你把你的
indent
和dedent
終端匹配兩個dedent
終端,關閉這兩個範圍,並導致與expected_indentation = 0
有一件事你應該小心的是。在這種情況下,我們不需要if_statement
規則中的一個規則,因爲它是statement
,而indented_statement
已經期望有一個縮進。
還要介意你如何對待換行符。一種選擇是將它們作爲一種語句終結符來使用,另一種是讓它們先於縮進,所以選擇最適合您的語言。
- 1. 遞歸下降解析器
- 2. Erlang中的遞歸下降解析器
- 3. Java中的遞歸下降解析器
- 4. 遞歸下降解析
- 5. 遞歸下降解析器 - ClassCastException
- 6. Haskell - 遞歸下降解析器
- 7. Shunting-Yard VS遞歸下降解析器
- 8. 遞歸下降解析器EBNF在PHP
- 9. 解析+和*通過遞歸下降
- 10. 遞歸下降解析和語法樹
- 11. 遞歸下降解析和antlr
- 12. 在遞歸下降解析器中縮短活動模式
- 13. 麻煩理解遞歸下降解析
- 14. 遞歸下降解析器:如何找到FIRST,FOLLOW和PREDICT集?
- 15. 將FIRST和FOLLOW集合編碼爲遞歸下降解析器
- 16. 幫助... LL語法和遞歸下降解析器
- 17. 遞歸下降解析器容易獲得解釋
- 18. 遞歸下降vs遞歸上升解析
- 19. 遞歸下降解析器的C程序
- 20. 關於遞歸下降解析器的複雜性
- 21. 遞歸下降vs.生成的解析器 - 效率
- 22. 遞歸下降解析器來自BNF的僞代碼
- 23. 遞歸回溯makeChange
- 24. 遞歸回溯Haskell
- 25. Java中的數獨求解器,使用回溯和遞歸
- 26. 爲什麼不能遞歸下降解析器處理左遞歸
- 27. 如何編寫遞歸下降解析器?
- 28. C遞歸下降解析器示例C
- 29. 遞歸下降解析器 - 添加單元化變量
- 30. K&R遞歸下降解析器錯誤
謝謝男人:P永遠很有幫助,如何poeple處理這個! –