gpt4 book ai didi

grammar - 是否有可能使这个 YACC 语法明确?表达式 : . .. |表达式 表达式

转载 作者:行者123 更新时间:2023-12-02 13:07:08 32 4
gpt4 key购买 nike

我正在用 yacc/bison 编写一个简单的计算器。

表达式的语法看起来有点像这样:

expr
: NUM
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '+' expr %prec '*' { $$ = $1; }
| '-' expr %prec '*' { $$ = $1; }
| '(' expr ')' { $$ = $2; }
| expr expr { $$ = $1 '*' $2; }
;

我已经像这样声明了运算符的优先级。

%left '+' '-'
%left '*' '/'
%nonassoc '('

问题出在最后一条规则上:

expr expr { $$ = $1 $2; }

我想要这个规则,因为我希望能够在计算器中编写像 5(3+4)(3-24) 这样的表达式。

是否可以使这个语法变得明确?

最佳答案

这种歧义是由于您允许一元运算符 (- expr),因此 2 - 2 可以被解析为简单的减法(产生 0)或作为隐式乘积(2 和 -2,产生 -4)。

很明显,减法是有意的(否则减法将无法表示),因此如果第二个 expr 上有必要禁止产生式 expr: expr expr右侧是一元运算。

这不能通过优先级声明来完成(或者至少不能以明显的方式完成),因此最好的解决方案是显式地写出语法,而不依赖于优先级来消除歧义。

您还必须准确确定隐式乘法的优先级:与显式乘法/除法相同或更强。这会影响 ab/cd 的解析方式。据我所知,还没有达成共识,所以这或多或少取决于你。

在下文中,我假设隐式乘法结合得更紧密。我还确保 -ab 被解析为 (-a)b,尽管 -(ab) 具有相同的最终结果(直到您开始处理诸如非算术类型和自动转换之类的事情)。所以就拿它来举例吧。

term: NUM
| '(' expr ')'
unop: term
| '-' unop
| '+' unop
conc: unop
| conc term
prod: conc
| prod '*' conc
| prod '/' conc
expr: prod
| expr '+' prod
| expr '-' prod

关于grammar - 是否有可能使这个 YACC 语法明确?表达式 : . .. |表达式 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33196809/

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