Monday, 15 April 2013

scala - Transforming Parser[Any] to a Stricter Type -



scala - Transforming Parser[Any] to a Stricter Type -

programming in scala's chapter 33 explains combinator parsing:

it provides example:

import scala.util.parsing.combinator._ class arith extends javatokenparsers { def expr: parser[any] = term~rep("+"~term | "-"~term) def term: parser[any] = factor~rep("*"~factor | "/"~factor) def factor: parser[any] = floatingpointnumber | "("~expr~")" }

how can map expr narrower type parser[any]? in other words,

i'd take def expr: parser[any] , map via ^^ stricter type.

note - asked question in scala google groups - https://groups.google.com/forum/#!forum/scala-user, haven't received finish reply helped me out.

as stated in comments, can narrow downwards type like. have specify after ^^.

here finish illustration info construction given code.

object arith extends javatokenparsers { trait look //the info construction case class fnumber(value: float) extends look case class plus(e1: expression, e2: expression) extends look case class minus(e1: expression, e2: expression) extends look case class mult(e1: expression, e2: expression) extends look case class div(e1: expression, e2: expression) extends look def expr: parser[expression] = term ~ rep("+" ~ term | "-" ~ term) ^^ { case term ~ rest => rest.foldleft(term)((result, elem) => elem match { case "+" ~ e => plus(result, e) case "-" ~ e => minus(result, e) }) } def term: parser[expression] = factor ~ rep("*" ~ factor | "/" ~ factor) ^^ { case factor ~ rest => rest.foldleft(factor)((result, elem) => elem match { case "*" ~ e => mult(result, e) case "/" ~ e => div(result, e) }) } def factor: parser[expression] = floatingpointnumber ^^ (f => fnumber(f.tofloat)) | "(" ~> expr <~ ")" def parseinput(input: string): look = parse(expr, input) match { case success(ex, _) => ex case _ => throw new illegalargumentexception //or alter result try[expression] } }

now can start parse something.

arith.parseinput("(1.3 + 2.0) * 2") //yields: mult(plus(fnumber(1.3),fnumber(2.0)),fnumber(2.0))

of course of study can have parser[string] or parser[float], straight transform or evaluate input string. said you.

scala parsing

No comments:

Post a Comment