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); }?;
如果标记部分不匹配,您将使用验证谓词使整个规则失败。可能会给您带来错误报告的问题,但这可以解决。
当使用 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); }?;
如果标记部分不匹配,您将使用验证谓词使整个规则失败。可能会给您带来错误报告的问题,但这可以解决。