Scala Combinator parser~也匹配空格

Scala Combinator parser~也匹配空格,scala,parsing,Scala,Parsing,我试图解析遵循语法(x | y)+的字符串。也就是说,以下各项应匹配: x y xyyxyyxy xyyxxy and so on... 我有以下代码: 导入scala.util.parsing.combinator_ 类XYs扩展了JavaTokenParser{ def E:Parser[Any]=(C~E)| C def C:Parser[Any]=“x”|“y” } 对象主对象扩展XYs{ def main(参数:数组[字符串]){ while(true){ println(parse

我试图解析遵循语法
(x | y)+
的字符串。也就是说,以下各项应匹配:

x
y
xyyxyyxy
xyyxxy
and so on...
我有以下代码:

导入scala.util.parsing.combinator_
类XYs扩展了JavaTokenParser{
def E:Parser[Any]=(C~E)| C
def C:Parser[Any]=“x”|“y”
}
对象主对象扩展XYs{
def main(参数:数组[字符串]){
while(true){
println(parse(E,scala.io.StdIn.readLine())
}
}
}
这将解析应该匹配的字符串,但是它也会匹配一些不应该被接受的字符串,更准确地说是那些带有空格的字符串

xyy-xyx
工作,以及
xyyxy-xyx-xy
。有没有一个简单的解决方案使空格不成为解析的一部分?可能是与
~
不同的“运算符”?

根据,默认情况下,
RegexParsers
以及
RegexParsers
的子类
skipWhitespace
打开

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

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

class XYs extends JavaTokenParsers {
  override def skipWhitespace = false
  def E: Parser[Any] = (C ~ E) | C
  def C: Parser[Any] = "x" | "y"
}
您还可以使用来匹配非空重复

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

非常感谢。还必须将
parse
更改为
parseAll
,否则将只解析第一个段。谢谢