progs/comb2.scala
changeset 529 3725e24f1a19
parent 471 e5df48ff7033
child 531 9b4bc870deb6
equal deleted inserted replaced
528:74a6cd2d011f 529:3725e24f1a19
     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"))