regexparsers.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 94 行
SCALA
94 行
/* __ *\** ________ ___ / / ___ Scala API **** / __/ __// _ | / / / _ | (c) 2006-2007, LAMP/EPFL **** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **** /____/\___/_/ |_/____/_/ | | **** |/ **\* */// $Id: RegexParsers.scala 14543 2008-04-07 15:57:07Z odersky $package scala.util.parsing.combinatorimport java.util.regex.Patternimport scala.util.matching.Regeximport scala.util.parsing.input._import scala.collection.immutable.PagedSeqtrait RegexParsers extends Parsers { type Elem = Char protected val whiteSpace = """\s+""".r def skipWhitespace = whiteSpace.toString.length > 0 protected def handleWhiteSpace(source: java.lang.CharSequence, offset: Int): Int = if (skipWhitespace) (whiteSpace findPrefixMatchOf (source.subSequence(offset, source.length))) match { case Some(matched) => offset + matched.end case None => offset } else offset /** A parser that matches a literal string */ implicit def literal(s: String): Parser[String] = new Parser[String] { def apply(in: Input) = { val source = in.source val offset = in.offset val start = handleWhiteSpace(source, offset) var i = 0 var j = start while (i < s.length && j < source.length && s.charAt(i) == source.charAt(j)) { i += 1 j += 1 } if (i == s.length) Success(source.subSequence(start, j).toString, in.drop(j - offset)) else Failure("`"+s+"' expected but `"+in.first+"' found", in.drop(start - offset)) } } /** A parser that matches a regex string */ implicit def regex(r: Regex): Parser[String] = new Parser[String] { def apply(in: Input) = { val source = in.source val offset = in.offset val start = handleWhiteSpace(source, offset) (r findPrefixMatchOf (source.subSequence(start, source.length))) match { case Some(matched) => Success(source.subSequence(start, start + matched.end).toString, in.drop(start + matched.end - offset)) case None => Failure("string matching regex `+r+' expected but `"+in.first+"' found", in.drop(start - offset)) } } } /** Parse some prefix of reader `in' with parser `p' */ def parse[T](p: Parser[T], in: Reader[Char]): ParseResult[T] = p(in) /** Parse some prefix of character sequence `in' with parser `p' */ def parse[T](p: Parser[T], in: java.lang.CharSequence): ParseResult[T] = p(new CharSequenceReader(in)) /** Parse some prefix of reader `in' with parser `p' */ def parse[T](p: Parser[T], in: java.io.Reader): ParseResult[T] = p(new PagedSeqReader(PagedSeq.fromReader(in))) /** Parse all of reader `in' with parser `p' */ def parseAll[T](p: Parser[T], in: Reader[Char]): ParseResult[T] = parse(phrase(p), in) /** Parse all of reader `in' with parser `p' */ def parseAll[T](p: Parser[T], in: java.io.Reader): ParseResult[T] = parse(phrase(p), in) /** Parse all of character sequence `in' with parser `p' */ def parseAll[T](p: Parser[T], in: java.lang.CharSequence): ParseResult[T] = parse(phrase(p), in)}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?