我想在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'中的''''''''''''''''''''''的錯誤。我添加了明確照顧空白區域的另一個版本。 –