インフィックス、ポストフィックス、プレフィックス機能などをサポートする言語を作成できなかった理由は何ですか?

StackOverflow https://stackoverflow.com/questions/427040

質問

私は、中置、後置、接頭辞、さらには複数の単語からなる関数の定義を許可することにより、DSLの作成に非常に適した言語の作成について検討しました。たとえば、次のように中置乗算演算子を定義できます(multiplier(X、Y)はすでに定義されています):

a * b => multiply(a,b)

または接尾辞" squared"演算子:

a squared => a * a

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

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

明らかにこのような言語には曖昧さの余地が十分にありますが、静的に型付けされている場合(型推論を使用)、ほとんどの曖昧さを排除でき、残っているものは構文エラーと見なされます(必要に応じて括弧を追加します)。

これが非常に難しい、不可能、または単なる悪い考えになるとは思わない理由がありますか?

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

役に立ちましたか?

解決

これは難しくありません。各演算子に fixity (インフィックス、プレフィックス、またはポストフィックス)と優先順位を割り当てる必要があります。優先順位を実数にします。後で感謝します。優先順位の高い演算子は、優先順位の低い演算子よりも強くバインドします。優先順位が同じレベルであれば、括弧で曖昧さをなくすことができますが、おそらく、いくつかの演算子を連想にして、次のように書くことができます

x + y + z

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

注意が必要な別のケースは、次の場合です

prefix (e) postfix

where prefix postfix の優先順位は同じです。この場合も、曖昧さをなくすために括弧が必要です。

私の論文プレフィックス演算子とポストフィックス演算子を使用した式の解析の後ろにサンプルパーサーがあり、コードをダウンロードできますが、MLで書かれているため、その動作はアマチュアには明らかではないかもしれません。しかし、固定性などのビジネス全体について詳しく説明しています。

他のヒント

操作の順序について何をしますか?

a * b squared

演算子とメソッドへのユニークなアプローチの一種であるScalaをチェックしてください。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top