【发布时间】:2016-11-30 07:38:43
【问题描述】:
我对 Haskell 和函数式编程很陌生,如果这个问题看起来简单或愚蠢,请原谅。
我有一个用于生成抽象语法树的简单语言的解析器。为了使 AST 变平(将 while 和 if 语句转换为跳转),我需要在树中放置标签。问题是我不知道下一个标签应该是什么(我仍然在思考,因为如果我有状态,这些都不是问题)。
我目前的功能如下:
transform :: Stmt -> FStmt
transform (Seq stmt) = FSeq (map transform stmt)
transform (Assign var val) = FAssign var val
transform (While cond stmt) = FWhile "label1" (Jumpf cond "label2") (transform stmt) (Jump "label1") "label2"
transform (If cond stmt1 stmt2) = FIf (Jumpf cond "label") (transform stmt1) "label" (transform stmt2)
在其当前状态下,该函数“扁平化”AST,但不会尝试放置正确的标签(它对每个构造都使用相同的字符串)。
基本上问题在于,对于顺序语句(并且每个程序都是顺序语句),我想不出一种方法来传递应该在标签中使用的下一个值。
提前谢谢你。
【问题讨论】:
标签: haskell abstract-syntax-tree