progs/comb1.scala
changeset 366 5a83336a9690
parent 362 57ea439feaff
child 367 04127a5aad23
equal deleted inserted replaced
365:9b71dead1219 366:5a83336a9690
    87 P.parse_all(")(")
    87 P.parse_all(")(")
    88 P.parse_all("()")
    88 P.parse_all("()")
    89 
    89 
    90 // arithmetic expressions
    90 // arithmetic expressions
    91 lazy val E: Parser[String, String] = 
    91 lazy val E: Parser[String, String] = 
    92   (F ~ "*" ~ F) ==> { case ((x, y), z) => x + y + z } || F  
    92   (F ~ "*" ~ T) ==> { case ((x, y), z) => x + y + z } || F  
    93 lazy val F: Parser[String, String] = 
    93 lazy val F: Parser[String, String] = 
    94   ((T ~ "+" ~ T) ==> { case ((x, y), z) => x + y + z } ||
    94   ((T ~ "+" ~ T) ==> { case ((x, y), z) => x + y + z } ||
    95    (T ~ "-" ~ T) ==> { case ((x, y), z) => x + y + z } || T)
    95    (T ~ "-" ~ T) ==> { case ((x, y), z) => x + y + z } || T)
    96 lazy val T: Parser[String, String] = 
    96 lazy val T: Parser[String, String] = 
    97   ("(" ~ E ~ ")") ==> { case ((x, y), z) => x + y + z } || NumParser
    97   ("(" ~ E ~ ")") ==> { case ((x, y), z) => x + y + z } || NumParser
   101 println(E.parse_all("(1+2)+3"))
   101 println(E.parse_all("(1+2)+3"))
   102 println(E.parse_all("1+2+3"))  // this is not parsed, because of 
   102 println(E.parse_all("1+2+3"))  // this is not parsed, because of 
   103                                // how the grammar is set up
   103                                // how the grammar is set up
   104 
   104 
   105 // non-ambiguous vs ambiguous grammars
   105 // non-ambiguous vs ambiguous grammars
   106 lazy val U : Parser[String, String] =
       
   107   ("1" ~ U) ==> { case (x, y) => x + y } || ""
       
   108 
       
   109 U.parse_all("1" * 100 + "0")
       
   110 
       
   111 lazy val S : Parser[String, String] =
   106 lazy val S : Parser[String, String] =
   112   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || ""
   107   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } || ""
   113 
   108 
   114 S.parse_all("1" * 15)
   109 S.parse_all("1" * 15)
   115 
   110 
       
   111 lazy val U : Parser[String, String] =
       
   112   ("1" ~ U) ==> { case (x, y) => x + y  } || ""
       
   113 
       
   114 U.parse("11")
       
   115 U.parse("11111")
       
   116 U.parse("11011")
       
   117 
       
   118 U.parse_all("1" * 100 + "0")
       
   119 
       
   120 lazy val UCount : Parser[String, Int] =
       
   121   ("1" ~ UCount) ==> { case (x, y) => y + 1 } || 
       
   122   "" ==> { (x) => 0 }
       
   123 
       
   124 UCount.parse("11111")
       
   125 UCount.parse_all("11111")
   116 
   126 
   117 
   127 
   118 
   128 
   119 
   129 
       
   130 // Single Character parser
       
   131 lazy val One : Parser[String, String] = "1"
       
   132 lazy val Two : Parser[String, String] = "2"
   120 
   133 
       
   134 One.parse("1")
       
   135 One.parse("111")
   121 
   136 
       
   137 (One ~ One).parse("111")
       
   138 (One ~ One ~ One).parse("111")
       
   139 (One ~ One ~ One ~ One).parse("1111")
   122 
   140 
   123 
   141 (One || Two).parse("111")
   124 
       
   125 
       
   126 
       
   127 
       
   128 
       
   129 
       
   130 
       
   131 
       
   132 
       
   133 
       
   134 
       
   135 
       
   136 
       
   137 
       
   138 
       
   139 
       
   140 
       
   141 
       
   142 
       
   143