将表达式更改为字符串

时间:2015-01-26 21:34:34

标签: ocaml

我需要转换使用的算术序列 这种类型:

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与其相应的字符串进行匹配来递归地执行此操作,但我不确定函数开始匹配的位置或如何通过它进行递归。任何帮助或线索将不胜感激

1 个答案:

答案 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。如果要最小化括号数,则算法必须了解运算符优先级和连接性。