Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Created by pva701 on 4/13/15.
- */
- object Parser {
- trait Expr {
- }
- case class +(l:Expr, r:Expr) extends Expr {}
- case class *(l:Expr, r:Expr) extends Expr {}
- case class W() extends Expr {}
- case class Number(s:String) extends Expr {}
- case class Power(l:Expr, r:Expr) extends Expr {}
- type State = (String, String)
- type Res = (Expr, State)
- def parse(s:String):Expr = expr(nextState(("", s)))._1
- def defaultExpr(state:State, nextOp:State=>Res, constr:(Expr, Expr)=>Expr, charOp:String):Res = {
- val exp = nextOp(state)
- if (exp._2._1 == charOp) {
- val nxSt = defaultExpr(exp._2, nextOp, constr, charOp)
- (constr(exp._1, nxSt._1), nxSt._2)
- } else exp
- }
- def expr(s:State):Res = defaultExpr(s, item, (x, y)=>new +(x, y), "+")
- def item(s:State):Res = power(defaultExpr(s, mul, (x, y)=>new *(x, y), "*"))
- def power(s:Res):Res = s._2._1 match {
- case "^" =>
- val st = expr(nextState(s._2))
- (new Power(s._1, st._1), st._2)
- case _ => s
- }
- def mul(s:State):Res = s._1 match {
- case "(" =>
- val st = expr(nextState(s))
- //if (st._2._1 != ")") throw RuntimeException
- (st._1, nextState(st._2))
- case "w" => (new W(), nextState(s))
- case _ => (new Number(s._1), nextState(s))
- }
- def nextState(s:State):State = {
- s
- /*val sym = s._2.charAt(0)
- sym match {
- //case if s._2
- }*/
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement