Guest User

Untitled

a guest
Feb 20th, 2018
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.45 KB | None | 0 0
  1. package topdownop
  2.  
  3. object main {
  4. def main(argv:Array[String]) {
  5. println(parse(argv(0)))
  6. println(eval(argv(0)))
  7. }
  8.  
  9. def parse(src:String) = {
  10. var str = src
  11. val tokens = for(i <- Stream.from(0)) yield {
  12. def t ():Any = {
  13. val num = """^([0-9]+)(.*$)""".r
  14. val ptn = """^([-\+*\/\=\;\:]+|[\(\)\[\]\{\}]|[^-\+*\/\(\)\[\]\{\}\s\=\;\:]+|$)(.*$)""".r
  15. val spc = """^[\s]+(.*$)""".r
  16. str match {
  17. case ptn(a,e) => str = e; a
  18. case spc(e) => str = e; t()
  19. case _ => throw new Error("error")
  20. }
  21. }
  22. t
  23. }
  24.  
  25.  
  26. var token:Any = null
  27. var t:Any = null
  28. var index = 0
  29.  
  30. def advance() { token = tokens(index); index += 1 }
  31.  
  32. // 2項演算子と優先順位
  33. val infixs:Map[Any,Int] = Map(
  34. "*" -> 20,
  35. "/" -> 20,
  36. "-" -> 10,
  37. "+" -> 10)
  38.  
  39. // 2項演算子
  40. def infix(n:Int):Boolean = {
  41. val op = token
  42. val p = infixs(op)
  43. if(p <= n) {
  44. false
  45. } else {
  46. advance()
  47. t = (t, op, exp(p))
  48. true
  49. }
  50. }
  51.  
  52. // 式
  53. def exp(n:Int):Any = {
  54. t = token
  55. advance()
  56. while(infixs.contains(token) && infix(n)){}
  57. t
  58. }
  59.  
  60. advance()
  61. exp(0)
  62. }
  63.  
  64. // 評価
  65. def eval(s:String):Int = eval(parse(s))
  66.  
  67. def eval(a:Any):Int = {
  68. a match {
  69. case (a,"+",b) => eval(a) + eval(b)
  70. case (a,"*",b) => eval(a) * eval(b)
  71. case (a,"-",b) => eval(a) - eval(b)
  72. case (a,"/",b) => eval(a) / eval(b)
  73. case _ =>
  74. try {a.toString.toInt}catch{case _ => 0}
  75. }
  76. }
  77. }
Add Comment
Please, Sign In to add comment