“解析器规则中的隐式令牌定义”需要担心吗?

时间:2013-04-19 10:28:07

标签: antlr grammar antlrworks antlr4

我正在用ANTLR和ANTLRWorks 2创建我的第一个语法。我主要完成了语法本身(它识别用所描述语言编写的代码并构建正确的解析树),但我还没有开始做任何事情。

令我担心的是,解析器规则中每个第一次出现的令牌都带有下划线,并带有“解析器规则中的隐式令牌定义”。

例如,在此规则中,'var'具有该波形:

variableDeclaration: 'var' IDENTIFIER ('=' expression)?;

它看起来如何:

enter image description here

奇怪的是,ANTLR本身似乎并不介意这些规则(在进行测试装备测试时,我在解析器生成器输出中看不到任何这些警告,只是关于我的安装不正确的Java版本机器),所以只是ANTLRWorks抱怨。

是否需要担心或者我应该忽略这些警告?我应该在词法分析器规则中明确声明所有令牌吗?官方圣经The Defintive ANTLR Reference中的大多数exaples似乎完全按照我编写代码的方式完成。

2 个答案:

答案 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所显示的此警告。