バイソンの優先順位(実際にはジソンを使用していますが、同じでなければなりません)
-
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
乗算ルールでは、 '*'
シンボル。優先順位が競合を解決しようとすると、削減されるアクションの優先順位と、シフトするトークンの優先度を比較します。以来 *
優先されず、文法はあなたの変化に曖昧になります。
所属していません StackOverflow