equal
deleted
inserted
replaced
12 |
12 |
13 abstract class Parser[I : IsSeq, T] { |
13 abstract class Parser[I : IsSeq, T] { |
14 def parse(ts: I): Set[(T, I)] |
14 def parse(ts: I): Set[(T, I)] |
15 |
15 |
16 def parse_all(ts: I) : Set[T] = |
16 def parse_all(ts: I) : Set[T] = |
17 for ((head, tail) <- parse(ts); if (tail.isEmpty)) yield head |
17 for ((head, tail) <- parse(ts); if tail.isEmpty) yield head |
18 } |
18 } |
19 |
19 |
20 class SeqParser[I : IsSeq, T, S](p: => Parser[I, T], q: => Parser[I, S]) extends Parser[I, ~[T, S]] { |
20 class SeqParser[I : IsSeq, T, S](p: => Parser[I, T], q: => Parser[I, S]) extends Parser[I, ~[T, S]] { |
21 def parse(sb: I) = |
21 def parse(sb: I) = |
22 for ((head1, tail1) <- p.parse(sb); |
22 for ((head1, tail1) <- p.parse(sb); |
121 (AExp ~ ">" ~ AExp) ==> { case x ~ y ~ z => Bop(">", x, z): BExp } || |
121 (AExp ~ ">" ~ AExp) ==> { case x ~ y ~ z => Bop(">", x, z): BExp } || |
122 ("(" ~ BExp ~ ")" ~ "&&" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => And(y, v): BExp } || |
122 ("(" ~ BExp ~ ")" ~ "&&" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => And(y, v): BExp } || |
123 ("(" ~ BExp ~ ")" ~ "||" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => Or(y, v): BExp } || |
123 ("(" ~ BExp ~ ")" ~ "||" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => Or(y, v): BExp } || |
124 ("true" ==> (_ => True: BExp )) || |
124 ("true" ==> (_ => True: BExp )) || |
125 ("false" ==> (_ => False: BExp )) || |
125 ("false" ==> (_ => False: BExp )) || |
126 ("(" ~ BExp ~ ")") ==> { case x ~ y ~ z => y} |
126 ("(" ~ BExp ~ ")") ==> { case _ ~ x ~ _ => x } |
127 |
127 |
128 // statement / statements |
128 // statement / statements |
129 lazy val Stmt: Parser[String, Stmt] = |
129 lazy val Stmt: Parser[String, Stmt] = |
130 (("skip" ==> (_ => Skip: Stmt)) || |
130 (("skip" ==> (_ => Skip: Stmt)) || |
131 (IdParser ~ ":=" ~ AExp) ==> { case x ~ y ~ z => Assign(x, z): Stmt } || |
131 (IdParser ~ ":=" ~ AExp) ==> { case x ~ y ~ z => Assign(x, z): Stmt } || |