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 lazy val AExp: Parser[String, AExp] = |
105 lazy val AExp: Parser[String, AExp] = |
106 (Te ~ "+" ~ AExp) ==> { case x ~ y ~ z => Aop("+", x, z): AExp } || |
106 (Te ~ "+" ~ AExp) ==> { case x ~ _ ~ z => Aop("+", x, z): AExp } || |
107 (Te ~ "-" ~ AExp) ==> { case x ~ y ~ z => Aop("-", x, z): AExp } || Te |
107 (Te ~ "-" ~ AExp) ==> { case x ~ _ ~ z => Aop("-", x, z): AExp } || Te |
108 lazy val Te: Parser[String, AExp] = |
108 lazy val Te: Parser[String, AExp] = |
109 (Fa ~ "*" ~ Te) ==> { case x ~ y ~ z => Aop("*", x, z): AExp } || |
109 (Fa ~ "*" ~ Te) ==> { case x ~ _ ~ z => Aop("*", x, z): AExp } || |
110 (Fa ~ "/" ~ Te) ==> { case x ~ y ~ z => Aop("/", x, z): AExp } || Fa |
110 (Fa ~ "/" ~ Te) ==> { case x ~ _ ~ z => Aop("/", x, z): AExp } || Fa |
111 lazy val Fa: Parser[String, AExp] = |
111 lazy val Fa: Parser[String, AExp] = |
112 ("(" ~ AExp ~ ")") ==> { case x ~ y ~ z => y } || |
112 ("(" ~ AExp ~ ")") ==> { case _ ~ y ~ _ => y } || |
113 IdParser ==> Var || |
113 IdParser ==> Var || |
114 NumParser ==> Num |
114 NumParser ==> Num |
115 |
115 |
116 // boolean expressions with some simple nesting |
116 // boolean expressions with some simple nesting |
117 lazy val BExp: Parser[String, BExp] = |
117 lazy val BExp: Parser[String, BExp] = |
118 (AExp ~ "==" ~ AExp) ==> { case x ~ _ ~ z => Bop("==", x, z): BExp } || |
118 (AExp ~ "==" ~ AExp) ==> { case x ~ _ ~ z => Bop("==", x, z): BExp } || |
119 (AExp ~ "!=" ~ AExp) ==> { case x ~ _ ~ z => Bop("!=", x, z): BExp } || |
119 (AExp ~ "!=" ~ AExp) ==> { case x ~ _ ~ z => Bop("!=", x, z): BExp } || |
120 (AExp ~ "<" ~ AExp) ==> { case x ~ _ ~ z => Bop("<", x, z): BExp } || |
120 (AExp ~ "<" ~ AExp) ==> { case x ~ _ ~ z => Bop("<", x, z): BExp } || |
121 (AExp ~ ">" ~ AExp) ==> { case x ~ _ ~ z => Bop(">", x, z): BExp } || |
121 (AExp ~ ">" ~ AExp) ==> { case x ~ _ ~ z => Bop(">", x, z): BExp } || |
122 ("(" ~ BExp ~ ")" ~ "&&" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => And(y, v): BExp } || |
122 ("(" ~ BExp ~ ")" ~ "&&" ~ BExp) ==> { case _ ~ y ~ _ ~ _ ~ v => And(y, v): BExp } || |
123 ("(" ~ BExp ~ ")" ~ "||" ~ BExp) ==> { case x ~ y ~ z ~ u ~ v => Or(y, v): BExp } || |
123 ("(" ~ BExp ~ ")" ~ "||" ~ BExp) ==> { case _ ~ y ~ _ ~ _ ~ 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 ~ _ => x } |
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 ~ _ ~ z => Assign(x, z): Stmt } || |
132 ("write(" ~ IdParser ~ ")") ==> { case x ~y ~ z => Write(y): Stmt } || |
132 ("write(" ~ IdParser ~ ")") ==> { case _ ~ y ~ _ => Write(y): Stmt } || |
133 ("if" ~ BExp ~ "then" ~ Block ~ "else" ~ Block) ==> |
133 ("if" ~ BExp ~ "then" ~ Block ~ "else" ~ Block) ==> |
134 { case x ~ y ~ z ~ u ~ v ~ w => If(y, u, w): Stmt } || |
134 { case _ ~ y ~ _ ~ u ~ _ ~ w => If(y, u, w): Stmt } || |
135 ("while" ~ BExp ~ "do" ~ Block) ==> { case x ~ y ~ z ~ w => While(y, w) }) |
135 ("while" ~ BExp ~ "do" ~ Block) ==> { case _ ~ y ~ _ ~ w => While(y, w) }) |
136 |
136 |
137 lazy val Stmts: Parser[String, Block] = |
137 lazy val Stmts: Parser[String, Block] = |
138 (Stmt ~ ";" ~ Stmts) ==> { case x ~ y ~ z => x :: z : Block } || |
138 (Stmt ~ ";" ~ Stmts) ==> { case x ~ _ ~ z => x :: z : Block } || |
139 (Stmt ==> ( s => List(s) : Block)) |
139 (Stmt ==> ( s => List(s) : Block)) |
140 |
140 |
141 // blocks (enclosed in curly braces) |
141 // blocks (enclosed in curly braces) |
142 lazy val Block: Parser[String, Block] = |
142 lazy val Block: Parser[String, Block] = |
143 (("{" ~ Stmts ~ "}") ==> { case x ~ y ~ z => y} || |
143 (("{" ~ Stmts ~ "}") ==> { case x ~ y ~ z => y} || |