Parsing 保留字干扰解析器组合器中的标识符

Parsing 保留字干扰解析器组合器中的标识符,parsing,keyword,identifier,parser-combinators,reserved-words,Parsing,Keyword,Identifier,Parser Combinators,Reserved Words,我有以下简单的语法 primary ::= name | literal factor ::= primary| "not" primary 我 如果主文件中只允许数字,wholeNumber则一切正常。但是,如果允许标识符,primary=wholeNumber | ident则解析失败,输入“not 1”,这应该是一个单因子项。显然,这是因为解析器决定“not”是主对象的标识符,而不是关键字前缀。如何解决冲突?我的解决方案是首先尝试保留字前缀的备选方案,请注意,primary |“not”

我有以下简单的语法

primary ::= name | literal
factor ::= primary| "not" primary


如果主文件中只允许数字,
wholeNumber
则一切正常。但是,如果允许标识符,
primary=wholeNumber | ident
则解析失败,输入“not 1”,这应该是一个单因子项。显然,这是因为解析器决定“not”是主对象的标识符,而不是关键字前缀。如何解决冲突?

我的解决方案是首先尝试保留字前缀的备选方案,请注意,
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)
}
但我仍然不确定这是一种正确的做法

更新。我在编译器中看到,保留的原则、技术和工具代表被禁止的标识符,这使得保留关键字时语言更容易。因此,
ident
必须过滤掉关键字

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)
}