gpt4 book ai didi

c - 解决 yacc 冲突 - 由于冲突规则在解析器中无用

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:37 25 4
gpt4 key购买 nike

我正在处理 yacc 文件以解析给定文件并将其转换为等效的 C++ 文件。我根据提供的语法图创建了以下语法:

program:    PROGRAMnumber id 'is' comp_stmt
;

comp_stmt: BEGINnumber statement symbol ENDnumber
;

statement: statement SEMInumber statement
| id EQnumber expression
| PRINTnumber expression
| declaration
;

declaration: VARnumber id
;

expression: term
;

term: term as_op term
| MINUSnumber term
| factor
;

factor: factor md_op factor
| ICONSTnumber
| id
| RPARENnumber expression LPARENnumber
;

as_op: PLUSnumber
| MINUSnumber
;

md_op: TIMESnumber
| DIVnumber
;

symbol: SEMInumber
| COMMAnumber
;

id: IDnumber
| id symbol id
;

唯一剩下的问题是我在尝试使用 yacc 进行编译时收到此错误。

conflicts: 14 shift/reduce
calc.y:103.17-111.41: warning: rule useless in parser due to conflicts: declaration: VARnumber id

我已经解决了我遇到的唯一的其他冲突,但我不确定这个冲突的解决方案是什么。它应该匹配的行的格式是

var a, b, c, d;

var a;

最佳答案

您所有旨在派生列表的产品都是不明确的,因此会产生减少/减少冲突。例如:

 id: id symbol id

当有三个标识符时会明显有歧义:是先减去前两个,还是后两个?通常的列表习惯用法是左递归:

id_list: id | id_list `,` id

对于大多数语言来说,这对于以分号终止而不是以分号分隔的语句来说是不正确的,但该模型适用于逗号-分隔的标识符列表,或用于加法运算符的左关联序列。

对于语句,您可能需要更像:

statement_list: | statement_list statement ';' 

说到symbol,你真的相信;具有相同的句法功能吗?这似乎不太可能,因为你写的是 var a, b, c, d; 而不是,例如 var a; b, c; d,.

bison产生的“无用规则”警告正是因为你的语法允许id用分号分隔。当解析器将 "var"ID; 视为先行时,它首先将 ID 减少为 id 然后需要决定是将 var id 缩减为 declaration 还是移动 ; 以便稍后将其缩减为 symbol然后进行id symbol id的归约。在没有优先规则的情况下,野牛总是解决移位/减少冲突以支持移位,所以这就是它在这种情况下所做的。但结果是,永远不可能将 "var"id 减少为 declaration,由于 shift-reduce 冲突解决,使得生产变得无用,这更或更少的警告内容。

关于c - 解决 yacc 冲突 - 由于冲突规则在解析器中无用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35809478/

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