gpt4 book ai didi

scala - Scala 解析器组合器的运算符优先级

转载 作者:行者123 更新时间:2023-12-02 12:03:52 30 4
gpt4 key购买 nike

我正在研究需要考虑运算符优先级的解析逻辑。我的需求并不太复杂。首先,我需要乘法和除法比加法和减法具有更高的优先级。

例如:1 + 2 * 3 应视为 1 + (2 * 3)。这是一个简单的例子,但你明白了!

[我需要将更多自定义标记添加到优先级逻辑中,我可以根据此处收到的建议添加这些标记。]

以下是处理运算符优先级的一个示例:http://jim-mcbeath.blogspot.com/2008/09/scala-parser-combinators.html#precedencerevisited .

还有其他想法吗?

最佳答案

这比 Jim McBeath 的示例要简单一些,但它可以满足您所说的需要,即正确的算术优先级,并且还允许使用括号。我改编了Scala 编程中的示例,使其能够实际进行计算并提供答案。

这应该是不言自明的。有一个层次结构,通过说 expr 由散布着运算符的 terms 组成,terms 由带有运算符的 factors 组成、和因子是 float 或括号中的表达式。

import scala.util.parsing.combinator.JavaTokenParsers

class Arith extends JavaTokenParsers {

type D = Double

def expr: Parser[D] = term ~ rep(plus | minus) ^^ {case a~b => (a /: b)((acc,f) => f(acc))}
def plus: Parser[D=>D] = "+" ~ term ^^ {case "+"~b => _ + b}
def minus: Parser[D=>D] = "-" ~ term ^^ {case "-"~b => _ - b}
def term: Parser[D] = factor ~ rep(times | divide) ^^ {case a~b => (a /: b)((acc,f) => f(acc))}
def times: Parser[D=>D] = "*" ~ factor ^^ {case "*"~b => _ * b }
def divide: Parser[D=>D] = "/" ~ factor ^^ {case "/"~b => _ / b}
def factor: Parser[D] = fpn | "(" ~> expr <~ ")"
def fpn: Parser[D] = floatingPointNumber ^^ (_.toDouble)

}

object Main extends Arith with App {
val input = "(1 + 2 * 3 + 9) * 2 + 1"
println(parseAll(expr, input).get) // prints 33.0
}

关于scala - Scala 解析器组合器的运算符优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11533547/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com