Antlr 3.2とJava1.6を使用して、英語の入力テキストの測定値を一致させようとしています。次のような字句規則があります。
fragment
MILLIMETRE
: 'millimetre' | 'millimetres'
| 'millimeter' | 'millimeters'
| 'mm'
;
MEASUREMENT
: MILLIMETRE | CENTIMETRE | ... ;
大文字と小文字の入力の任意の組み合わせを受け入れ、さらに重要なことに、MILLIMETREのすべてのバリアントに対して単一の字句トークンを返すことができるようにしたいと思います。しかし、現時点では、私のASTには、入力テキストと同じように、「ミリメートル」、「ミリメートル」、「mm」などが含まれています。
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は実行されますが、T_MILLIMETREではなくASTの入力テキストが表示されます。
私は明らかに、Antlrのように世界をまだ見ていません。誰かが私に何かヒントやアドバイスを教えてもらえますか?
スティーブ
