37

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

让我担心的是,解析器规则中每个第一次出现的标记都带有黄色曲线下划线,上面写着“解析器规则中的隐式标记定义”。

例如,在这条规则中,'var'有那个曲线:

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

它看起来如何:

在此处输入图像描述

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

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

4

2 回答 2

30

我强烈建议在任何重要的代码中更正此警告的所有实例。

此警告是(实际上是由我创建的)警告您以下情况:

shiftExpr : ID (('<<' | '>>') ID)?;

由于 ANTLR 4 鼓励将动作代码写入目标语言的单独文件中,而不是将它们直接嵌入语法中,因此能够区分<<和是很重要的>>。如果没有为这些运算符显式创建标记,它们将被分配任意类型,并且没有命名常量可用于引用它们。

此警告还有助于避免以下有问题的情况:

  • 解析器规则包含拼写错误的标记引用。如果没有警告,这可能会导致创建一个可能永远不会匹配的附加令牌。
  • 解析器规则包含无意的标记引用,例如:

    number : zero | INTEGER;
    zero   : '0'; // <-- this implicit definition causes 0 to get its own token
    
于 2013-04-19T13:34:17.957 回答
2

如果您正在编写不会在多个解析器语法中使用的词法分析器语法,那么您可以忽略 ANTLRWorks2 显示的此警告。

于 2013-04-19T13:11:12.807 回答