我想在scala中编写一个简单的解析器,但是当我添加重复的令牌时Scala似乎陷入了无限循环。scala解析器组合器无限循环
我有2个下面的解析方法。一个使用rep()。非重复版本按预期工作(不是我想要的),但使用rep()版本会导致无限循环。
编辑: 这是一个学习的例子,我厌倦了执行'='被空白包围。
如果它是有帮助的,这是我的实际测试文件:
a = 1
b = 2
c = 1 2 3
我能够解析:(与parse1法) ķ= 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")
}
}
}
呃,我不应该迟疑。这是一个可怕的问题.... 我会更新,但是是的目标是写一个解析器(用于学习),强制K = V与强制性空白。它看起来像一个简单的初学者解析器。 – user2466803
我不确定在这里做什么。看起来这个问题已经得到解答,但它没有。这在很大程度上是我错误地提出这个问题的错。是否有可能把Andrey Tyukin折腾出一些业力或者做出伟大的尝试,但这仍然表明我被困在这里? – user2466803
再次。对不起,我没有意识到你关心空白。我认为这是关于'''''Parser'中的''''''''''''''''''''''的错误。我添加了明确照顾空白区域的另一个版本。 –