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

How to re-order operators in a String?

我正在尝试重新排序“/”操作数,以便它首先出现

所以 (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。您可以定义自己的解析器并将它们组合起来生成Node的嵌套结构,然后处理嵌套结构。

您似乎想要解析字符串以润色符号。 Here 是反向抛光符号解析器的示例。