3

jison(Bisonと同等の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として解析される代数構文を最終的に作成したい場合に役立ちます。

ありがとう!

4

1 に答える 1

2

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

したがって、%prec乗算ルールを設定しても、'*'シンボルの優先順位は変更されません。優先順位が競合を解決しようとすると、アクションの削減の優先順位が、シフトされるトークンの優先順位と比較されます。優先順位がないため*、変更すると文法が曖昧になります。

于 2012-02-16T14:26:54.457 に答える