是的。(咳嗽)。
据我了解,您可以将代码添加到规则中。任意代码可以测试任意事物,因此答案为“是”。通常,我认为您无法使用ANTLR做到这一点,但是对于许多有趣的特殊情况(例如,接受除质数之外的所有数字字符串),这是非常实用的。
不。
我认为,如果您遵守ANTLR允许的语法规范,答案是“否”。实际上,您可以使用ANTLR“指定”上下文无关的语法来说明它不能正确处理,这对于大多数解析器生成器都是如此。(对于ANTLR,这包括具有间接左递归,歧义,任意先行等的语法。)我们甚至甚至将大多数此类解析器生成器称为其“限制”,例如LL(1),LALR(k)等。 。
哪些可以完全释放上下文?
一些解析器生成器可以处理完全上下文无关的语法。Earley和CYK解析器浮现在脑海,但它们的速度不是很快,因此人们倾向于避免使用它们。GLR解析器可以做到这一点(我们之所以在工具中使用它,是因为它确实有助于编写真实语言的语法(请参阅我的简历),但是有些语法会使它们变得非常慢;您大都可以避免使用这些语法。显然,GLL解析方案存在且存在也完全没有上下文;我希望它们在使用一些过时的语法时也会遇到性能问题,但在实践中也非常有用。
我听说过的唯一可以执行多种上下文相关语法的解析器生成器是MetaS。我从未使用过它,但是其背后的理论令人印象深刻。声称它可以执行任意上下文相关的语法;对于任意讨厌的语法,这将花费极高的成本,但是实际上这并不是反对。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句