Professional Documents
Culture Documents
Page 2 of 2
1 import Parser.{Parser, SuccessParse}
2
3 object BasicParsers {
4
5 case class anyChar() extends Parser[Char] {
6 override def parseFunction(elementToParse: String): SuccessParse[Char] = {
7 (elementToParse.charAt(0), elementToParse.substring(1))
8 }
9 }
10
11 def char(charToFind: Char): Parser[Char] = anyChar().satisfies(_==charToFind)
12
13 val void: Parser[Unit] = anyChar().const(())
14
15 def matches(regex: String): Parser[Char] = anyChar().satisfies(_.toString.matches(regex))
16
17 val letter: Parser[Char] = matches("[a-zA-Z]")
18
19 val digit: Parser[Char] = matches("[0-9]")
20
21 val number: Parser[Int] = digit.map(_.asDigit)
22
23 val alphaNum: Parser[Char] = letter <|> digit
24
25 case class string(stringToFind: String) extends Parser[String] {
26 override def parseFunction(elementToParse: String) : SuccessParse[String] = {
27 if(!elementToParse.startsWith(stringToFind)) throw new RuntimeException("El elemento no empieza con el
string a buscar")
28 (stringToFind, elementToParse.replaceFirst(stringToFind, ""))
29 }
30 }
31
32 }
33
Page 1 of 1
1 import Parser.{Parser, SuccessParse}
2 import scala.util.{Failure, Success}
3
4 object CombinableParsers {
5 case class or[T](aParser: Parser[T], anotherParser: Parser[T]) extends Parser[T] {
6 override def parseFunction(elementToParse: String): SuccessParse[T] = {
7 val result = aParser.parse(elementToParse) orElse anotherParser.parse(elementToParse)
8 result match {
9 case Success(value) => value
10 case Failure(_) => throw new RuntimeException("El elemento no satisface ningun parser")
11 }
12 }
13 }
14
15 case class concat[T, U](aParser: Parser[T], anotherParser: Parser[U]) extends Parser[(T,U)] {
16 override def parseFunction(elementToParse: String): SuccessParse[(T,U)] = {
17 val result = for {
18 (value1, rest1) <- aParser.parse(elementToParse)
19 (value2, rest2) <- anotherParser.parse(rest1)
20 } yield ((value1, value2), rest2)
21 result.get
22 }
23 }
24
25 def rightMost[T, U](aParser: Parser[T], anotherParser: Parser[U]): Parser[U] = (aParser <> anotherParser).map
{
26 case (_, value2) => value2
27 }
28
29 def leftMost[T, U](aParser: Parser[T], anotherParser: Parser[U]): Parser[T] = (aParser <> anotherParser).map {
30 case (value1, _) => value1
31 }
32
33 }
34
Page 1 of 1
1 import Parser.{Parser, SuccessParse}
2 import scala.util.{Failure, Success}
3
4 object OperationsParsers {
5 case class satisfy[T](parser: Parser[T], condition: T => Boolean) extends Parser[T] {
6 override def parseFunction(elementToParse: String): SuccessParse[T] = {
7 val (value, rest) = parser.parse(elementToParse).get
8 if(!condition(value)) throw new RuntimeException("El elemento parseado no satisface la condicion dada")
9 (value, rest)
10 }
11 }
12
13 case class optional[T](parser: Parser[T]) extends Parser[Option[T]] {
14 override def parseFunction(elementToParse: String): SuccessParse[Option[T]] = {
15 val result = parser.parse(elementToParse)
16 result match {
17 case Success((value, rest)) => (Some(value), rest)
18 case Failure(_) => (None, elementToParse)
19 }
20 }
21 }
22
23 case class kleene[T](parser: Parser[T]) extends Parser[List[T]] {
24
25 private def getParseIterations(elementToParse: String, iterationsValues: List[T]): SuccessParse[List[T]] = {
26 val parsedElement = parser.parse(elementToParse)
27 parsedElement match {
28 case Failure(_) => (iterationsValues, elementToParse)
29 case Success((value, rest)) => getParseIterations(rest, iterationsValues ::: List(value))
30 }
31 }
32
33 override def parseFunction(elementToParse: String): SuccessParse[List[T]] = {
34 getParseIterations(elementToParse, List.empty)
35 }
Page 1 of 2
36 }
37
38 def plus[T](parser: Parser[T]): Parser[List[T]] = parser.*().satisfies(_.nonEmpty)
39
40 def separator[T, U](parser: Parser[T], sepParser: Parser[U]): Parser[List[T]] = ((parser <~ sepParser).+ <>
parser).map {
41 case (valueList, lastValue) => valueList ::: List(lastValue)
42 }
43
44 def constant[T, U](parser: Parser[T], value: U): Parser[U] = parser.map{ _ => value }
45
46 case class mapped[T, U](parser: Parser[T], transform: T => U) extends Parser[U] {
47 override def parseFunction(elementToParse: String): (U, String) = {
48 val (value, rest) = parser.parse(elementToParse).get
49 (transform(value), rest)
50 }
51 }
52
53 }
54
Page 2 of 2