2011-08-15 3 views
2

が、私は私のようなルールに合致していますいくつかの非予約キーワードを持って、それに割り当てられます:複数の代替案は、最後には何も

kFOO = {self.input.LT(1).text.lower() == 'foo'}? ID; 

IDトークンが標準である場合には、英数字文字列。生成されたパーサで

some_rule 
@after { do_something_with($t.text) } 
    : t=kWORD1 
    | t=kWORD2 
    | t=kWORD3 
    ; 

は、 kWORD1kWORD2ルール関数は何も返しませんが、 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と一致したことがないという事実に加えて

+1

FWIW Cターゲットでも同じ動作が見られます。 –

+0

ええ、私はターゲット依存の問題ではないと思います。 –

答えて

1

、 私は、これはkWORD1がkWORD2などの別のタイプですが、うまくいくかもしれない何かが、このあることに起因していると考えている。しかしテストされていない

kWORD [String pre] 
: {self.input.LT(1).text.lower() == $pre}? ID; 

some_rule 
@after { do_something_with($t.text) } 
    : t=kWORD['word1'] 
    | t=kWORD['word2'] 
    | t=kWORD['word3'] 
    ; 

+0

haha​​ 'lower()== 'FOO''ええ、私はそれを修正します。 –

+0

これは一般的なキーワードの良いアプローチです。私は文法のkFOOのようなたくさんの行を持っています。私はこれでこれをすべて置き換えることができました。ありがとう! –

+0

私は 'kWORD [String pre]:ID {$ ID。 text == $ pre}? ; over 'kWORD [文字列pre]:{self.input.LT(1).text.lower()== $ pre}? ID;は可読性を重視していますが、パフォーマンスはわかりません。 – stryba

関連する問題