progs/comb1.scala
changeset 599 33c4b580092b
parent 598 e3ad67cd5123
child 624 8d0af38389bc
equal deleted inserted replaced
598:e3ad67cd5123 599:33c4b580092b
    97 lazy val T: Parser[String, Int] = 
    97 lazy val T: Parser[String, Int] = 
    98   (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } | F
    98   (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } | F
    99 lazy val F: Parser[String, Int] = 
    99 lazy val F: Parser[String, Int] = 
   100   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParserInt
   100   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParserInt
   101 
   101 
       
   102 lazy val E: Parser[String, String] = 
       
   103   (T ~ "+" ~ E) ==> { case ((x, y), z) => "(" + x + ")+(" + z + ")"} | T 
       
   104 lazy val T: Parser[String, String] = 
       
   105   (F ~ "*" ~ T) ==> { case ((x, y), z) => "(" + x + ")*("+ z + ")"} | F
       
   106 lazy val F: Parser[String, String] = 
       
   107   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParser
   102 
   108 
       
   109 println(E.parse_all("1+3+4"))
       
   110 println(E.parse("1+3+4"))
   103 println(E.parse_all("4*2+3"))
   111 println(E.parse_all("4*2+3"))
   104 println(E.parse_all("4*(2+3)"))
   112 println(E.parse_all("4*(2+3)"))
   105 println(E.parse_all("(4)*((2+3))"))
   113 println(E.parse_all("(4)*((2+3))"))
   106 println(E.parse_all("4/2+3"))
   114 println(E.parse_all("4/2+3"))
   107 println(E.parse("1 + 2 * 3"))
   115 println(E.parse("1 + 2 * 3"))
   124 
   132 
   125 // non-ambiguous vs ambiguous grammars
   133 // non-ambiguous vs ambiguous grammars
   126 lazy val S : Parser[String, String] =
   134 lazy val S : Parser[String, String] =
   127   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } | ""
   135   ("1" ~ S ~ S) ==> { case ((x, y), z) => x + y + z } | ""
   128 
   136 
   129 S.parse("1" * 15)
   137 S.parse("1" * 17)
   130 
   138 
   131 lazy val U : Parser[String, String] =
   139 lazy val U : Parser[String, String] =
   132   ("1" ~ U) ==> { case (x, y) => x + y  } | ""
   140   ("1" ~ U) ==> { case (x, y) => x + y  } | ""
   133 
   141 
   134 U.parse("1" * 15)
   142 U.parse("1" * 25)
   135 
   143 
   136 U.parse("11")
   144 U.parse("11")
   137 U.parse("11111")
   145 U.parse("11111")
   138 U.parse("11011")
   146 U.parse("11011")
   139 
   147