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

时间:2015-12-24 12:49:58

标签: parsing keyword identifier parser-combinators reserved-words

我有以下简单的语法

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 ;,这应该是单因素术语。显然,这是因为解析器决定"不是"是主要的标识符而不是关键字前缀。你如何解决冲突?

1 个答案:

答案 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必须过滤掉关键字。