延伸JavaTokenParsers
,我有以下内容:
class Foo extends JavaTokenParsers {
lazy val check = id ~ action ~ obj
lazy val id = "FOO" | "BAR"
lazy val action = "GET" | "SET"
lazy val obj = "BAZ" | "BIZ"
}
我原以为空格将充当分隔符。换句话说,当我check
成功解析以下表达式:FOO GETBAZ
.
val result = parseAll(check, "FOO GETBAZ")
println(result.get)
Result
((FOO~GET)~BAZ)
我如何使用空格作为delimiter
,即上面的内容不会成功解析,因为GETBAZ
不匹配任何一个action
's GET
or SET
?
JavaTokenParser
添加一些方法RegexParsers
,但它不会改变的行为literal
,它将匹配它的参数,而不用担心它周围的内容。
The skipWhitespace
设置也不会对您有帮助,因为它只指定是否忽略空格,而不指定是否需要空格。
你有几个选择。一种是使用带有单词边界的正则表达式:
class Foo extends JavaTokenParsers {
def word(s: String): Parser[String] = regex(s"\\b$s\\b".r)
lazy val check = id ~ action ~ obj
val id = word("FOO") | word("BAR")
val action = word("GET") | word("SET")
val obj = word("BAZ") | word("BIZ")
}
Or ident
:
class Foo extends JavaTokenParsers {
def word(s: String): Parser[String] = ident.filter(_ == s)
lazy val check = id ~ action ~ obj
val id = word("FOO") | word("BAR")
val action = word("GET") | word("SET")
val obj = word("BAZ") | word("BIZ")
}
或者您可以在每个项目之间手动添加空格解析器。
我可能会选择\b
解决方案,但这很大程度上取决于品味和偏好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)