2016-11-21 100 views

回答

1

我能想象這樣一個通用的方法(但從未真正嘗試過我自己):

tag: openTag = TAG_OPEN content closeTag = TAG_CLOSE { tagsMatch($openTag, $closeTag); }?; 

你會使用驗證斷言失敗整個規則,如果標籤部件不匹配。錯誤報告可能會給你帶來問題,但這可以解決。

+0

$ openTag提供對TAG_OPEN生成的*樹*的訪問? –

+0

是的,正好(https://github.com/antlr/antlr4/blob/master/doc/actions.md)。也許我們可以直接省略'openTag'和'closeTag'標籤並直接使用'$ TAG_OPEN'和'$ TAG_CLOSE'。函數tagsMatch()可以使用目標語言來訪問令牌值(例如文本)。 –

+0

是的,這聽起來像它會起作用。當你有一棵樹時,誰需要堆棧: - ? –

1

對於任意的XML標籤,上下文無關的解析器不能做到這一點。處於純態的ANTLR本質上是上下文無關的。

您可以破解大多數解析器(可能包括ANTLR)來構建標記堆棧。當<tagname...被解析(或者如你發現的那樣簡化),你可以在堆棧上推送標籤名稱。當</tagname...被分析/實施時,您可以將標記名匹配到堆棧頂部,並在發生不匹配時發出投訴。

我在我的XML解析器中使用了詞法分析器版本(請參閱bio),似乎工作得很好。

+0

謝謝@Ira Baxter,我的用例實際上涉及的不僅僅是驗證標籤(試圖簡化問題),所以我希望找到一個上下文相關的解析器。我從[你2011年的一篇SO帖子](http://stackoverflow.com/questions/5126779/parsing-context-sensitive-language)看到你當時沒有意識到任何上下文敏感的解析器,自改變了?快速搜索沒有任何結果。 – rbinnun

+0

正如我描述的那樣,解析解析器會將其轉換爲上下文相關的解析器,該解碼器可以正常工作。如果您願意,您可以使用設計爲上下文相關的解析器(請參閱https://en.wikipedia.org/wiki/Adaptive_grammar中的MetaS條目),但這樣做對於破解不會有任何優勢。 [你會發現所有的語言前端都是上下文敏感的;他們傾向於使用上下文自由分析以及對上下文敏感部分的附加臨時檢查)。 –

相關問題