【发布时间】:2010-09-30 22:34:57
【问题描述】:
我正在尝试使用 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 那样看待这个世界。有人可以给我任何提示或建议吗?
史蒂夫
【问题讨论】:
标签: antlr antlr3 lexical-analysis