52 |
52 |
53 |
53 |
54 implicit def string2parser(s : String) = StringParser(s) |
54 implicit def string2parser(s : String) = StringParser(s) |
55 |
55 |
56 implicit def ParserOps[I : IsSeq, T](p: Parser[I, T]) = new { |
56 implicit def ParserOps[I : IsSeq, T](p: Parser[I, T]) = new { |
57 def || (q : => Parser[I, T]) = new AltParser[I, T](p, q) |
57 def ||(q : => Parser[I, T]) = new AltParser[I, T](p, q) |
58 def ==>[S] (f: => T => S) = new FunParser[I, T, S](p, f) |
58 def ==>[S] (f: => T => S) = new FunParser[I, T, S](p, f) |
59 def ~[S] (q : => Parser[I, S]) = new SeqParser[I, T, S](p, q) |
59 def ~[S](q : => Parser[I, S]) = new SeqParser[I, T, S](p, q) |
60 } |
60 } |
61 |
61 |
62 implicit def StringOps(s: String) = new { |
62 implicit def StringOps(s: String) = new { |
63 def || (q : => Parser[String, String]) = new AltParser[String, String](s, q) |
63 def ||(q : => Parser[String, String]) = new AltParser[String, String](s, q) |
64 def || (r: String) = new AltParser[String, String](s, r) |
64 def ||(r: String) = new AltParser[String, String](s, r) |
65 def ==>[S] (f: => String => S) = new FunParser[String, String, S](s, f) |
65 def ==>[S] (f: => String => S) = new FunParser[String, String, S](s, f) |
66 def ~[S](q : => Parser[String, S]) = |
66 def ~[S](q : => Parser[String, S]) = |
67 new SeqParser[String, String, S](s, q) |
67 new SeqParser[String, String, S](s, q) |
68 def ~ (r: String) = |
68 def ~(r: String) = |
69 new SeqParser[String, String, String](s, r) |
69 new SeqParser[String, String, String](s, r) |
70 } |
70 } |
71 |
71 |
72 |
72 |
73 // the abstract syntax trees for the WHILE language |
73 // the abstract syntax trees for the WHILE language |
100 case None => Set() |
100 case None => Set() |
101 case Some(s) => Set(sb.splitAt(s.length)) |
101 case Some(s) => Set(sb.splitAt(s.length)) |
102 } |
102 } |
103 } |
103 } |
104 |
104 |
|
105 // arithmetic expressions |
105 lazy val AExp: Parser[String, AExp] = |
106 lazy val AExp: Parser[String, AExp] = |
106 (Te ~ "+" ~ AExp) ==> { case x ~ _ ~ z => Aop("+", x, z): AExp } || |
107 (Te ~ "+" ~ AExp) ==> { case x ~ _ ~ z => Aop("+", x, z): AExp } || |
107 (Te ~ "-" ~ AExp) ==> { case x ~ _ ~ z => Aop("-", x, z): AExp } || Te |
108 (Te ~ "-" ~ AExp) ==> { case x ~ _ ~ z => Aop("-", x, z): AExp } || Te |
108 lazy val Te: Parser[String, AExp] = |
109 lazy val Te: Parser[String, AExp] = |
109 (Fa ~ "*" ~ Te) ==> { case x ~ _ ~ z => Aop("*", x, z): AExp } || |
110 (Fa ~ "*" ~ Te) ==> { case x ~ _ ~ z => Aop("*", x, z): AExp } || |
138 (Stmt ~ ";" ~ Stmts) ==> { case x ~ _ ~ z => x :: z : Block } || |
139 (Stmt ~ ";" ~ Stmts) ==> { case x ~ _ ~ z => x :: z : Block } || |
139 (Stmt ==> ( s => List(s) : Block)) |
140 (Stmt ==> ( s => List(s) : Block)) |
140 |
141 |
141 // blocks (enclosed in curly braces) |
142 // blocks (enclosed in curly braces) |
142 lazy val Block: Parser[String, Block] = |
143 lazy val Block: Parser[String, Block] = |
143 (("{" ~ Stmts ~ "}") ==> { case x ~ y ~ z => y} || |
144 (("{" ~ Stmts ~ "}") ==> { case _ ~ y ~ _ => y } || |
144 (Stmt ==> (s => List(s)))) |
145 (Stmt ==> (s => List(s)))) |
145 |
146 |
146 |
147 |
147 Stmts.parse_all("x2:=5+3;") |
148 Stmts.parse_all("x2:=5+3;") |
148 Block.parse_all("{x:=5;y:=8}") |
149 Block.parse_all("{x:=5;y:=8}") |