【发布时间】:2015-06-23 05:35:58
【问题描述】:
我正在尝试在 scala 中编写一个简单的解析器,但是当我添加一个重复的标记时,Scala 似乎陷入了无限循环。
我在下面有 2 种解析方法。一个使用rep()。使用 rep() 版本的非重复版本按预期工作(虽然不是我想要的)导致无限循环。
编辑: 这是一个学习示例,我厌倦了强制“=”被空格包围。
如果有帮助,这是我的实际测试文件:
a = 1
b = 2
c = 1 2 3
我能够解析:(使用 parse1 方法) K = V
但在尝试将练习扩展到以下内容时遇到了这个问题: K = V1 V2 V3
import scala.util.parsing.combinator._
import scala.io.Source.fromFile
class MyParser extends RegexParsers {
override def skipWhitespace(): Boolean = { false }
def key: Parser[String] = """[a-zA-Z]+""".r ^^ { _.toString }
def eq: Parser[String] = """\s+=\s+""".r ^^ { _.toString.trim }
def string: Parser[String] = """[^ \t\n]*""".r ^^ { _.toString.trim }
def value: Parser[List[String]] = rep(string)
def foo(key: String, value: String): Boolean = {
println(key + " = " + value)
true
}
def parse1: Parser[Boolean] = key ~ eq ~ string ^^ { case k ~ eq ~ string => foo(k, string) }
def parse2: Parser[Boolean] = key ~ eq ~ value ^^ { case k ~ eq ~ value => foo(k, value.toString) }
def parseLine(line: String): Boolean = {
parse(parse2, line) match {
case Success(matched, _) => true
case Failure(msg, _) => false
case Error(msg, _) => false
}
}
}
object TestParser {
def usage() = {
System.out.println("<file>")
}
def main(args: Array[String]) : Unit = {
if (args.length != 1) {
usage()
} else {
val mp = new MyParser()
fromFile(args(0)).getLines().foreach { mp.parseLine }
println("done")
}
}
}
【问题讨论】:
标签: scala parsing parser-combinators