0

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

有问题的问题是:

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

4

1 回答 1

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(即$7与返回的类型相同fun_block)。

于 2015-03-25T08:28:14.433 回答