我需要转换使用的算术序列 这种类型:
type expr =
VarX
| VarY
| Sine of expr
| Cosine of expr
| Average of expr * expr
| Times of expr * expr
| Thresh of expr * expr * expr * expr
以下是其中所有内容的定义:
e ::= x | y | sin (pi*e) | cos (pi*e) | ((e + e)/2) | e * e | (e<e ? e : e)
需要转换这样的内容:
exprToString (Thresh(VarX,VarY,VarX,(Times(Sine(VarX),Cosine(Average(VarX,VarY))))));;
到此:
string = "(x<y?x:sin(pi*x)*cos(pi*((x+y)/2)))"
我知道我必须通过将每个expr与其相应的字符串进行匹配来递归地执行此操作,但我不确定函数开始匹配的位置或如何通过它进行递归。任何帮助或线索将不胜感激
答案 0 :(得分:1)
以下是您可能需要的简化版本:
type expr =
| VarX
| Sine of expr
let rec exprToString = function
| VarX -> "x"
| Sine e -> "sin(" ^ exprToString e ^ ")"
let () = print_endline (exprToString (Sine (Sine (Sine (Sine VarX)))))
它在AST节点上进行递归,并通过连接节点的字符串表示来创建输入的字符串表示。
这种方法可能不适用于更大的现实世界的例子,因为:
(^)
从两个字符串创建一个新字符串,这比使用一些更合适的数据结构(如Buffer.t
(2*(2*(2*2)))
,而不是2*2*2*2
。如果要最小化括号数,则算法必须了解运算符优先级和连接性。