Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 无法解决以下减少错误(LALR解析)_Parsing_Bison_Yacc_Lalr_Bisonc++ - Fatal编程技术网

Parsing 无法解决以下减少错误(LALR解析)

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

我目前正在实现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        [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
  ;