Scala以递归方式解析为任意输出值

时间:2015-12-15 16:52:56

标签: scala parsing

我如何使用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) }

1 个答案:

答案 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

}