Antlr语法,解析器规则中的隐式令牌定义

Sav*_*ran 4 parsing antlr definition implicit token

一件奇怪的事情正在发生。我定义了语法,这是节选。

name  
   : Letter                 
   | Digit name              
   | Letter name          
   ;

numeral  
   : Digit                
   | Digit numeral         
   ;

fragment  
Digit  
   : [0-9]  
   ;  

fragment  
Letter  
   : [a-zA-Z]  
   ;
Run Code Online (Sandbox Code Playgroud)

那么为什么它只对我引用一个片段的两行(字母和数字名称)显示警告,而下面的其他行完全正确...

Bar*_*ers 7

您标记为fragment的Lexer规则只能由其他lexer规则使用,而不能由解析器规则使用。片段规则永远不会成为它们自己的标记。

确保您了解其中的区别:ANTLR中的“碎片”是什么意思?

编辑

另外,我现在看到您在解析器中做得太多。规则namenumeral真的应该是一个词法规则:

Name
 : ( Digit | Letter)* Letter
 ;

Numeral
 : Digit+
 ;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您无需Space在任何解析器规则中都考虑一个规则(这是关于您刚刚删除的最后一个问题)。