我对ANTLR4还是很陌生,现在我想了解我们可能会用它定义哪种语法。
据我所知,ANTLR中有两种规则: 解析器规则 (小写单词)和 词法分析器规则 (大写单词)。例:
grammar Test;
init: prog(','prog)*;
prog: A
| prog
;
A: [a-z]+;
从语法生成规则的角度来看,我要说的是,解析器规则是NON-TERMINAL符号,可以用词法分析器规则定义的一系列标记替换。
因此,很明显,语法根据定义是上下文无关的。语法产生的语言的字母缩写包含所有由小写拉丁字母组成的单词。
问题: 我们可以使用定义非上下文无关的语法ANTLR4
吗?
是。 (咳嗽)。
据我了解,您可以将代码添加到规则中。任意代码可以测试任意事物,因此答案为“是”。总的来说,我认为您无法使用ANTLR做到这一点,但这对于许多有趣的特殊情况(例如,接受除质数之外的所有数字字符串)来说非常实用。
没有。
我认为,如果您遵守ANTLR允许的语法规范,答案是“否”。实际上,您可以使用ANTLR“指定”上下文无关的语法来说明它不能正确处理,这对于大多数解析器生成器都是如此。(对于ANTLR,这包括具有间接左递归,歧义,任意超前等的语法。)我们甚至甚至将大多数此类解析器生成器称为其“限制”,例如LL(1),LALR(k)等。
。
哪些可以完全释放上下文?
一些解析器生成器可以处理完全上下文无关的语法。Earley和CYK解析器浮现在脑海,但它们的速度不是很快,因此人们倾向于避免使用它们。GLR解析器可以做到这一点(我们在工具中使用了它,因为它确实有助于编写真实语言的语法(请参见我的简历),但是有些语法会使它们变得非常慢;您可以避免这些语法。显然,GLL解析方案存在并且也完全没有上下文;我希望它们也会因使用一些过时的语法而出现性能问题,而且在实践中也非常有用。
我听说过的唯一可以执行多种上下文相关语法的解析器生成器是MetaS。我从未使用过它,但是其背后的理论令人印象深刻。声称它可以执行任意上下文相关的语法;对于任意讨厌的语法,这将花费极高的成本,但是实际上这并不是反对。
我为计算表达式编写了一个非常简单的语法定义: 我尝试了无效表达式by,但它通过了。看起来字符被忽略了。这里有什么问题?
我想开发一个部署目标为iOS 6.0的应用程序。如果我只使用Swift,它会工作吗?还是我也需要编写Objective-C代码?
我已经实现了一个基于lucene的软件来索引超过1000万的人名,这些人名可以用不同的方式书写,比如“Luíz”和“Luis”。索引是使用各个标记的语音值创建的(创建了一个自定义分析器)。 目前,我正在使用QueryParser查询一个给定的名称,结果很好。但是,在《Lucene in Action》一书中提到,SpanarQuery可以使用标记的接近性来改进我的查询。我对名称的非拼音索引使用了S
本文向大家介绍我们可以在Java中使用此关键字调用方法吗?,包括了我们可以在Java中使用此关键字调用方法吗?的使用技巧和注意事项,需要的朋友参考一下 Java中的“ this”关键字在实例方法或构造函数中用作对当前对象的引用。是的,您可以使用它来调用方法。但是,您只能从实例方法(非静态)中调用它们。 示例 在下面的示例中,Student类具有一个私有变量名称,具有setter和getter方法,
问题内容: 我可以使用Markdown在段落上定义类名吗?如果是这样,怎么办? 问题答案: Dupe:如何在Markdown中设置HTML类属性? 本机?不是,但… 不,Markdown的语法不能。您可以通过Markdown Extra 设置ID值。 如果愿意,可以使用常规HTML,并添加属性以继续在HTML元素内进行markdown转换。但这需要Markdown Extra。 可能的解决方案:(