首页 > 解决方案 > ANTLR 模板化规则

问题描述

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

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

这里的问题是一个expr规则。有不同类型的谓词expr应该有所不同,但保留了整个上述结构。

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

在 ANTLR 4 中可以吗?

PS我看到两个替代选项:

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

标签: parsingantlrantlr4

解决方案


在 ANTLR 4 中可以吗?

不,ANTLR 没有这样的功能。

您的两个选择正是这些事情在实践中通常是如何完成的。哪一个更可取取决于不同的替代品到底有多大expr不同。

第二个导致在语法级别上接受许多不正确的谓词。

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


推荐阅读