当使用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()可以使用目标语言来访问令牌值(例如文本)。 –
是的,这听起来像它会起作用。当你有一棵树时,谁需要堆栈: - ? –