Advertisement
Guest User

Untitled

a guest
Apr 13th, 2015
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.54 KB | None | 0 0
  1. /**
  2.  * Created by pva701 on 4/13/15.
  3.  */
  4.  
  5. object Parser {
  6.     trait Expr {
  7.  
  8.     }
  9.     case class +(l:Expr, r:Expr) extends Expr {}
  10.     case class *(l:Expr, r:Expr) extends Expr {}
  11.     case class W() extends Expr {}
  12.     case class Number(s:String) extends Expr {}
  13.     case class Power(l:Expr, r:Expr) extends Expr {}
  14.  
  15.     type State = (String, String)
  16.     type Res = (Expr, State)
  17.     def parse(s:String):Expr = expr(nextState(("", s)))._1
  18.     def defaultExpr(state:State, nextOp:State=>Res, constr:(Expr, Expr)=>Expr, charOp:String):Res = {
  19.         val exp = nextOp(state)
  20.         if (exp._2._1 == charOp) {
  21.             val nxSt = defaultExpr(exp._2, nextOp, constr, charOp)
  22.             (constr(exp._1, nxSt._1), nxSt._2)
  23.         } else exp
  24.     }
  25.     def expr(s:State):Res = defaultExpr(s, item, (x, y)=>new +(x, y), "+")
  26.     def item(s:State):Res = power(defaultExpr(s, mul, (x, y)=>new *(x, y), "*"))
  27.     def power(s:Res):Res = s._2._1 match {
  28.         case "^" =>
  29.             val st = expr(nextState(s._2))
  30.             (new Power(s._1, st._1), st._2)
  31.         case _ => s
  32.     }
  33.     def mul(s:State):Res = s._1 match {
  34.         case "(" =>
  35.             val st = expr(nextState(s))
  36.             //if (st._2._1 != ")") throw RuntimeException
  37.             (st._1, nextState(st._2))
  38.         case "w" => (new W(), nextState(s))
  39.         case _ => (new Number(s._1), nextState(s))
  40.     }
  41.     def nextState(s:State):State = {
  42.         s
  43.         /*val sym = s._2.charAt(0)
  44.         sym match {
  45.             //case if s._2
  46.         }*/
  47.     }
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement