0
4

1 回答 1

1

使用注释跟踪每个产品的类型将帮助您跟踪类型错误。

这里每个产品应该有的类型:

Production                            Type
--------------                        ---------
ProcedureHeading                      Procedure
ProcedureDeclaration                  Procedure
ProcedureDeclarationList              [ Procedure ]
DeclarationSequence                   [ Procedure ]
ProcedureBody                         Maybe Procedure

现在检查每个生产规则以查看它们是否具有正确的类型。

  1. ProcedureHeading以更改的名称返回defaultProcedure,所以没关系。

  2. ProcedureDeclaration返回调用的结果addProcedureToProcedure,以便签出。请注意,addProcedureToProcedure调用的第二个参数是$3ProcedureBody生产的结果,因此这意味着该生产的返回类型必须是 a Maybe Procedure

  3. ProcedureDeclarationList有问题。生产规则应为:

    ProcedureDeclarationList
      : ProcedureDeclaration                              { [ $1 ] }
      | ProcedureDeclaration ';' ProcedureDeclarationList { $1 : $3 }
    

[$1]从单个过程中创建一个列表,并将$1:$3单个过程添加到过程列表中。

  1. DeclarationSequence只是一个ProcedureDeclarationList,所以检查出来。

  2. 如步骤 2 中所述,ProcedureBody必须是Maybe Procedure. for 的规则KW_END很好,但第二条规则需要一些工作:

    ProcedureBody
        | KW_END                     { Nothing }
        | DeclarationSequence KW_END { ??? }
    

从 a DeclarationSequence(这是 a [Procedure])我们必须产生 a Maybe Procedure。这就是你的问题所在。Just $1有 type Maybe [Procedure],所以这不会在这里工作。

于 2016-05-04T20:48:53.333 回答