Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package topdownop
- object main {
- def main(argv:Array[String]) {
- println(parse(argv(0)))
- println(eval(argv(0)))
- }
- def parse(src:String) = {
- var str = src
- val tokens = for(i <- Stream.from(0)) yield {
- def t ():Any = {
- val num = """^([0-9]+)(.*$)""".r
- val ptn = """^([-\+*\/\=\;\:]+|[\(\)\[\]\{\}]|[^-\+*\/\(\)\[\]\{\}\s\=\;\:]+|$)(.*$)""".r
- val spc = """^[\s]+(.*$)""".r
- str match {
- case ptn(a,e) => str = e; a
- case spc(e) => str = e; t()
- case _ => throw new Error("error")
- }
- }
- t
- }
- var token:Any = null
- var t:Any = null
- var index = 0
- def advance() { token = tokens(index); index += 1 }
- // 2項演算子と優先順位
- val infixs:Map[Any,Int] = Map(
- "*" -> 20,
- "/" -> 20,
- "-" -> 10,
- "+" -> 10)
- // 2項演算子
- def infix(n:Int):Boolean = {
- val op = token
- val p = infixs(op)
- if(p <= n) {
- false
- } else {
- advance()
- t = (t, op, exp(p))
- true
- }
- }
- // 式
- def exp(n:Int):Any = {
- t = token
- advance()
- while(infixs.contains(token) && infix(n)){}
- t
- }
- advance()
- exp(0)
- }
- // 評価
- def eval(s:String):Int = eval(parse(s))
- def eval(a:Any):Int = {
- a match {
- case (a,"+",b) => eval(a) + eval(b)
- case (a,"*",b) => eval(a) * eval(b)
- case (a,"-",b) => eval(a) - eval(b)
- case (a,"/",b) => eval(a) / eval(b)
- case _ =>
- try {a.toString.toInt}catch{case _ => 0}
- }
- }
- }
Add Comment
Please, Sign In to add comment