Antlr语法,解析器规则中的隐式标记定义

时间:2014-07-21 10:08:39

标签: parsing antlr token definition implicit

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

name  
   : Letter                 
   | Digit name              
   | Letter name          
   ;

numeral  
   : Digit                
   | Digit numeral         
   ;

fragment  
Digit  
   : [0-9]  
   ;  

fragment  
Letter  
   : [a-zA-Z]  
   ;

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

2 个答案:

答案 0 :(得分:5)

Lexer规则标记为fragment s只能由其他词法规则使用,而不能由解析器规则使用。片段规则永远不会成为他们自己的象征。

请务必了解其中的差异:What does "fragment" mean in ANTLR?

修改

另外,我现在看到你在解析器中做得太多了。规则namenumeral应该是词法分析器规则:

Name
 : ( Digit | Letter)* Letter
 ;

Numeral
 : Digit+
 ;

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

答案 1 :(得分:0)

[0-9] 

[a-zA-Z] 

在Antlr中不是有效的正则表达式。 Antlr不使用标准的正则表达式语法。 用

替换它们
'0'..'9'

('a'..'z' | 'A'..'Z') 

你的问题应该消失。