2

私のDSL変数は動的であり、値が最初に割り当てられたときに作成されます。したがって、これは有効なコードです。

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

私の素朴なアプローチは、このようなルールを持つことです

Identifier:
  ID; // ID from Terminals

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

「次の選択肢は決して一致しない:2」と文句を言って、それは機能しません。生成されたAntlrデバッグ文法には次のルールが含まれているため、理解できます。

ruleAssignable: ruleIdentifier | ruleIdentifier;

(の秘訣は、相互参照に関する質問[Identifier|ID]への回答から来ています。完全に理解せずにコピーしただけです:)また、Xbase文法でどのように解決されるかを調べようとしました。

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

相互参照のみを使用しているようで、新しい変数宣言がどのように処理されるかわかりません。

4

1 に答える 1

1

変数宣言と代入式に同じ構文を使用することは特に良い考えではありません。可能であれば、宣言にキーワードまたは特別な演算子を導入しました。

それができない、またはしたくない場合、難しい方法は、相互参照または単純な識別子のいずれかを決定することです。

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

于 2011-12-08T08:10:28.447 に答える