equal
deleted
inserted
replaced
1 // A parser and evaluator for the while language |
1 // A parser and evaluator for the while language |
2 // |
2 // |
3 |
3 |
4 import scala.language.implicitConversions |
4 import scala.language.implicitConversions |
5 import scala.language.reflectiveCalls |
5 import scala.language.reflectiveCalls |
|
6 |
6 |
7 |
7 abstract class Parser[I <% Seq[_], T] { |
8 abstract class Parser[I <% Seq[_], T] { |
8 def parse(ts: I): Set[(T, I)] |
9 def parse(ts: I): Set[(T, I)] |
9 |
10 |
10 def parse_all(ts: I) : Set[T] = |
11 def parse_all(ts: I) : Set[T] = |
68 lazy val T: Parser[String, Int] = |
69 lazy val T: Parser[String, Int] = |
69 (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z} || F |
70 (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z} || F |
70 lazy val F: Parser[String, Int] = |
71 lazy val F: Parser[String, Int] = |
71 ("(" ~ E ~ ")") ==> { case ((x, y), z) => y} || NumParser |
72 ("(" ~ E ~ ")") ==> { case ((x, y), z) => y} || NumParser |
72 |
73 |
|
74 println(E.parse_all("123")) |
73 println(E.parse_all("1*2+3")) |
75 println(E.parse_all("1*2+3")) |
74 println(E.parse_all("1+2*3")) |
76 println(E.parse_all("1+2*3")) |
75 println(E.parse_all("1+2+3")) |
77 println(E.parse_all("1+2+3")) |
76 println(E.parse_all("1+2+3")) |
78 println(E.parse_all("1+2+3")) |
77 println(E.parse_all("1+2*3+1")) |
79 println(E.parse_all("1+2*3+1")) |