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 回答