我正在尝试为一种语言创建一个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
返回的类型相同(。