Parsing ANTLR检查匹配的XML开始和结束标记

Parsing ANTLR检查匹配的XML开始和结束标记,parsing,antlr,antlr4,Parsing,Antlr,Antlr4,当使用ANTLR解析XML时,ANTLR能否验证结束标记与其开始标记匹配?ANTLR手册中的XML解析器没有检查这一点。对于任意XML标记,上下文无关的解析器不能这样做。纯状态下的ANTLR本质上是上下文无关的 您可以攻击大多数解析器(可能包括ANTLR)来构建标记堆栈。当我可以想象这样一种通用方法(但我自己从未尝试过): 如果标记部分不匹配,您将使用验证谓词使整个规则失败。可能会给您带来错误报告方面的问题,但这是可以解决的。谢谢@Ira Baxter,我的用例实际上涉及的不仅仅是验证标记(试图

当使用ANTLR解析XML时,ANTLR能否验证结束标记与其开始标记匹配?ANTLR手册中的XML解析器没有检查这一点。

对于任意XML标记,上下文无关的解析器不能这样做。纯状态下的ANTLR本质上是上下文无关的


您可以攻击大多数解析器(可能包括ANTLR)来构建标记堆栈。当
我可以想象这样一种通用方法(但我自己从未尝试过):


如果标记部分不匹配,您将使用验证谓词使整个规则失败。可能会给您带来错误报告方面的问题,但这是可以解决的。

谢谢@Ira Baxter,我的用例实际上涉及的不仅仅是验证标记(试图使问题简单),所以我希望找到一个上下文敏感的解析器。我从中了解到,您当时不知道有任何上下文敏感的解析器,这是否已经改变了?快速搜索并没有发现任何问题。如我所述,对解析器进行黑客攻击会将其转换为上下文敏感的解析器,这种解析器可以很好地用于此目的。如果愿意,您可以使用设计为上下文敏感的解析器(请参阅中的MetaS条目),但这不会比黑客有任何优势。[您会发现所有语言前端都是上下文敏感的;它们倾向于使用上下文无关解析,并对上下文敏感部分进行额外的特别检查)。$openTag提供对TAG_OPEN生成的树的访问?是的,正是()。可能我们可以省略
openTag
closeTag
标签,直接使用
$TAG\u OPEN
$TAG\u CLOSE
函数。函数tagsMatch()可以使用目标语言访问令牌值(例如文本)。是的,这听起来确实可行。当您有树时,谁需要堆栈:-?
tag: openTag = TAG_OPEN content closeTag = TAG_CLOSE { tagsMatch($openTag, $closeTag); }?;