sách gpt4 ai đã đi

Có thể làm cho ngữ pháp YACC này trở nên rõ ràng không? biểu thức: . .. |biểu thức biểu thức

In lại 作者:行者123 更新时间:2023-12-02 13:07:08 33 4
mua khóa gpt4 Nike

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

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

biểu thức
: 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) 这样的表达式。

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

1 Câu trả lời

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

很明显,减法是有意的(否则减法将无法表示),因此如果第二个 biểu thức 上有必要禁止产生式 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/

33 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com