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 + -
显示快捷键?