我对 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)
Run Code Online (Sandbox Code Playgroud)
在当前状态下,该函数“展平”了 AST,但不会尝试放置正确的标签(它对每个构造使用相同的字符串)。
基本上问题在于,在顺序语句(每个程序都是顺序语句)的情况下,我想不出一种方法来传递应该在标签中使用的下一个值。
先感谢您。