2

我正在尝试在 scala 中编写一个简单的解析器,但是当我添加一个重复的标记时,Scala 似乎陷入了无限循环......

object RewriteRuleParsers extends RegexParsers {
  private def space = regex(new Regex("[ \\n]+"))
  private def number = regex(new Regex("[0-9]+")) 
  private def equals = (space?)~"="~(space?)
  private def word   = regex(new Regex("[a-zA-Z][a-zA-Z0-9-]*")) 
  private def string = regex(new Regex("[0-9]+")) >> { len => ":" ~> regex(new Regex(".{" + len + "}")) }  

  private def matchTokenPartContent: Parser[Any] = (space?)~word~equals~word<~ space?  
  private def matchTokenPart: Parser[Any] = ((space?) ~> "{" ~> matchTokenPartContent <~ "}"<~ space?)  
  private def matchTokenParts = (matchTokenPart *)  
  private def matchToken: Parser[Any] = ("[" ~> matchTokenParts ~ "]")

  def parseMatchToken(str: String): ParseResult[Any] = parse(matchToken, str)
}

以及调用它的代码

val parseResult = RewriteRuleParsers.parseMatchToken("[{tag=hello}]")

收到任何建议

4

1 回答 1

1

问题是 的优先级?。以以下为例:

object simpleParser extends RegexParsers {
  val a = literal("a")
  val b = literal("b")
  def apply(s: String) = this.parseAll(a <~ b?, s)
}

这里a <~ b?被解释为(a <~ b)?,所以它会接受"ab"or "",但不接受"a"a <~ (b?)如果我们希望它接受,我们需要写"a"

在您的情况下,您可以在 andspace?末尾matchTokenPartContent加上括号matchTokenPart,它会按预期工作。

于 2012-07-27T13:35:55.070 回答