我正在尝试使用 Antlr 3.2 和 Java1.6 匹配英文输入文本中的测量值。我有如下的词汇规则:
fragment
MILLIMETRE
: 'millimetre' | 'millimetres'
| 'millimeter' | 'millimeters'
| 'mm'
;
MEASUREMENT
: MILLIMETRE | CENTIMETRE | ... ;
我希望能够接受大小写输入的任何组合,并且更重要的是,只需为 MILLIMETRE 的所有变体返回一个词法标记。但目前,我的 AST 包含“毫米”、“毫米”、“毫米”等,就像在输入文本中一样。
阅读http://www.antlr.org/wiki/pages/viewpage.action?pageId=1802308后,我认为我需要执行以下操作:
tokens {
T_MILLIMETRE;
}
fragment
MILLIMETRE
: ('millimetre' | 'millimetres'
| 'millimeter' | 'millimeters'
| 'mm') { $type = T_MILLIMETRE; }
;
但是,当我这样做时,我在 Antlr 生成的 Java 代码中得到以下编译器错误:
cannot find symbol
_type = T_MILLIMETRE;
我尝试了以下方法:
MEASUREMENT
: MILLIMETRE { $type = T_MILLIMETRE; }
| ...
但随后 MEASUREMENT 不再匹配。
带有重写规则的更明显的解决方案:
MEASUREMENT
: MILLIMETRE -> ^(T_MILLIMETRE MILLIMETRE)
| ...
导致 NPE:
java.lang.NullPointerException at org.antlr.grammar.v2.DefineGrammarItemsWalker.alternative(DefineGrammarItemsWalker.java:1555).
将 MEASUREMENT 变成解析器规则会给我带来可怕的“以下标记定义永远无法匹配,因为先前的标记匹配相同的输入”错误。
通过创建解析器规则
measurement : T_MILLIMETRE | ...
我收到警告“没有对应于令牌的词法分析器规则:T_MILLIMETRE”。虽然 Antlr 运行,但它仍然给我 AST 中的输入文本,而不是 T_MILLIMETRE。
我显然还没有像 Antlr 那样看待这个世界。任何人都可以给我任何提示或建议吗?
史蒂夫