2011-12-05 22 views
2

私のDSL変数は動的ですが、最初に値が割り当てられたときに作成されます。だから、これは有効なコードは次のとおりです。Xtext文法を使用した動的変数の処理

a = 0 
b = 2 // new variable created 
a = 3 // existing variable reassigned 

私の素朴なアプローチは、「:2を以下の選択肢がマッチすることはできません」文句を言う、それは動作しません。この

Identifier: 
    ID; // ID from Terminals 

Assignable: 
    {Assignable} ref=[Identifier|ID] | 
    {Assignable} newVar=Identifier; 

のようなルールを持つことです。生成されたANTLRデバッグ文法はルールが含まれているので、理解しやすいです:

ruleAssignable: ruleIdentifier | ruleIdentifier; 

[Identifier|ID]のトリックはquestion on cross-referencingへの応答から来て、私はちょうど私もそれが解決していますか完全に理解しようとした:)完全に理解せずに、それをコピーしました。

{XAssignment} /* (declaringType=[types::JvmDeclaredType] '::')? */ feature=[types::JvmIdentifiableElement|ValidID] OpSingleAssign value=XAssignment 

相互参照のみを使用しているようで、新しい変数宣言の処理方法はわかりません。

答えて

1

変数宣言と代入式に同じ構文を使用することは特にお勧めできません。可能であれば、私は宣言にキーワードまたは特殊演算子を導入しました。

できない場合やそうしたくない場合は、相互参照または単純な識別子のどちらかを決定するのが難しいでしょう。

初めての場合は、未解決の参照のエラーメッセージを無効にする必要があります。 後者を選択する場合、コンテンツアシストとハイパーリンクを手動で行う必要があります。

+0

これはcoffeescriptの既存の文法なので変更できません。私はあなたの答えから、相互参照の方が簡単で、割り当てのコンテキストでエラーメッセージを無効にするという印象を受けます。 –

+0

はい、それはあまり効果がないようです。 –

関連する問題