gpt4 book ai didi

javascript - bison precedence(实际使用jison但应该是一样的)

转载 作者:行者123 更新时间:2023-11-29 15:01:35 27 4
gpt4 key购买 nike

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

谢谢!

最佳答案

这是因为 %prec 只会设置规则的优先级,而不是所有单个标记。因此,规则 RHS 上标记的个别优先级仍然很重要。

因此,在乘法规则上设置 %prec 不会改变 '*' 符号的优先级。当优先级试图解决冲突时,它会将减少操作的优先级与要移动的 token 的优先级进行比较。由于 * 没有优先级,语法会因您的更改而变得不明确。

关于javascript - bison precedence(实际使用jison但应该是一样的),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9312023/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com