组合器解析器〜也匹配空格

时间:2017-10-13 03:53:16

标签: scala parsing

我正在尝试解析遵循语法(x|y)+的字符串。也就是说,以下内容应该匹配:

x
y
xyyxyyxy
xyyxxy
and so on...

我有以下代码:

import scala.util.parsing.combinator._

class XYs extends JavaTokenParsers {
  def E: Parser[Any] = (C ~ E) | C
  def C: Parser[Any] = "x" | "y"
}

object Main extends XYs {
  def main(args: Array[String]) {
    while (true) {
      println(parse(E, scala.io.StdIn.readLine()))
    }
  }
}

这解析了应该匹配的字符串,但是它也匹配了一些不应该被接受的字符串,更准确地说是那些带空格的字符串。

xyy xyx可以使用xyyxy xyyx xy。是否有一个简单的解决方案,使空间不是解析的一部分?也许是一个不同的"运营商"比~

1 个答案:

答案 0 :(得分:1)

根据documentskipWhitespace默认启用RegexParsersJavaTokenParsers的子类RegexParsers启用class XYs extends JavaTokenParsers { override def skipWhitespace = false def E: Parser[Any] = (C ~ E) | C def C: Parser[Any] = "x" | "y" }

  

解析方法调用方法skipWhitespace(默认为true),如果为true,则在调用每个解析器之前跳过任何空格。

您可以通过覆盖它来关闭它。

class XYs extends JavaTokenParsers {
  override def skipWhitespace = false
  def E: Parser[Any] = rep1(C)
  def C: Parser[Any] = "x" | "y"
}

此外,您可以使用rep1来匹配非空重复

length