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

Mat*_*ský 27 grammar antlr antlrworks antlr4

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

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

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

variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
Run Code Online (Sandbox Code Playgroud)

它看起来如何:

在此输入图像描述

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

是担心还是应该忽略这些警告?我应该在词法分析器规则中明确声明所有令牌吗?官方圣经"定义ANTLR参考"中的大多数exaples 似乎完全按照我编写代码的方式完成.

Sam*_*ell 23

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

这个警告是由我实际创建的,以提醒您以下情况:

shiftExpr : ID (('<<' | '>>') ID)?;
Run Code Online (Sandbox Code Playgroud)

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

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

  • 解析器规则包含拼写错误的令牌引用.如果没有警告,这可能会导致无法创建可能永远不会匹配的其他令牌.
  • 解析器规则包含无意的令牌引用,如下所示:

    number : zero | INTEGER;
    zero   : '0'; // <-- this implicit definition causes 0 to get its own token
    
    Run Code Online (Sandbox Code Playgroud)