我正在尝试解析遵循语法(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
。是否有一个简单的解决方案,使空间不是解析的一部分?也许是一个不同的"运营商"比~
?
答案 0 :(得分:1)
根据document,skipWhitespace
默认启用RegexParsers
,JavaTokenParsers
的子类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