我有以下简单的语法
primary ::= name | literal
factor ::= primary| "not" primary
我try to parse with the help of scala combinators
import scala.util.parsing.combinator._
object ExprWithReservedWords extends App with JavaTokenParsers {
def test(title: String, primary: Parser[_]) {
println(title + " " + parseAll(primary | "not" ~ primary, "not 1 "))
}
test("wholeNumber", wholeNumber) // parsed: (not~1)
test("wholeNumber | ident", wholeNumber | ident) // failure: string matching regex `\z' expected but `1' found
}
如果主要版本中只允许使用数字wholeNumber
,那么一切都很好。但是,如果允许使用标识符primary = wholeNumber | ident
,则解析将失败并输入"而不是1&#34 ;,这应该是单因素术语。显然,这是因为解析器决定"不是"是主要的标识符而不是关键字前缀。你如何解决冲突?
答案 0 :(得分:0)
我的解决方案是首先尝试保留的带字词的前缀,注意primary | "not" primary
已更改为"not" primary | primary
import scala.util.parsing.combinator._
object ExprWithReservedWords extends App with JavaTokenParsers {
def test(title: String, primary: Parser[_]) {
println(title + " " + parseAll("not" ~ primary | primary, "not 1 "))
}
test("wholeNumber", wholeNumber)
test("wholeNumber | ident", wholeNumber | ident)
}
This works但我仍然不确定这是一种正确的做法。
更新。我在 Compilers,Principles,Techniques,& 保留的工具代表禁用的标识符,这使得在保留关键字时语言变得更加容易。因此,ident
必须过滤掉关键字。