64 // convenience  | 
    64 // convenience  | 
    65 implicit def string2parser(s: String) = StringParser(s)  | 
    65 implicit def string2parser(s: String) = StringParser(s)  | 
    66 implicit def char2parser(c: Char) = CharParser(c)  | 
    66 implicit def char2parser(c: Char) = CharParser(c)  | 
    67   | 
    67   | 
    68 implicit def ParserOps[I : IsSeq, T](p: Parser[I, T]) = new { | 
    68 implicit def ParserOps[I : IsSeq, T](p: Parser[I, T]) = new { | 
    69   def || (q : => Parser[I, T]) = new AltParser[I, T](p, q)  | 
    69   def ||(q : => Parser[I, T]) = new AltParser[I, T](p, q)  | 
    70   def ==>[S] (f: => T => S) = new FunParser[I, T, S](p, f)  | 
    70   def ==>[S] (f: => T => S) = new FunParser[I, T, S](p, f)  | 
    71   def ~[S] (q : => Parser[I, S]) = new SeqParser[I, T, S](p, q)  | 
    71   def ~[S] (q : => Parser[I, S]) = new SeqParser[I, T, S](p, q)  | 
    72 }  | 
    72 }  | 
    73   | 
    73   | 
    74 implicit def StringOps(s: String) = new { | 
    74 implicit def StringOps(s: String) = new { | 
    75   def || (q : => Parser[String, String]) = new AltParser[String, String](s, q)  | 
    75   def ||(q : => Parser[String, String]) = new AltParser[String, String](s, q)  | 
    76   def || (r: String) = new AltParser[String, String](s, r)  | 
    76   def ||(r: String) = new AltParser[String, String](s, r)  | 
    77   def ==>[S] (f: => String => S) = new FunParser[String, String, S](s, f)  | 
    77   def ==>[S] (f: => String => S) = new FunParser[String, String, S](s, f)  | 
    78   def ~[S] (q : => Parser[String, S]) =   | 
    78   def ~[S](q : => Parser[String, S]) =   | 
    79     new SeqParser[String, String, S](s, q)  | 
    79     new SeqParser[String, String, S](s, q)  | 
    80   def ~ (r: String) =   | 
    80   def ~(r: String) =   | 
    81     new SeqParser[String, String, String](s, r)  | 
    81     new SeqParser[String, String, String](s, r)  | 
    82 }  | 
    82 }  | 
    83   | 
    83   | 
    84 // NumParserInt can now be written as  | 
    84 // NumParserInt can now be written as  | 
    85 val NumParserInt = NumParser ==> (s => s.toInt)  | 
    85 val NumParserInt = NumParser ==> (s => s.toInt)  | 
   104 P.parse_all("()") | 
   104 P.parse_all("()") | 
   105   | 
   105   | 
   106 // Arithmetic Expressions (Terms and Factors)  | 
   106 // Arithmetic Expressions (Terms and Factors)  | 
   107   | 
   107   | 
   108 lazy val E: Parser[String, Int] =   | 
   108 lazy val E: Parser[String, Int] =   | 
   109   (T ~ "+" ~ E) ==> { case x ~ y ~ z => x + z } || | 
   109   (T ~ "+" ~ E) ==> { case x ~ _ ~ z => x + z } || | 
   110   (T ~ "-" ~ E) ==> { case x ~ y ~ z => x - z } || T  | 
   110   (T ~ "-" ~ E) ==> { case x ~ _ ~ z => x - z } || T  | 
   111 lazy val T: Parser[String, Int] =   | 
   111 lazy val T: Parser[String, Int] =   | 
   112   (F ~ "*" ~ T) ==> { case x ~ y ~ z => x * z } || F | 
   112   (F ~ "*" ~ T) ==> { case x ~ _ ~ z => x * z } || F | 
   113 lazy val F: Parser[String, Int] =   | 
   113 lazy val F: Parser[String, Int] =   | 
   114   ("(" ~ E ~ ")") ==> { case x ~ y ~ z => y } || NumParserInt | 
   114   ("(" ~ E ~ ")") ==> { case _ ~ y ~ _ => y } || NumParserInt | 
   115   | 
   115   | 
   116 /* same parser but producing a string  | 
   116 /* same parser but producing a string  | 
   117 lazy val E: Parser[String, String] =   | 
   117 lazy val E: Parser[String, String] =   | 
   118   (T ~ "+" ~ E) ==> { case ((x, y), z) => "(" + x + ")+(" + z + ")"} || T  | 
   118   (T ~ "+" ~ E) ==> { case x ~ y ~ z => "(" + x + ")+(" + z + ")"} || T  | 
   119 lazy val T: Parser[String, String] =   | 
   119 lazy val T: Parser[String, String] =   | 
   120   (F ~ "*" ~ T) ==> { case ((x, y), z) => "(" + x + ")*("+ z + ")"} || F | 
   120   (F ~ "*" ~ T) ==> { case x ~ y ~ z => "(" + x + ")*("+ z + ")"} || F | 
   121 lazy val F: Parser[String, String] =   | 
   121 lazy val F: Parser[String, String] =   | 
   122   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } || NumParser | 
   122   ("(" ~ E ~ ")") ==> { case x ~ y ~ z => y } || NumParser | 
   123 */  | 
   123 */  | 
   124   | 
   124   | 
   125 println(E.parse_all("1+3+4")) | 
   125 println(E.parse_all("1+3+4")) | 
   126 println(E.parse("1+3+4")) | 
   126 println(E.parse("1+3+4")) | 
   127 println(E.parse_all("4*2+3")) | 
   127 println(E.parse_all("4*2+3")) |