Parsing 无法解决以下减少错误(LALR解析)
我目前正在实现Decaf编程语言语法的一部分。以下是bison代码的相关片段: 然而,当我开始研究名称产生式规则时,我的解析器就给出了reduce警告 下面是bison生成的.output文件中的内容:Parsing 无法解决以下减少错误(LALR解析),parsing,bison,yacc,lalr,bisonc++,Parsing,Bison,Yacc,Lalr,Bisonc++,我目前正在实现Decaf编程语言语法的一部分。以下是bison代码的相关片段: 然而,当我开始研究名称产生式规则时,我的解析器就给出了reduce警告 下面是bison生成的.output文件中的内容: State 84 23 type: ID . 61 name: ID . ID reduce using rule 23 (type) LS reduce using rule 23 (type) LS [redu
State 84
23 type: ID .
61 name: ID .
ID reduce using rule 23 (type)
LS reduce using rule 23 (type)
LS [reduce using rule 61 (name)]
$default reduce using rule 61 (name)
所以,如果我们给下面的输入{abc[1]=abc;},它说语法错误,意外数字,预期的RS.NUMBER基本上来自表达式规则,它必须如何解析它,尽管它试图通过局部变量decl规则解析它
为了解决这个问题,你认为应该改变什么?花了大约2个小时,尝试了不同的东西,但没有成功
谢谢
注:这里是完整的.y源代码的示例这是一个常见问题的特定实例,解析器在获得足够信息之前被迫做出决定。在某些情况下,如本例,所需的信息并不遥远,如果可能的话,增加前瞻性就足够了。不幸的是,很少有解析器生成器生成k>1的LRk解析器,bison也不例外。通常的解决方案是简单地允许解析继续进行,而无需做出决定。另一个解决方案是使用bison,但仅在C模式下,要求使用%glr解析器,这对于何时需要以额外处理时间为代价来解决缩减问题更为灵活 在这种情况下,上下文允许类型或名称,两者都可以以ID后跟[LS]开头。如果是名称,[后面必须跟一个数字;如果是类型,[后面必须跟一个数字)。因此,如果我们可以看到ID后面的第二个标记,我们可以立即做出决定 但我们只能看到前面的一个标记,即“.”,语法坚持认为我们能够立即做出决定,因为在一种情况下,我们必须将ID缩减为名称,在另一种情况下,必须将ID缩减为类型。因此,我们有一个reduce-reduce冲突,bison总是使用语法文件中最先出现的缩减来解决该冲突 一种解决方案是避免以复制产品为代价强迫做出这种选择。例如:
type_other:
INT
| ID LS RS
| type_other LS RS
;
type: ID
| type_other
;
name_other:
THIS
| ID LS expression RS
| name_other DOT ID
| name_other LS expression RS
;
name: ID
| name_other
;
type_other:
INT
| ID LS RS
| type_other LS RS
;
type: ID
| type_other
;
name_other:
THIS
| ID LS expression RS
| name_other DOT ID
| name_other LS expression RS
;
name: ID
| name_other
;