【问题标题】:Scala RegexParser calculator example right-associativityScala RegexParser 计算器示例右关联性
【发布时间】:2015-05-09 04:59:09
【问题描述】:

RegexParsers trait 的 Javadoc 包含以下示例:

object Calculator extends RegexParsers {
     def number: Parser[Double] = """\d+(\.\d*)?""".r ^^ { _.toDouble }
     def factor: Parser[Double] = number | "(" ~> expr <~ ")"
     def term  : Parser[Double] = factor ~ rep( "*" ~ factor | "/" ~ factor) ^^ {
       case number ~ list => (number /: list) {
         case (x, "*" ~ y) => x * y
         case (x, "/" ~ y) => x / y
       }
     }
     def expr  : Parser[Double] = term ~ rep("+" ~ log(term)("Plus term") | "-" ~ log(term)("Minus term")) ^^ {
       case number ~ list => list.foldLeft(number) { // same as before, using alternate name for /:
         case (x, "+" ~ y) => x + y
         case (x, "-" ~ y) => x - y
       }
     }

     def apply(input: String): Double = parseAll(expr, input) match {
       case Success(result, _) => result
       case failure : NoSuccess => scala.sys.error(failure.msg)
     }
   }

在解析表达式5 - 4 - 2 时,它会将其视为(5 - 4) - 2 并返回-1。如何将此解析器更改为右关联,以便它实际评估 5 - (4 - 2) 并返回 3?

【问题讨论】:

    标签: scala parsing standard-library parser-combinators


    【解决方案1】:

    我已经设法使语法成为右联想:

    trait Tree
    case class Node(op: String, left: Tree, right: Tree) extends Tree
    case class Leaf(value: BigInt) extends Tree
    
    class ExpressionParser extends RegexParsers {
      var result : BigInt = 0
    
      def number: Parser[Tree] = """-?\d+""".r ^^ { s => Leaf(BigInt(s))}
    
      def expr : Parser[Tree] = (term ~ ("+" | "-") ~ expr ^^ {
        case ((x ~ op) ~ y) => Node(op, x, y)
      }) | term
    
      def term : Parser[Tree] = (factor ~ ("*" | "/") ~ term ^^ {
        case ((x ~ op) ~ y) => Node(op, x, y)
      }) | factor
    
      def factor : Parser[Tree] = number | "(" ~> expr <~ ")"
    

    }

    【讨论】:

      猜你喜欢
      • 2015-08-16
      • 2013-08-02
      • 2012-06-07
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多