【问题标题】:ANTLR templated rulesANTLR 模板化规则
【发布时间】:2019-10-14 23:45:00
【问题描述】:

我正在使用 ANTLR 4 解析 SQL 子集,目前我遇到了一个问题。 我需要一个具有以下结构的谓词规则:

predicate
    :
    expr relation expr
    | between_clause
    | predicate OR predicate
    | predicate AND predicate
    | '(' predicate ')'
    ;

这里的问题是expr 规则。有不同类型的谓词,expr 应该不同,但保留了前面提到的整个结构。

我想以某种方式对 predicate 规则进行参数化,以便为不同的谓词类型自动实例化多个规则(上面的规则替换了特定的 expr 类型)。

在 ANTLR 4 中可以吗?

附:我看到了两个替代选项:

  • 复制粘贴predicate 规则并手动替换不同的expr 规则
  • expr 规则中包含所有可能的替代方案,并验证其中只有一种类型用于目标语言代码中的特定谓词

但他们两个看起来都够糟糕的了。第一种情况导致组合爆炸,第二种情况导致在语法层面接受很多不正确的谓词。

【问题讨论】:

    标签: parsing antlr antlr4


    【解决方案1】:

    在 ANTLR 4 中可以吗?

    不,ANTLR 没有这样的功能。

    您的两种选择正是这些事情在实践中通常的做法。哪一个更可取取决于expr 的不同替换究竟有何不同。

    第二个导致在语法层面上接受了很多不正确的谓词。

    总会有一些你无法在语法中预防的错误类型,必须在单独的阶段进行处理。例如,类型错误或未声明的变量错误。所以让语法接受不正确的程序一点也不稀奇。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多