MPS 2019.2ヘルプ

引用符

引用符は、必要な構造を持つノードを簡単に作成できるようにする言語構成です。もちろん、smodelLanguageを使用してノードを作成してから、同じsmodelLanguageを使用して適切な子、プロパティー、および参照を手動で追加することもできます。ただし、これを実現するためのより簡単で、より視覚的な方法があります。

次の2つの構成要素は同一のノードを構築します。最初の構成要素は引用符を使用し、2番目の計画モデル APIを使用します。

node<IntegerType> node = <int>; node<IntegerType> node2 = new node<IntegerType>();

引用符と軽い引用符は、jetbrains.mps.lang.quotation言語で定義されています。モデルで使用できるようにするには、この言語を使用言語として設定する必要があります。

引用符は式であり、その値は引用符の内側に書かれたMPSノードです。引用を "ノードリテラル"、数値定数や文字列リテラルに似た構造として考えてみましょう。つまり、自分がどのような値を意味しているのかを静的に知っていれば、リテラルを書くことになります。そのため、引用符の中には、ノードに評価される式を書くのではなく、ノード自体を書くのです。たとえば、発現 2 + 35に評価される、発現 < 2 + 3 > は、(傾斜し括弧は引用ブレースある)leftOperandは 整数定数2あるとrightOperandが IntegerConstant 3された状態でノードプラス式に評価されます。

次の2つの構文でも同じASTが作成されます。ここで、引用アプローチによってコードの簡潔さに明らかな利点がもたらされます。

node<PlusExpression> node3 = <2 + 3>;    node<PlusExpression> node4 = new node<PlusExpression>();  node4.leftExpression = new node<IntegerConstant>();  node4.leftExpression : IntegerConstant.value = 2;  node4.rightExpression = new node<IntegerConstant>();  node4.rightExpression : IntegerConstant.value = 3;

Note that using quotation like <Car()> does not call the behavior constructor, while using the smodel constructor like new node<Car>() will do call it.

反引用符

それはリテラルなので、引用符の値は静的に知るべきです。一方、ノードの一部(子、参照先、またはプロパティー)だけを動的に知っている場合、つまり実行時にしか評価できず、設計時にはわからない部分は、使用できません。そのような部分を含むノードを作成するための単なる引用です。

ただし、良いニュースは、ノードの大部分を静的に知っていて、いくつかの部分だけを動的に評価されたノードに置き換えたい場合には、引用符を使用できます。反引用符は、4つのタイプ( 参照財産、およびリストの 引用符)にすることができます。それらはすべて式を含み、動的に評価されて、引用されたノードの一部をその結果で置き換えます。子および参照の対引用符はノードに評価され、プロパティー対引用符は文字列に評価され、リスト対引用符はノードのリストに評価されます。

たとえば、配列リストクラスでClassifierTypeを作成したいが、その型パラメータは動的にしか認識されません。たとえば、"computeMyTypeParameter()"などのメソッドを呼び出すことによってわかります。

<ArrayList <%(computeMyTypeParameter())%>>という式を書きます。ここでの構成%(...)%は節の逆引用符です。

また、それぞれ^(...)^$(...)$を使用して、参照ターゲットとプロパティー値を逆引用符で囲むこともできます。または*(...)*を使用して1つのロールを持つ子供のリスト。

a)引用符で囲まれたノード内のどこかにあるノードを式で評価されたノードに置き換える場合は、ノードの引用符を使用します。つまり、%()%です。ご想像のとおり、引用符で囲まれたノード全体を内部で式を含む引用符で置き換えることは意味がありません。そのような場合は、代わりにそのような式をプログラムに直接記述することができます。

そのため、ノードの引用符は、子供、孫、孫、およびその他の引用ノードの子孫を置き換えるために使用されます。antiquotationの内側の式はノードを返すべきです。そのような引用符を書くには、キャレットを子供用のセルに置き、「%」と入力します。

b)引用符で囲まれたノード内のどこかからの参照のターゲットを式で評価されたノードと置き換える場合は、参照の引用符を使用します。つまり、^(...)^です。このような引用符を書くには、参照先のセルにキャレットを置き、"^" を入力します。

c)複数カーディナリティのロールを持つ子(またはさらに深く位置する子孫)を置き換えたい場合、その理由のためにそれを単一のノードではなくむしろ複数のものと置き換えたい場合は、子リスト(簡潔にするために単純なリスト)を使用します。*()。リストの逆引用符の内側の式はノードのリストを返すべきです。それは* *型です。 nlist <..> * *または互換性のある型(つまり* ** {} list <node <.. >> * *も同様です。このような引用符を書くには、子コレクション内の子のセルにキャレットを置き、「msgstr "空の子コレクションには使用できませんため、押す前に"」と入力して、その中に1人の子を入力する必要があります。

d)クォートされたノードのプロパティー値を動的に計算された値で置き換えたい場合は、プロパティーantiquotation $()$を使用してください。引用符内の式は文字列を返す必要があります。これは、引用符付きノードの逆引用符付きプロパティーの値になります。このような引用符を書くには、プロパティーのセルにキャレットを置き、「$」と入力します。

軽い引用 (引用ビルダー)

ただし、引用符を使用することには欠点があります。例:それ自身の定義で言語の引用を作成しているなら、言語コンパイルの間に特別な取り扱いを必要とするブートストラップサイクルを作成しています(ブートストラップ依存関係の削除を見てください)。軽い引用はそのような課題を排除するのを手助けするだろう代わりのアプローチを提供します。

quot3(英語)

次の2つの構文は、一方は引用符を使用し、他方は軽い引用符を使用しています。

node<IntegerType> node1 = <int>;  node<IntegerType> node2 = <IntegerType()>;

直接モデル APIの使用箇所とは異なり、軽い引用はより深い階層に便利に使用できます。

node<PlusExpression> node3 = <2 + 3>;  node<PlusExpression> node4 = <PlusExpression(    leftExpression: IntegerConstant(value: 2),    rightExpression: IntegerConstant(value: 3))>;
最終更新日: 2019年8月30日