12

私はJavaScript AST用のプリティプリンターを実装しています.演算子の優先順位と結合性に基づいて、最小限の括弧で式を自動的に括弧で囲む「適切な」アルゴリズムを誰かが知っているかどうか尋ねたいと思いました. Google で役立つ資料は見つかりませんでした。

明らかなことは、親の優先順位が高い演算子は括弧で囲む必要があるということです。たとえば、次のようになります。

(x + y) * z // x + y has lower precedence

ただし、結合しない演算子もいくつかあります。その場合は、括弧が必要です。次に例を示します。

x - (y - z) // both operators have the same precedence

この後者の場合の最良のルールは何だろうと思っています。除算と減算では、rhs 部分式の優先順位がそれ以下の場合は括弧で囲む必要があります。

4

3 に答える 3

3

特定の文法の規則に依存します。優先順位が異なる演算子には適切であり、減算と除算には適切だと思います。

ただし、べき乗は、右側のオペランドが最初に評価されるという点で、異なる方法で処理されることがよくあります。だからあなたが必要です

 (a ** b) ** c

c がルートの右の子の場合。

括弧がどちらに行くかは、文法規則の定義によって決まります。あなたの文法が次の形式である場合

exp = sub1exp ;
exp = sub1exp op exp ;
sub1exp = sub1exp ;  
sub1exp = sub1exp op1 sub2exp ;
sub2exp = sub3exp ;
sub2exp = sub3exp op2 sub2exp ;
sub3exp = ....
subNexp = '(' exp ')' ;

op1 と op2 が関連付けられていない場合、サブツリーのルートも op1 である場合は op1 の右側のサブツリーを括弧で囲み、左側のサブツリーにルート op2 がある場合は op2 の左側のサブツリーを括弧で囲みます。

于 2012-12-13T04:21:23.100 に答える