使用算术表达式的解析树,如何在Haskell中生成中缀表达式作为结果

时间:2011-03-13 20:33:08

标签: haskell tree expression-trees haskell-platform

以下是树定义:data Tree = Leaf Char | Node (Char, Tree, Tree)

我想以下列形式编写一个函数treeToInfix

treeToInfix :: Tree -> String

以下是一些例子:

treeToInfix (Node ('*', (Node ('+', (Leaf 'a'), (Leaf 'b'))), (Leaf 'c'))) 
-- =>  "(a+b)*c"

treeToInfix (Node ('-', (Node ('+', (Leaf 'a') ,(Leaf 'b'))), (Leaf 'c')))
-- =>  "a+b-c"

treeToInfix (Node ('-', (Leaf 'c'), (Node ('+', (Leaf 'a') ,(Leaf 'b')))))
-- =>  "c-(a+b)"

treeToInfix (Node ('*', (Node ('/', (Leaf 'a'), (Leaf 'b'))), (Node ('/', (Leaf 'c'), (Leaf 'd'))))) 
-- =>  "a/b*c/d"

treeToInfix (Node ('+', (Node ('-', (Leaf 'a'), (Node ('*', (Leaf 'b'), (Leaf 'c'))))), (Node ('/', (Leaf 'd'), (Leaf 'e'))))) 
-- =>  "a-b*c+d/e"

我需要有关此程序算法的帮助。

2 个答案:

答案 0 :(得分:1)

鉴于这看起来像是你的作业,我只是提出一个大致的想法。每个运算符都有一个优先级(可能还有关联性)。这可以简单地表示为数字。那么,这个想法是打印上下文的关联性作为附加参数。所以你的功能可能如下所示:

treeToInfix :: Tree -> String
treeToInfix tr = treeAux 0 tr


treeAux :: Int -> Tree -> String
treeAux prec (Node ("+",left,right)) = 
  -- TODO:
  --   * let's say precedence of '+' is 5
  --   * generate strings for children (with prec = 5)
  --   * put "+" in between
  --   * if prec > 5, put parantheses around the result
-- Similar for other cases 

您甚至可以通过改变传递给递归调用的优先级来实现关联性。

答案 1 :(得分:0)

好吧,如果你考虑一下,操作的每个阶段都需要:

  1. 为左操作数生成字符串
  2. 为运营商生成字符串
  3. 为右操作数生成字符串
  4. 以正确的顺序将它们粘合在一起
  5. 请注意,为左右操作数生成字符串只是树到字符串函数的另一个应用程序,因此您可以递归编码。您没有递归定义的基本情况将是如何显示Leaf。

    如果你想确保只在操作符优先需要时插入括号,它会稍微复杂一点,但我假设你不介意在函数结果中有一些额外的,严格来说不必要的括号。 / p>

    这有足够的帮助吗?我试图避免只是给你代码,以防它是一个家庭作业问题。我还假设你理解递归,因为它是Haskell的关键技能。如果您不理解递归,请告诉我,我会写更多。