“解析器规则中的隐式标记定义”值得担心吗?

问题描述 投票:0回答:3

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

令我担心的是,解析器规则中第一次出现的标记都带有黄色曲线下划线,表示“解析器规则中的隐式标记定义”。

例如,在这条规则中,

'var'
有这样的波浪线:

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

它到底是什么样子的:

enter image description here

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

有什么值得担心的还是我应该忽略这些警告?我应该在词法分析器规则中显式声明所有标记吗?官方圣经中的大多数示例权威的 ANTLR 参考似乎完全按照我编写代码的方式完成。

antlr grammar antlrworks antlr4
3个回答
31
投票

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

此警告是(实际上是我)创建的,旨在提醒您注意以下情况:

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

由于 ANTLR 4 鼓励将操作代码编写在目标语言的单独文件中,而不是将它们直接嵌入到语法中,因此能够区分

<<
>>
非常重要。如果没有为这些运算符显式创建标记,它们将被分配任意类型,并且没有命名常量可用于引用它们。

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

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

    number : zero | INTEGER;
    zero   : '0'; // <-- this implicit definition causes 0 to get its own token
    

2
投票

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


0
投票

这可能是一个虚假错误。在这种情况下,修复方法是右键单击解析器文件并选择

Generate ANTLR Recognizer

© www.soinside.com 2019 - 2024. All rights reserved.