野牛优先(实际上使用jison但它应该是相同的)

时间:2012-02-16 13:22:30

标签: javascript bison jison

我正在使用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。

谢谢!

1 个答案:

答案 0 :(得分:2)

原因是%prec只会设置规则的优先级,而不会设置所有单个令牌。因此,关于规则的RHS的令牌的个别优先权仍然很重要。

因此,在乘法规则上设置%prec不会改变'*'符号的优先级。当优先级尝试解决冲突时,它会将reduce actions priority与要移位的令牌的优先级进行比较。由于*没有优先权,因此语法会因您的更改而变得模棱两可。