progs/parser-combinators/comb1.sc
changeset 1024 c54cba4e59e7
parent 973 db987b9717a4
equal deleted inserted replaced
1023:fa3e3d00b802 1024:c54cba4e59e7
    67 
    67 
    68 print(ap.parse("aade"))
    68 print(ap.parse("aade"))
    69 
    69 
    70 val abp = SeqParser(ap, bp)
    70 val abp = SeqParser(ap, bp)
    71 print(abp.parse("abade"))
    71 print(abp.parse("abade"))
    72 
       
    73 val abp = AltParser(ap, bp)
       
    74 print(abp.parse("abc"))
    72 print(abp.parse("abc"))
    75 
    73 
    76 MapParser(abp, ab => s"$ab").parse("abc")
    74 MapParser(abp, ab => s"$ab").parse("abc")
    77 
    75 
    78 // an atomic parser for parsing strings according to a regex
    76 // an atomic parser for parsing strings according to a regex
   177 lazy val T: Parser[String, Int] = {
   175 lazy val T: Parser[String, Int] = {
   178   (F ~ p"*" ~ T).map{ case ((x, _), z) => x * z } || F }
   176   (F ~ p"*" ~ T).map{ case ((x, _), z) => x * z } || F }
   179 lazy val F: Parser[String, Int] = {
   177 lazy val F: Parser[String, Int] = {
   180   (p"(" ~ E ~ p")").map{ case ((_, y), _) => y } || NumParserInt }
   178   (p"(" ~ E ~ p")").map{ case ((_, y), _) => y } || NumParserInt }
   181 
   179 
   182 println(E.parse_all("2 * 2 * 2"))
   180 println(E.parse_all("2*2*2"))
   183 println(E.parse_all("1+3+4"))
   181 println(E.parse_all("1+3+4"))
   184 println(E.parse("1+3+4"))
   182 println(E.parse("1+3+4"))
   185 println(E.parse_all("4*2+3"))
   183 println(E.parse_all("4*2+3"))
   186 println(E.parse_all("4*(2+3)"))
   184 println(E.parse_all("4*(2+3)"))
   187 println(E.parse_all("(4)*(((2+3)))"))
   185 println(E.parse_all("(4)*(((2+3)))"))