1 回答
使用注释跟踪每个产品的类型将帮助您跟踪类型错误。
这里每个产品应该有的类型:
Production Type
-------------- ---------
ProcedureHeading Procedure
ProcedureDeclaration Procedure
ProcedureDeclarationList [ Procedure ]
DeclarationSequence [ Procedure ]
ProcedureBody Maybe Procedure
现在检查每个生产规则以查看它们是否具有正确的类型。
ProcedureHeading
以更改的名称返回defaultProcedure
,所以没关系。ProcedureDeclaration
返回调用的结果addProcedureToProcedure
,以便签出。请注意,addProcedureToProcedure
调用的第二个参数是$3
指ProcedureBody
生产的结果,因此这意味着该生产的返回类型必须是 aMaybe Procedure
。ProcedureDeclarationList
有问题。生产规则应为:ProcedureDeclarationList : ProcedureDeclaration { [ $1 ] } | ProcedureDeclaration ';' ProcedureDeclarationList { $1 : $3 }
[$1]
从单个过程中创建一个列表,并将$1:$3
单个过程添加到过程列表中。
DeclarationSequence
只是一个ProcedureDeclarationList
,所以检查出来。如步骤 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]
,所以这不会在这里工作。