我如何使用scala组合器来获取诸如((0)+0)之类的字符串并使其成为每个括号,我将以递归的方式将2的幂用于括号内部。 (0)+ 0 = 2 ^ 2 ^ 0 = 5.我如何获取输入字符串并产生整数输出。递归部分和加法部分正在杀死我。到目前为止我有这个,但我正在努力与下一个和开始部分,以及如何将这些与数字联系起来。
def Parens:Parser[Int] = """(""" ~remainder ~ """)"""
def Plus = term ~ '+' ~ remainder .map(_=> atom + remainder) //Also pseudocode and don't know how to implement this.
def Term = parens .map(_=>2^remainder) //This line is pseudocode, can't implement this correctly
def zero: Parser[Int] = literal("0").map(_ => 0)
def remainder:Parser[Int] =(Next|Start|zero) }
答案 0 :(得分:1)
这是为您的问题实施Parser的一种方法。我可能误解了你的例子中的+
操作。例如我会将(0) + 0
评估为2^0 + 0 = 1 + 0 = 1
,但如果您更详细地解释它,这应该很容易解决。我包括了你所有的例子。
import scala.util.parsing.combinator._
object ParserTest extends App {
object MyParser extends RegexParsers {
private lazy val zero: Parser[Int] = "0" ^^^ { 0 }
private lazy val parens: Parser[Int] = "(" ~> exp <~ ")" ^^ { e => Math.pow(2, e).toInt }
private lazy val term: Parser[Int] = parens | zero
private lazy val plus: Parser[Int] = term ~ "+" ~ term ~ rep("+" ~> term) ^^
{ case t0 ~ "+" ~ t1 ~ rest => rest.foldLeft(t0 + t1)(_ + _) }
private lazy val exp: Parser[Int] = plus | term
def evaluate(input: String) = parseAll(exp, input)
}
println(MyParser.evaluate("0")) //0
println(MyParser.evaluate("(0)")) //1
println(MyParser.evaluate("((0))")) //2
println(MyParser.evaluate("(0)+0")) //1
println(MyParser.evaluate("((0)+0)")) //2
println(MyParser.evaluate("(0)+((0))+ ((0)+0)")) //5
}