変数の制約をチェックするための小さなDSLを設計しようとしています。現時点での私の文法は次のようになります。
Start:
varDeclarations += XVariableDeclaration*
rules+=Constraint*;
Constraint:
{Constraint}
'FOR' 'PAYLOAD' payload=PAYLOAD 'ELEMENT' element=ID 'CONSTRAINED BY' constraint=XExpression;
PAYLOAD:
"SimulationSessionEvents"
|"stacons"
|"any"
;
値を入力として受け取り、それを制約に含まれる唯一の変数(宣言された唯一の変数でもある)にマップし、制約が満たされているかどうかを確認する、1つのメソッドのみを含むクラスのインスタンスを生成したいと思います。
これらのインスタンスは、別のクラスによって使用されます。別のクラスは、各インスタンスに値を渡し、その制約が満たされているかどうかを確認します。
私が見ているように、私には2つの選択肢があります。
制約クラスのコードを明示的に生成します。この場合
XBaseCompiler
、式評価コードを生成するために使用できます。ただし、メモリ内のオブジェクトを直接作成する方法がある場合は、これらのクラスを何らかの方法でロードする必要がありますが、これはエレガントではないようです。を使用
ModelInferrer
して、他のクラスに渡すことができるオブジェクトをメモリ内に直接生成するため、クラスをロードする必要はありません。この場合、xbase式の評価コードを生成する方法がわかりません。
すべてのxtextドキュメント/チュートリアルを読み、例を試してみた後、次の質問が残ります。
スケーラビリティの観点から「最良の」アプローチはどれですか(後で文法や彼が生成したクラスの関数を拡張したいと思うかもしれません)?ModelInferrerのアプローチに従うとしたら、どの程度正確に対処できますか?これを行う他の方法はありますか?
どんな助けでも大歓迎です