在处理强大的 AST 声明时,我如何正确格式化快乐



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

有问题的问题是:

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 行错误,我认为这样的事情是原因。

如果你想让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(即 $7 的类型与 fun_block 返回的类型相同(。

最新更新