如何重新排序字符串中的运算符?
问题描述:
我试图使其显示第一如何重新排序字符串中的运算符?
所以(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)
}
答
你可以解析字符串为节点语法树。
看看scala parser combinators。您可以定义自己的解析器并将它们组合起来,以生成节点的嵌套结构,然后处理嵌套结构。
好像要解析字符串波兰记号。 Here是逆波兰标记解析器的一个例子。
你需要编写一个解析器,从字符串中产生一个“表达式”AST。然后,从中缀转换为前缀将会很简单。 – Jubobs
是的,你需要某种AST。你目前的名单甚至不关心括号。 – Bergi