我有以下规则:
property : NAME;
value : STRING | NUMBER;
NUMBER : ('0'..'9')+;
NAME : ('a'..'z' | 'A'..'Z' | '0'..'9' | '-' | '_')+;
STRING : '"' (~'"')* '"';
当一个属性是一个数字时,ANTLR说:
line 1:14 mismatched input '5' expecting NAME
我理解为什么会发生这种情况。NUMBER
规则在NAME
规则之前被提及,因此它具有优先级。该数字由NUMBER
规则识别。
在ANTLR中处理此问题的常见方法是什么?我可以如下重写property
规则,但我真的不知道这是否是个好主意,因为我正在引入冗余。
property : NAME | NUMBER;
重新排序NUMBER
和NAME
也不是一个好主意,因为这将打破数字的value
规则(同样的问题)。
需要注意的是:我是ANTLR的新手,还在学习。
是的,property : NAME | NUMBER;
就是这样做的方法。