【问题标题】:Reserved words interferece with identifiers in parser combinators保留字会干扰解析器组合器中的标识符
【发布时间】:2016-03-30 21:58:51
【问题描述】:

我有以下简单语法

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 则解析失败,输入“not 1”,这应该是一个单因素术语。显然,这是因为解析器决定“not”是一个标识符,而不是一个主要的关键字前缀。你如何解决这些冲突?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多