我正在使用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。
谢谢!
答案 0 :(得分:2)
原因是%prec
只会设置规则的优先级,而不会设置所有单个令牌。因此,关于规则的RHS的令牌的个别优先权仍然很重要。
因此,在乘法规则上设置%prec
不会改变'*'
符号的优先级。当优先级尝试解决冲突时,它会将reduce actions priority与要移位的令牌的优先级进行比较。由于*
没有优先权,因此语法会因您的更改而变得模棱两可。