Я пытаюсь сопоставить измерения в английском тексте ввода, используя Antlr 3.2 и Java1.6.У меня есть лексические правила, такие как:
fragment
MILLIMETRE
: 'millimetre' | 'millimetres'
| 'millimeter' | 'millimeters'
| 'mm'
;
MEASUREMENT
: MILLIMETRE | CENTIMETRE | ... ;
Я бы хотел принять любую комбинацию ввода прописных и строчных букв и, что более важно, просто вернуть один лексический токен для всехварианты МИЛЛИМЕТРА.Но на данный момент мой AST содержит «миллиметр», «миллиметр», «мм» и т. Д., Как во входном тексте.
После прочтения http://www.antlr.org/wiki/pages/viewpage.action?pageId=1802308, я думаю, что мне нужно сделать что-то вродеследующее:
tokens {
T_MILLIMETRE;
}
fragment
MILLIMETRE
: ('millimetre' | 'millimetres'
| 'millimeter' | 'millimeters'
| 'mm') { $type = T_MILLIMETRE; }
;
Однако, когда я делаю это, я получаю следующие ошибки компилятора в коде Java, сгенерированном Antlr:
cannot find symbol
_type = T_MILLIMETRE;
Вместо этого я попробовал следующее:
MEASUREMENT
: MILLIMETRE { $type = T_MILLIMETRE; }
| ...
но тогда ИЗМЕРЕНИЕ больше не сопоставляется.
Более очевидное решение с правилом перезаписи:
MEASUREMENT
: MILLIMETRE -> ^(T_MILLIMETRE MILLIMETRE)
| ...
вызывает NPE:
java.lang.NullPointerException at org.antlr.grammar.v2.DefineGrammarItemsWalker.alternative(DefineGrammarItemsWalker.java:1555).
Превращение ИЗМЕРЕНИЯ в правило синтаксического анализатора вызывает у меня ужас: «Следующие определения токенов никогда не могут быть сопоставлены, поскольку предыдущие токены совпадают с одним и тем же входным сигналом».* Я получаю предупреждение "нет правила лексера, соответствующего токену: T_MILLIMETRE".Хотя Antlr запускается, но он все равно дает мне входной текст в AST, а не в T_MILLIMETRE.
Я, очевидно, еще не вижу мир, как это делает Antlr.Кто-нибудь может дать мне какие-нибудь советы или советы, пожалуйста?
Стив