Created
June 19, 2010 20:27
-
-
Save dwins/445245 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import scala.util.parsing.combinator.{ Parsers, RegexParsers } | |
import scala.util.parsing.input.{ CharSequenceReader, Reader } | |
object ParsingExample extends Parsers { | |
override type Elem = Char | |
object Delimiter extends Parser[String] { | |
def apply(reader: Input): ParseResult[String] = { | |
if (reader atEnd) { | |
Failure("end of string", reader) | |
} else if (reader.first != '-') { | |
Failure("no separator found", reader) | |
} else { | |
Success(reader.first, reader.rest) | |
} | |
} | |
} | |
val DigitSequence = Parser { reader => | |
if (reader atEnd) { | |
Failure("end of string", reader) | |
} else if (!reader.first.isDigit) { | |
Failure("no digits found", reader) | |
} else { | |
var digits = reader.first.toString | |
var rest = reader.rest | |
while (!rest.atEnd && rest.first.isDigit) { | |
digits += rest.first | |
rest = rest.rest | |
} | |
Success(digits, rest) | |
} | |
} | |
case class RolodexCard(pre: String, post: String) | |
val PhoneNumber = DigitSequence ~ Delimiter ~ DigitSequence map { | |
case pre ~ _ ~ post => RolodexCard(pre, post) | |
} | |
} | |
object RegexParsingExample extends RegexParsers { | |
case class RolodexCard(pre: String, post: String) | |
val DigitSequence = """\d+""".r | |
val Delimiter = "-" | |
val PhoneNumber = DigitSequence ~ Delimiter ~ DigitSequence map { | |
case pre ~ _ ~ post => RolodexCard(pre, post) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment