2012-02-16 7 views
3

jison(Bisonのjavascript相当版)を使用していますが、次の優先順位の問題があります。私は電卓のデモを使って説明します http://zaach.github.com/jison/try/bisonの優先順位(実際にはjisonを使用していますが、同じである必要があります)

それはそのまま動作します。優先順位は

であると私は

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

ことと

%left '+' '-' 
%left TIMESPREC '/' 
%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;} 

ですこれ以上動作しません。同じことをしなければならないのでしょうか?例えば、2 x + 3が(2x)+3として解析される代数構文を最終的に得たい場合など、これは有用である。

ありがとうございます!

答えて

2

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

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

+0

ありがとう、それは理由を説明します!今、2 * x + 3の代わりに2 x + 3のようなものを許可したい場合、正しい解決策は何ですか?ありがとう – user1213898

+0

これを可能にするには、基本的に文法を書き直さなければなりません。それは重大な問題ではなく、単にルール内の '*'を削除して優先順位を設定することはできません。競合が発生するためです。本質的に、 '%prec'はこれであなたの問題を解決することはありません。ちなみに、upvoteや答えを受け入れるより感謝の言葉を言う良い方法はありません:) – Dervall

関連する問題