一件奇怪的事情正在发生。我定义了语法,这是一段摘录。
name
: Letter
| Digit name
| Letter name
;
numeral
: Digit
| Digit numeral
;
fragment
Digit
: [0-9]
;
fragment
Letter
: [a-zA-Z]
;
那么为什么它只显示两行(字母和数字名称)的警告,其中我引用了一个片段而下面的其他内容完全正常......
答案 0 :(得分:5)
Lexer规则标记为fragment
s只能由其他词法规则使用,而不能由解析器规则使用。片段规则永远不会成为他们自己的象征。
请务必了解其中的差异:What does "fragment" mean in ANTLR?
另外,我现在看到你在解析器中做得太多了。规则name
和numeral
应该是词法分析器规则:
Name
: ( Digit | Letter)* Letter
;
Numeral
: Digit+
;
在这种情况下,您无需在任何解析器规则中考虑Space
规则(这是关于您刚删除的最后一个问题)。
答案 1 :(得分:0)
[0-9]
和
[a-zA-Z]
在Antlr中不是有效的正则表达式。 Antlr不使用标准的正则表达式语法。 用
替换它们'0'..'9'
和
('a'..'z' | 'A'..'Z')
你的问题应该消失。