progs/comb1.scala
changeset 683 c6c79d21f8a8
parent 673 715b46eee102
child 686 05cfce0fdef7
equal deleted inserted replaced
682:553b4d4e3719 683:c6c79d21f8a8
    10 abstract class Parser[I : IsSeq, T] {
    10 abstract class Parser[I : IsSeq, T] {
    11   def parse(ts: I): Set[(T, I)]
    11   def parse(ts: I): Set[(T, I)]
    12 
    12 
    13   def parse_all(ts: I) : Set[T] =
    13   def parse_all(ts: I) : Set[T] =
    14     for ((head, tail) <- parse(ts); 
    14     for ((head, tail) <- parse(ts); 
    15         if (tail.isEmpty)) yield head
    15         if tail.isEmpty) yield head
    16 }
    16 }
    17 
    17 
    18 class SeqParser[I : IsSeq, T, S](p: => Parser[I, T], 
    18 class SeqParser[I : IsSeq, T, S](p: => Parser[I, T], 
    19                                  q: => Parser[I, S]) extends Parser[I, (T, S)] {
    19                                  q: => Parser[I, S]) extends Parser[I, (T, S)] {
    20   def parse(sb: I) = 
    20   def parse(sb: I) = 
   160    NumParserInt)
   160    NumParserInt)
   161 
   161 
   162 //println(EL.parse_all("1+2+3"))
   162 //println(EL.parse_all("1+2+3"))
   163 
   163 
   164 
   164 
   165 
       
   166 
       
   167 // non-ambiguous vs ambiguous grammars
   165 // non-ambiguous vs ambiguous grammars
   168 
   166 
   169 // ambiguous
   167 // ambiguous
   170 lazy val S : Parser[String, String] =
   168 lazy val S : Parser[String, String] =
   171   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || ""
   169   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || ""
   203 (One ~ One).parse("111")
   201 (One ~ One).parse("111")
   204 (One ~ One ~ One).parse("111")
   202 (One ~ One ~ One).parse("111")
   205 (One ~ One ~ One ~ One).parse("1111")
   203 (One ~ One ~ One ~ One).parse("1111")
   206 
   204 
   207 (One || Two).parse("111")
   205 (One || Two).parse("111")
   208 
       
   209 
       
   210 
   206 
   211 
   207 
   212 // a problem with the arithmetic expression parser -> gets 
   208 // a problem with the arithmetic expression parser -> gets 
   213 // slow with deep nestedness
   209 // slow with deep nestedness
   214 E.parse("1")
   210 E.parse("1")