が、私は私のようなルールに合致していますいくつかの非予約キーワードを持って、それに割り当てられます:複数の代替案は、最後には何も
kFOO = {self.input.LT(1).text.lower() == 'foo'}? ID;
ID
トークンが標準である場合には、英数字文字列。生成されたパーサで
some_rule
@after { do_something_with($t.text) }
: t=kWORD1
| t=kWORD2
| t=kWORD3
;
は、
kWORD1
と
kWORD2
ルール関数は何も返しませんが、
kWORD3
機能はありません:ルールのこれらの種類は、私がこのような何かをしようとする場合を除いて、素晴らしい仕事します。同様に、
some_rule
関数では、
kWORD3
と一致しようとしているブロックだけが戻り値を
t
に割り当てます。他の2つの呼び出しは決して
t
を参照しません。
(また、私は仕事に次の期待が、それはしませんでした、私は同じ根本的な理由のために疑いがある。
some_rule
@after { do_something_with($t.text) }
: t=(kWORD1
| kWORD2
| kWORD3)
;
何も任意の条件でt
に割り当てられていないされます。)
しかし、次のことは期待通りに機能します。
some_rule
@after { do_something_with($t1.text or $t2.text or $t3.text) }
: t1=kWORD1
| t2=kWORD2
| t3=kWORD3
;
それぞれの一致する関数が生成されて値を返し、キーワードに一致する各ブロックsome_rule
の規則では、ラベルに戻り値が割り当てられます。このソリューションの問題は、いくつかの代替案がある場合には少し過剰になることです。
私の半分は "BUG!"これは私がやった最初のantlrプロジェクトなので、私が理解していないものがある可能性が高いです。
私はここで何をしようとしているのですか? .toLower()
はFOO
と一致したことがないという事実に加えて
FWIW Cターゲットでも同じ動作が見られます。 –
ええ、私はターゲット依存の問題ではないと思います。 –