如何在String中重新排序运算符?

时间:2016-03-08 17:49:54

标签: scala abstract-syntax-tree

我正在尝试重新排序'/'操作数,使其首先出现

所以(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)
  }

1 个答案:

答案 0 :(得分:0)

您可以将字符串解析为节点的语法树。

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

好像你想要解析字符串以打磨表示法。 Here是反向抛光表示法解析器的一个示例。