130 lazy val BExp: Parser[List[Token], BExp] = |
130 lazy val BExp: Parser[List[Token], BExp] = |
131 (AExp ~ T_OP("==") ~ AExp) ==> { case x ~ _ ~ z => Bop("==", x, z): BExp } || |
131 (AExp ~ T_OP("==") ~ AExp) ==> { case x ~ _ ~ z => Bop("==", x, z): BExp } || |
132 (AExp ~ T_OP("!=") ~ AExp) ==> { case x ~ _ ~ z => Bop("!=", x, z): BExp } || |
132 (AExp ~ T_OP("!=") ~ AExp) ==> { case x ~ _ ~ z => Bop("!=", x, z): BExp } || |
133 (AExp ~ T_OP("<") ~ AExp) ==> { case x ~ _ ~ z => Bop("<", x, z): BExp } || |
133 (AExp ~ T_OP("<") ~ AExp) ==> { case x ~ _ ~ z => Bop("<", x, z): BExp } || |
134 (AExp ~ T_OP(">") ~ AExp) ==> { case x ~ _ ~ z => Bop(">", x, z): BExp } || |
134 (AExp ~ T_OP(">") ~ AExp) ==> { case x ~ _ ~ z => Bop(">", x, z): BExp } || |
135 (T_PAREN("(") ~ BExp ~ List(T_PAREN(")"), T_OP("&&")) ~ BExp) ==> { case _ ~ y ~ _ ~ v => And(y, v): BExp } || |
135 (T_PAREN("(") ~ BExp ~ T_PAREN(")") ~ T_OP("&&") ~ BExp) ==> { case _ ~ y ~ _ ~ _ ~ v => And(y, v): BExp } || |
136 (T_PAREN("(") ~ BExp ~ List(T_PAREN(")"), T_OP("||")) ~ BExp) ==> { case _ ~ y ~ _ ~ v => Or(y, v): BExp } || |
136 (T_PAREN("(") ~ BExp ~ T_PAREN(")") ~ T_OP("||") ~ BExp) ==> { case _ ~ y ~ _ ~ _ ~ v => Or(y, v): BExp } || |
137 (T_KEYWORD("true") ==> (_ => True: BExp )) || |
137 (T_KEYWORD("true") ==> (_ => True: BExp )) || |
138 (T_KEYWORD("false") ==> (_ => False: BExp )) || |
138 (T_KEYWORD("false") ==> (_ => False: BExp )) || |
139 (T_PAREN("(") ~ BExp ~ T_PAREN(")")) ==> { case _ ~ x ~ _ => x } |
139 (T_PAREN("(") ~ BExp ~ T_PAREN(")")) ==> { case _ ~ x ~ _ => x } |
140 |
140 |
141 lazy val Stmt: Parser[List[Token], Stmt] = |
141 lazy val Stmt: Parser[List[Token], Stmt] = |
143 (IdParser() ~ T_OP(":=") ~ AExp) ==> { case id ~ _ ~ z => Assign(id, z): Stmt } || |
143 (IdParser() ~ T_OP(":=") ~ AExp) ==> { case id ~ _ ~ z => Assign(id, z): Stmt } || |
144 (T_KEYWORD("if") ~ BExp ~ T_KEYWORD("then") ~ Block ~ T_KEYWORD("else") ~ Block) ==> { case _ ~ y ~ _ ~ u ~ _ ~ w => If(y, u, w): Stmt } || |
144 (T_KEYWORD("if") ~ BExp ~ T_KEYWORD("then") ~ Block ~ T_KEYWORD("else") ~ Block) ==> { case _ ~ y ~ _ ~ u ~ _ ~ w => If(y, u, w): Stmt } || |
145 (T_KEYWORD("while") ~ BExp ~ T_KEYWORD("do") ~ Block) ==> { case _ ~ y ~ _ ~ w => While(y, w) : Stmt } || |
145 (T_KEYWORD("while") ~ BExp ~ T_KEYWORD("do") ~ Block) ==> { case _ ~ y ~ _ ~ w => While(y, w) : Stmt } || |
146 (T_KEYWORD("read") ~ IdParser()) ==> { case _ ~ id => Read(id): Stmt} || |
146 (T_KEYWORD("read") ~ IdParser()) ==> { case _ ~ id => Read(id): Stmt} || |
147 (T_KEYWORD("write") ~ IdParser()) ==> { case _ ~ id => WriteId(id): Stmt} || |
147 (T_KEYWORD("write") ~ IdParser()) ==> { case _ ~ id => WriteId(id): Stmt} || |
148 (T_KEYWORD("write") ~ StringParser()) ==> { case _ ~ s => WriteString(s): Stmt} |
148 (T_KEYWORD("write") ~ StringParser()) ==> { case _ ~ s => WriteString(s): Stmt} || |
|
149 (T_KEYWORD("write") ~ T_PAREN("(") ~ IdParser() ~ T_PAREN(")")) ==> { case _ ~ _ ~ id ~ _ => WriteId(id): Stmt} || |
|
150 (T_KEYWORD("write") ~ T_PAREN("(") ~ StringParser() ~ T_PAREN(")")) ==> { case _ ~ _ ~ s ~ _ => WriteString(s): Stmt} |
149 |
151 |
150 lazy val Stmts: Parser[List[Token], Block] = |
152 lazy val Stmts: Parser[List[Token], Block] = |
151 (Stmt ~ T_SEMI ~ Stmts) ==> { case x ~ _ ~ z => x :: z : Block } || |
153 (Stmt ~ T_SEMI ~ Stmts) ==> { case x ~ _ ~ z => x :: z : Block } || |
152 (Stmt ==> (s => List(s) : Block)) |
154 (Stmt ==> (s => List(s) : Block)) |
153 |
155 |
222 case s::bl => eval_bl(bl, eval_stmt(s, env)) |
224 case s::bl => eval_bl(bl, eval_stmt(s, env)) |
223 } |
225 } |
224 |
226 |
225 def eval(bl: Block) : Env = eval_bl(bl, Map()) |
227 def eval(bl: Block) : Env = eval_bl(bl, Map()) |
226 |
228 |
|
229 println("Primes eval") |
|
230 println(tokenise(os.read(os.pwd / "primes.while"))) |
|
231 println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "primes.while"))).head)) |
|
232 |
227 println("Factors eval") |
233 println("Factors eval") |
228 println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "factors.while"))).head)) |
234 println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "factors.while"))).head)) |
229 |
235 |
230 println("Collatz2 eval") |
236 println("Collatz2 eval") |
231 println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "collatz2.while"))).head)) |
237 println(eval(Stmts.parse_all(tokenise(os.read(os.pwd / "collatz2.while"))).head)) |