我正在用ANTLR和ANTLRWorks 2创建我的第一个语法。我主要完成了语法本身(它识别用所描述语言编写的代码并构建正确的解析树),但我还没有开始做任何事情。
令我担心的是,解析器规则中每个第一次出现的令牌都带有下划线,并带有“解析器规则中的隐式令牌定义”。
例如,在此规则中,'var'
具有该波形:
variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
它看起来如何:
奇怪的是,ANTLR本身似乎并不介意这些规则(在进行测试装备测试时,我在解析器生成器输出中看不到任何这些警告,只是关于我的安装不正确的Java版本机器),所以只是ANTLRWorks抱怨。
是否需要担心或者我应该忽略这些警告?我应该在词法分析器规则中明确声明所有令牌吗?官方圣经The Defintive ANTLR Reference中的大多数exaples似乎完全按照我编写代码的方式完成。
答案 0 :(得分:20)
我强烈建议您在任何重要的代码中更正此警告的所有实例。
这个警告(实际上是由我创建的)提醒您注意以下情况:
shiftExpr : ID (('<<' | '>>') ID)?;
由于ANTLR 4鼓励将动作代码写入目标语言的单独文件中,而不是直接将它们嵌入到语法中,因此能够区分<<
和>>
非常重要。如果没有为这些运算符显式创建标记,则会为它们分配任意类型,并且没有命名常量可用于引用它们。
此警告还有助于避免以下有问题的情况:
解析器规则包含无意的令牌引用,如下所示:
number : zero | INTEGER;
zero : '0'; // <-- this implicit definition causes 0 to get its own token
答案 1 :(得分:0)
如果您正在编写不会在多个解析器grammmar中使用的词法分析器语法,那么您可以忽略ANTLRWorks2所显示的此警告。