如何重新排序字符串中的运算符?

问题描述:

我试图使其显示第一如何重新排序字符串中的运算符?

所以(1 + y)/(1 + 2z)^2转化为

/(1+y)(1+2z)^2 

此代码以重新排序“/”操作数实现这一点:

object ast extends App { 

    val s: List[String] = "1 + y/1 + 2z ^2".split(" ").toList; 

    val removeOperatorsToBeReordered : List[String] = { 
    s.filter(f => !f.contains("/")) 
    } 

    "/" :: removeOperatorsToBeReordered foreach(println) 

} 

但是,这是一个简单的测试情况下,并且不为(1 + X)/(1个+ y)的迎合/(1 + 2Z)^ 2为 '/' 加到明确使用("/" :: removeOperatorsToBeReordered)

(1 + x)/(1 + y)/(1 + 2z)^2应该产生/ (1 + x) (/(1 + y)/(1 + 2z))^2

我需要某种形式的AST此:

val generateAST = { 
    case class Node(operand: String, leftOperator: String, rightOperator: String) 
    } 
+0

你需要编写一个解析器,从字符串中产生一个“表达式”AST。然后,从中缀转换为前缀将会很简单。 – Jubobs

+0

是的,你需要某种AST。你目前的名单甚至不关心括号。 – Bergi

你可以解析字符串为节点语法树。

看看scala parser combinators。您可以定义自己的解析器并将它们组合起来,以生成节点的嵌套结构,然后处理嵌套结构。

好像要解析字符串波兰记号。 Here是逆波兰标记解析器的一个例子。