当使用antlr解析XML时,antlr可以验证结束标签与其起点标签匹配吗?ANTLR书中的XML解析器未检查。
我可以想象这样的通用方法(但我自己从未真正尝试过):
tag: openTag = TAG_OPEN content closeTag = TAG_CLOSE { tagsMatch($openTag, $closeTag); }?;
如果标签零件不匹配,您将使用验证谓词使整个规则失败。可能会给您带来错误报告的问题,但可以解决。
对于任意XML标签,上下文免费解析器无法执行此操作。纯状态的antlr本质上是不含上下文的。
您可以破解大多数解析器(可能包括ANTLR)来构建标签堆栈。当<tagname...
被解析时(或者找到方便),您可以在堆栈上按标签名称。解析</tagname...
时,您可以将标签名与堆栈顶部匹配,并在发生不匹配时抱怨。
我在XML解析器中使用了Lexer版本(请参见Bio),似乎很好地工作。