ANTLR 检查匹配 XML 开始和结束标签

ANTLR check for matching XML start and end tags

当使用 ANTLR 解析 XML 时,ANTLR 能否验证结束标记是否与其开始标记匹配? ANTLR 书中的 XML 解析器不会对此进行检查。

对于任意 XML 标记,上下文无关解析器无法执行此操作。纯状态下的 ANTLR 本质上是上下文无关的。

您可以破解大多数解析器(可能包括 ANTLR)来构建标签堆栈。当 <tagname... 被解析(或在您觉得方便时进行词法分析)时,您可以将标签名称压入堆栈。当</tagname...为parsed/lexed时,可以将tagname匹配到栈顶,如果不匹配则报错

我在我的 XML 解析器中使用了词法分析器版本(参见 bio),似乎工作得很好。

我可以想象像这样的通用方法(但我自己从未真正尝试过):

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

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