Parsing ANTLR模板化规则

Parsing ANTLR模板化规则,parsing,antlr,antlr4,Parsing,Antlr,Antlr4,我正在使用ANTLR 4解析SQL子集,目前,我面临一个问题。 我需要一个具有以下结构的谓词规则: predicate : expr relation expr | between_clause | predicate OR predicate | predicate AND predicate | '(' predicate ')' ; 这里的问题是一个expr规则。有不同类型的谓词,expr应该是不同的,但是前面提到的整个结构都保留了

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

predicate
    :
    expr relation expr
    | between_clause
    | predicate OR predicate
    | predicate AND predicate
    | '(' predicate ')'
    ;
这里的问题是一个
expr
规则。有不同类型的谓词,
expr
应该是不同的,但是前面提到的整个结构都保留了下来

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

在ANTLR 4中可能吗

另外,我有两种选择:

  • 复制粘贴
    谓词
    规则并手动替换不同的
    expr
    规则
  • expr
    规则中有所有可能的备选方案,并验证在目标语言代码中只有一种类型用于特定谓词
但他们两个看起来都很糟糕。第一种情况导致组合爆炸,第二种情况导致在语法级别接受大量不正确的谓词

在ANTLR 4中可能吗

不,ANTLR没有这样的功能

你的两个选择正是这些事情在实践中通常的做法。哪一个更可取取决于
expr
的不同替代品的确切差异

第二种方法导致在语法层面上接受大量不正确的谓词

语法中总是有你无法避免的错误类型,必须在单独的阶段处理。例如,键入错误或未声明的变量错误。因此,让语法接受错误的程序一点也不奇怪