5

私は、中置、後置、前置、または複数の単語で構成される関数の定義を許可することで、DSL の作成に非常に適した言語を作成することを熟考してきました。たとえば、中置乗算演算子を次のように定義できます (multiply(X,Y) は既に定義されています)。

a * b => multiply(a,b)

または、後置の「二乗」演算子:

a squared => a * a

または、変数が散在する 2 つのキーワードを含む C または Java スタイルの三項演算子:

a ? b : c => if a==true then b else c

明らかに、そのような言語にはあいまいさの余地がたくさんありますが、(型推論で) 静的に型付けされている場合、ほとんどのあいまいさは排除され、残っているものは構文エラーと見なすことができます (括弧を追加することで修正されます)。適切な)。

これを非常に困難にする、不可能にする、または単に悪い考えにする理由があるとは思いませんか?

編集:多くの人が、これまたはこのようなことを行う可能性のある言語を指摘してくれましたが、実際には、独自のパーサーを実装する方法、またはそうする場合に発生する可能性のある問題へのポインターに興味があります。

4

4 に答える 4

15

これはそれほど難しいことではありません。各演算子に固定(中置、接頭辞、または接尾辞)と優先順位を割り当てる必要があります。優先順位を実数にします。後で感謝します。優先順位の高い演算子は、優先順位の低い演算子よりも緊密にバインドされます。優先順位が同じ場合は、括弧を使用して曖昧性解消を要求できますが、次のように記述できるように、一部の演算子を結合可能にすることをお勧めします。

x + y + z

括弧なし。各演算子の固定性、優先順位、および結合性を取得したら、演算子優先順位パーサーを作成する必要があります。この種のパーサーは、かなり単純に記述できます。トークンを左から右にスキャンし、1つの補助スタックを使用します。ドラゴンブックには説明がありますが、ドラゴンブックが演算子の優先順位解析の非常に一般的なケースを説明していることもあり、これが非常に明確であるとは思いませんでした。しかし、私はあなたがそれを難し​​いと思うことはないと思います。

あなたが注意したいもう一つのケースはあなたが持っているときです

prefix (e) postfix

ここでprefix、とpostfixは同じ優先順位を持ちます。この場合も、曖昧性解消のために括弧が必要です。

私の論文「接頭辞と接尾辞の演算子を使用した式の解析解除」の背面にはパーサーの例があり、コードをダウンロードできますが、MLで記述されているため、その動作はアマチュアにはわかりにくい場合があります。しかし、固定などのビジネス全体が非常に詳細に説明されています。

于 2009-01-09T05:15:35.637 に答える
2

作戦の順番はどうする?

a * b squared
于 2009-01-09T04:32:03.807 に答える
1

演算子とメソッドに対する一種のユニークなアプローチを持つ Scala をチェックしてみてください。

于 2009-01-09T04:45:58.363 に答える
0

Haskellには、まさにあなたが探しているものがあります。

于 2009-01-09T04:14:28.100 に答える