2016-11-21 99 views

回答

1

我能想象这样一个通用的方法(但从未真正尝试过我自己):

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

你会使用验证断言失败整个规则,如果标签部件不匹配。错误报告可能会给你带来问题,但这可以解决。

+0

$ openTag提供对TAG_OPEN生成的*树*的访问? –

+0

是的,正好(https://github.com/antlr/antlr4/blob/master/doc/actions.md)。也许我们可以直接省略'openTag'和'closeTag'标签并直接使用'$ TAG_OPEN'和'$ TAG_CLOSE'。函数tagsMatch()可以使用目标语言来访问令牌值(例如文本)。 –

+0

是的,这听起来像它会起作用。当你有一棵树时,谁需要堆栈: - ? –

1

对于任意的XML标签,上下文无关的解析器不能做到这一点。处于纯态的ANTLR本质上是上下文无关的。

您可以破解大多数解析器(可能包括ANTLR)来构建标记堆栈。当<tagname...被解析(或者如你发现的那样简化),你可以在堆栈上推送标签名称。当</tagname...被分析/实施时,您可以将标记名匹配到堆栈顶部,并在发生不匹配时发出投诉。

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

+0

谢谢@Ira Baxter,我的用例实际上涉及的不仅仅是验证标签(试图简化问题),所以我希望找到一个上下文相关的解析器。我从[你2011年的一篇SO帖子](http://stackoverflow.com/questions/5126779/parsing-context-sensitive-language)看到你当时没有意识到任何上下文敏感的解析器,自改变了?快速搜索没有任何结果。 – rbinnun

+0

正如我描述的那样,解析解析器会将其转换为上下文相关的解析器,该解码器可以正常工作。如果您愿意,您可以使用设计为上下文相关的解析器(请参阅https://en.wikipedia.org/wiki/Adaptive_grammar中的MetaS条目),但这样做对于破解不会有任何优势。 [你会发现所有的语言前端都是上下文敏感的;他们倾向于使用上下文自由分析以及对上下文敏感部分的附加临时检查)。 –

相关问题