Antlr 是";解析器规则中的隐式令牌定义;有什么好担心的吗?

Antlr 是";解析器规则中的隐式令牌定义;有什么好担心的吗?,antlr,grammar,antlrworks,antlr4,Antlr,Grammar,Antlrworks,Antlr4,我正在用ANTLR和AntlrWorks2创建我的第一个语法。我基本上已经完成了语法本身(它识别用所描述的语言编写的代码,并构建正确的解析树),但除此之外,我还没有开始任何工作 让我担心的是,语法分析器规则中第一次出现的标记都会用黄色的波浪线划线,表示“语法分析器规则中的隐式标记定义” 例如,在该规则中,'var'具有波形: variableDeclaration: 'var' IDENTIFIER ('=' expression)?; 它的确切外观: 奇怪的是,ANTLR本身似乎并不在意这

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

让我担心的是,语法分析器规则中第一次出现的标记都会用黄色的波浪线划线,表示“语法分析器规则中的隐式标记定义”

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

variableDeclaration: 'var' IDENTIFIER ('=' expression)?;
它的确切外观:

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


这是值得担心的还是应该忽略这些警告?我应该在lexer规则中明确声明所有标记吗?官方圣经中的大多数示例似乎都是按照我编写代码的方式完成的。

如果您编写的lexer语法不会跨多个语法分析器使用然后,您可以忽略ANTLRWorks2显示的此警告。

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

此警告(实际上是我创建的)是为了提醒您以下情况:

shiftExpr : ID (('<<' | '>>') ID)?;
number : zero | INTEGER;
zero   : '0'; // <-- this implicit definition causes 0 to get its own token

我正在编写一个组合语法(我喜欢它,比LEX+YACC好得多),但我希望gramar创建一个AST,它将被至少两个树语法使用。这算吗?还有,为什么要投反对票?我不同意这个答案,因为这个警告可以提醒开发人员语法问题,即使标记只在一种语法中使用。我在我的回答中给出了几个例子。好的,谢谢,我会考虑这样做。至于动作代码分离,这是否超出了“组合语法->AST->带动作代码的tree gramar”?我只有v3版的书,所以如果是新的,网上有没有文章解释?org上的在线文档似乎缺少关于v3和v4之间差异的任何信息。antlr 4不再包含output=AST或tree语法。相反,它使用具有侦听器和/或访问者接口的解析树,侦听器和/或访问者接口是根据解析器语法自动生成的。我注意到,当我在解析器规则中意外使用标记为片段的标记时,ANTLRWorks2也会抛出相同的消息。这是故意的,还是应该显示不同的错误?@JonSenchyna通常,令牌类型与lexer规则有1:1的对应关系。但是,标记为
fragment
的lexer规则没有定义令牌类型,因此警告仍然正确-令牌的定义完全是因为解析器规则中引用了具有该名称的内容。如果这不是错误,如何关闭它?Antlr的一个好处是快速原型化,它允许您创建一个结构良好的NL,而无需花费时间预先管理令牌列表。这个警告打破了这一点,因为现在,例如在AntlWorks中,我不得不不断地看虚假的警告,“哦,我不在乎的只是那个愚蠢的警告”。