| 
     1 // A parser and evaluator for the while language  | 
         | 
     2 //   | 
         | 
     3   | 
     1 import scala.language.implicitConversions  | 
     4 import scala.language.implicitConversions  | 
     2 import scala.language.reflectiveCalls  | 
     5 import scala.language.reflectiveCalls  | 
     3   | 
     6   | 
     4 abstract class Parser[I <% Seq[_], T] { | 
     7 abstract class Parser[I <% Seq[_], T] { | 
     5   def parse(ts: I): Set[(T, I)]  | 
     8   def parse(ts: I): Set[(T, I)]  | 
   123    IdParser ==> Var ||   | 
   126    IdParser ==> Var ||   | 
   124    NumParser ==> Num)  | 
   127    NumParser ==> Num)  | 
   125   | 
   128   | 
   126 // boolean expressions  | 
   129 // boolean expressions  | 
   127 lazy val BExp: Parser[String, BExp] =   | 
   130 lazy val BExp: Parser[String, BExp] =   | 
   128   ((AExp ~ "=" ~ AExp) ==> { case ((x, y), z) => Bop("=", x, z): BExp } ||  | 
   131   ((AExp ~ "=" ~ AExp) ==> { case ((x, y), z) => Bop("=", x, z):BExp } ||  | 
   129    (AExp ~ "!=" ~ AExp) ==> { case ((x, y), z) => Bop("!=", x, z): BExp } ||  | 
   132    (AExp ~ "!=" ~ AExp) ==> { case ((x, y), z) => Bop("!=", x, z):BExp } ||  | 
   130    (AExp ~ "<" ~ AExp) ==> { case ((x, y), z) => Bop("<", x, z): BExp } ||  | 
   133    (AExp ~ "<" ~ AExp) ==> { case ((x, y), z) => Bop("<", x, z):BExp } ||  | 
   131    (AExp ~ ">" ~ AExp) ==> { case ((x, y), z) => Bop(">", x, z): BExp } ||  | 
   134    (AExp ~ ">" ~ AExp) ==> { case ((x, y), z) => Bop(">", x, z):BExp } ||  | 
   132    ("true" ==> ((_) => True: BExp)) ||  | 
   135    ("true" ==> ((_) => True:BExp )) ||  | 
   133    ("false" ==> ((_) => False: BExp)) || | 
   136    ("false" ==> ((_) => False:BExp )) || | 
   134    ("(" ~ BExp ~ ")") ==> { case ((x, y), z) => y}) | 
   137    ("(" ~ BExp ~ ")") ==> { case ((x, y), z) => y}) | 
   135   | 
   138   | 
   136 lazy val Stmt: Parser[String, Stmt] =  | 
   139 lazy val Stmt: Parser[String, Stmt] =  | 
   137   (("skip" ==> ((_) => Skip: Stmt)) || | 
   140   (("skip" ==> ((_) => Skip: Stmt)) || | 
   138    (IdParser ~ ":=" ~ AExp) ==> { case ((x, y), z) => Assign(x, z): Stmt } || | 
   141    (IdParser ~ ":=" ~ AExp) ==> { case ((x, y), z) => Assign(x, z): Stmt } || | 
   147 lazy val Block: Parser[String, Block] =  | 
   150 lazy val Block: Parser[String, Block] =  | 
   148   (("{" ~ Stmts ~ "}") ==> { case ((x, y), z) => y} ||  | 
   151   (("{" ~ Stmts ~ "}") ==> { case ((x, y), z) => y} ||  | 
   149    (Stmt ==> ((s) => List(s))))  | 
   152    (Stmt ==> ((s) => List(s))))  | 
   150   | 
   153   | 
   151   | 
   154   | 
   152 Block.parse_all("x2:=5") | 
   155 Stmt.parse_all("x2:=5") | 
   153 Block.parse_all("{x:=5;y:=8}") | 
   156 Block.parse_all("{x:=5;y:=8}") | 
   154 Block.parse_all("if(false)then{x:=5}else{x:=10}") | 
   157 Block.parse_all("if(false)then{x:=5}else{x:=10}") | 
   155   | 
   158   | 
   156 val fib = """{n:=10;minus1:=0;minus2:=1;temp:=0;while(n>0)do{temp:=minus2;minus2:=minus1+minus2;minus1:=temp;n:=n-1};result:=minus2}""" | 
   159 val fib = """{n:=10;minus1:=0;minus2:=1;temp:=0;while(n>0)do{temp:=minus2;minus2:=minus1+minus2;minus1:=temp;n:=n-1};result:=minus2}""" | 
   157   | 
   160   |