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