progs/comb2.scala
changeset 529 5c28e4134ee1
parent 471 9476086849ad
child 531 f6e937ed0332
equal deleted inserted replaced
528:68fab15cd6fb 529:5c28e4134ee1
     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"))