如何重新排序字符串中的运算符?
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 是反向抛光符号解析器的示例。
我正在尝试重新排序“/”操作数,以便它首先出现
所以 (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 是反向抛光符号解析器的示例。