當使用ANTLR來解析XML時,ANTLR可以驗證結束標記是否與其開始標記匹配? ANTLR書中的XML解析器不檢查這一點。ANTLR檢查是否匹配XML開始和結束標記
回答
我能想象這樣一個通用的方法(但從未真正嘗試過我自己):
tag: openTag = TAG_OPEN content closeTag = TAG_CLOSE { tagsMatch($openTag, $closeTag); }?;
你會使用驗證斷言失敗整個規則,如果標籤部件不匹配。錯誤報告可能會給你帶來問題,但這可以解決。
對於任意的XML標籤,上下文無關的解析器不能做到這一點。處於純態的ANTLR本質上是上下文無關的。
您可以破解大多數解析器(可能包括ANTLR)來構建標記堆棧。當<tagname...
被解析(或者如你發現的那樣簡化),你可以在堆棧上推送標籤名稱。當</tagname...
被分析/實施時,您可以將標記名匹配到堆棧頂部,並在發生不匹配時發出投訴。
我在我的XML解析器中使用了詞法分析器版本(請參閱bio),似乎工作得很好。
謝謝@Ira Baxter,我的用例實際上涉及的不僅僅是驗證標籤(試圖簡化問題),所以我希望找到一個上下文相關的解析器。我從[你2011年的一篇SO帖子](http://stackoverflow.com/questions/5126779/parsing-context-sensitive-language)看到你當時沒有意識到任何上下文敏感的解析器,自改變了?快速搜索沒有任何結果。 – rbinnun
正如我描述的那樣,解析解析器會將其轉換爲上下文相關的解析器,該解碼器可以正常工作。如果您願意,您可以使用設計爲上下文相關的解析器(請參閱https://en.wikipedia.org/wiki/Adaptive_grammar中的MetaS條目),但這樣做對於破解不會有任何優勢。 [你會發現所有的語言前端都是上下文敏感的;他們傾向於使用上下文自由分析以及對上下文敏感部分的附加臨時檢查)。 –
- 1. BNF語法匹配開始標記和結束標記
- 2. XML開始和結束標記
- 3. 開始和結束標記不匹配:元行4和頭
- 4. 正則表達式 - 匹配開始和結束標記
- 5. 解析器錯誤:開始和結束標記不匹配:
- 6. XSLT離開開始和結束標記
- 7. REGEX C#(匹配開始和結束詞)
- 8. 匹配字開始和結束
- 9. 變化AngularJS開始和結束標記
- 10. 如何搜索帶有匹配結束標記的xml標記?
- 11. 遇到沒有匹配開始標記的結束標記「表」。您的開始/結束標籤是否適當平衡?
- 12. 遭遇結束標記「tr」,沒有匹配的開始標記。您的開始/結束標籤是否適當平衡?
- 13. 記事本++匹配pl sql開始和結束塊
- 14. 正確匹配結束標記與HTML中的開始標記與RegEx
- 15. 檢查開始和結束日期
- 16. RSS - 開始和結束標籤不匹配 - 爲什麼?
- 17. 蟒蛇泡沫肥皂調用開始和結束標記名稱不匹配
- 18. Eclipse IDE中是否沒有結束標記匹配?
- 19. ANTLR匹配到輸入結束
- 20. 語法錯誤:匹配開始/結束
- 21. 檢查鼠標彈出是否結束
- 22. 查找用戶定義的開始和結束標記
- 23. jQuery的搜索開始標記和結束標記字符串
- 24. 開始標記和結束標記之間的線條
- 25. ANTLR檢查commontree是否正確或如何檢查給定的輸入是否匹配ANTLR語法?
- 26. 結束標記「Window.Resourses」不匹配
- 27. 在Ruby中匹配結束標記
- 28. 必須XML結束標記名稱與XML結束標記名稱完全匹配嗎?
- 29. 功能,確保HTML開始和結束標記是正確的
- 30. 正則表達式匹配XML字符串在C#中有開始和結束標記
$ openTag提供對TAG_OPEN生成的*樹*的訪問? –
是的,正好(https://github.com/antlr/antlr4/blob/master/doc/actions.md)。也許我們可以直接省略'openTag'和'closeTag'標籤並直接使用'$ TAG_OPEN'和'$ TAG_CLOSE'。函數tagsMatch()可以使用目標語言來訪問令牌值(例如文本)。 –
是的,這聽起來像它會起作用。當你有一棵樹時,誰需要堆棧: - ? –