【问题标题】:How do I properly format happy when dealing with robust AST declarations?在处理健壮的 AST 声明时如何正确格式化快乐?
【发布时间】:2015-03-24 20:01:50
【问题描述】:

我正在尝试为一种语言创建词法分析器和解析器,但当涉及到一些更“健壮”的抽象语法树定义时,我很难理解确切的语法。

问题是:

fun_declaration : FUN ID param_list ':' type '{' fun_block '}' 
                 { M_fun ($2, [$3], $5, $7) }
fun_block : declarations fun_body                   { [$1] [$2] }

M_fun的定义如下:

M_fun (String,[(String,Int,M_type)],M_type,[M_decl],[M_stmt])

如您所见,$2 与字符串相关,$3 将返回 [(String,Int,M_Type)],$5 将返回 M_Type,但 $7 是问题所在。它返回一个 [M_decl], [M_stmt]。上面的语法正确吗?快乐的文件编译没有抱怨,但是当我编译 .hs 文件后,它爆炸了大约 2000 行错误,我认为是这样的原因。

【问题讨论】:

    标签: haskell abstract-syntax-tree happy


    【解决方案1】:

    如果您希望fun_block 产生式返回([M_decl], [M_stmt]),您需要在相关的haskell 代码中正确构造一个。你有:

    { [$1] [$2] }
    

    这不是一个有效的表达式。我相信你应该有:

    { ( [$1], [$2] ) }
    

    然后您需要将M_fun的类型定义更改为

    M_fun (String,[(String,Int,M_type)],M_type,([M_decl],[M_stmt]))
    

    这样M_fun 的最后一个参数(即$7fun_block 返回的类型相同)。

    【讨论】:

    • 谢谢,但这不会返回 M_fun (String,[(String,Int,M_type)],M_type,([M_decl],M_stmt])) 类型的数据类型而不是 M_fun (字符串,[(字符串,Int,M_type)],M_type,[M_decl],[M_stmt])?或者,haskell 会发现它们不是按照它试图创建的数据类型配对的吗?
    • 它将返回 ( [ A ], [ B ] ) where A` 的类型,即 declarations 的类型,即$1Bfun_body 的类型,即$2。我不知道这是否是您想要的类型,因为您还没有发布 fun_block 生产的类型声明。在任何情况下,您都必须确保fun_block 产生式的haskell 代码中的表达式类型与fun_block(如果有)的类型定义中给出的类型相匹配,并且与所有需要的类型相匹配。使用fun_block 定义。
    • 由于您将fun_declaration 的类型定义为M_fun (String,[(String,Int,M_type)],M_type,[M_decl],[M_stmt]),因此您不能使用表达式M_fun ($2, [$3], $5, $7) 构造M_fun,因为给M_fun 的元组应该是5 元组,不是 4 进制。但是,您可以通过将M_fun 的定义更改为M_fun (String,[(String,Int,M_type)],M_type,([M_decl],[M_stmt])) 来解决此问题。请注意之前 M_fun 的最后两个参数周围的附加括号,使 M_fun 成为 4 进制而不是 5 进制,(我认为)使其与 fun_block 传递的类型匹配。
    猜你喜欢
    • 2010-12-04
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多