バイソンの優先順位(実際にはジソンを使用していますが、同じでなければなりません)

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

  •  26-10-2019
  •  | 
  •  

質問

私はジソン(バイソンに相当するJavaScript)を使用していますが、次の優先順位の問題があります。計算機デモを使用して説明しますhttp://zaach.github.com/jison/try/

そのままに機能します。優先順位は次のとおりです

%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS

そして文法はです

e
    : e '+' e
        {$$ = $1+$3;}
    | e '-' e
        {$$ = $1-$3;}
    | e '*' e
        {$$ = $1*$3;}
    | e '/' e
        {$$ = $1/$3;}
    | e '^' e
        {$$ = Math.pow($1, $3);}
    | '-' e %prec UMINUS
        {$$ = -$2;}

「*」行を変更した場合

    | e '*' e %prec TIMESPREC
        {$$ = $1*$3;}

優先順位を変更します

%left '+' '-'
%left TIMESPREC '/'
%left '^'
%left UMINUS

もう機能しません。同じように機能するはずではありませんか?これは、最終的に2 x + 3が(2x)+3として解析される代数構文を持っていた場合に役立つ可能性があります。

ありがとう!

役に立ちましたか?

解決

この理由は、からです %prec すべての個々のトークンではなく、ルールの優先順位のみを設定します。したがって、ルールのRHS上のトークンの個々の優先順位は依然として重要です。

だから、設定 %prec 乗算ルールでは、 '*' シンボル。優先順位が競合を解決しようとすると、削減されるアクションの優先順位と、シフトするトークンの優先度を比較します。以来 * 優先されず、文法はあなたの変化に曖昧になります。

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