progs/parser-combinators/comb2.sc
changeset 803 d4fb8c7fc3bf
parent 742 b5b5583a3a08
child 812 2f9a0dcf61ae
equal deleted inserted replaced
802:f4db602f642f 803:d4fb8c7fc3bf
     8 // call with
     8 // call with
     9 //
     9 //
    10 //    amm comb2.sc
    10 //    amm comb2.sc
    11 
    11 
    12 
    12 
    13 
       
    14 
       
    15 // more convenience for the map parsers later on;
    13 // more convenience for the map parsers later on;
    16 // it allows writing nested patterns as
    14 // it allows writing nested patterns as
    17 // case x ~ y ~ z => ...
    15 // case x ~ y ~ z => ...
    18 
    16 
    19 case class ~[+A, +B](_1: A, _2: B)
    17 case class ~[+A, +B](x: A, y: B)
    20 
       
    21 
    18 
    22 // constraint for the input
    19 // constraint for the input
    23 type IsSeq[A] = A => Seq[_]
    20 type IsSeq[A] = A => Seq[_]
    24 
    21 
    25 
    22 
   170   ((p"{" ~ Stmts ~ p"}").map{ case _ ~ y ~ _ => y } || 
   167   ((p"{" ~ Stmts ~ p"}").map{ case _ ~ y ~ _ => y } || 
   171    (Stmt.map(s => List(s))))
   168    (Stmt.map(s => List(s))))
   172 
   169 
   173 
   170 
   174 // Examples
   171 // Examples
   175 Stmts.parse_all("x2:=5+3;")
   172 Stmt.parse_all("x2:=5+3")
   176 Block.parse_all("{x:=5;y:=8}")
   173 Block.parse_all("{x:=5;y:=8}")
   177 Block.parse_all("if(false)then{x:=5}else{x:=10}")
   174 Block.parse_all("if(false)then{x:=5}else{x:=10}")
   178 
   175 
   179 
   176 
   180 val fib = """n := 10;
   177 val fib = """n := 10;