Sql 如何在语法上忽略Antlr BNF中表达式的一部分?

Sql 如何在语法上忽略Antlr BNF中表达式的一部分?,sql,antlr,antlr4,ebnf,Sql,Antlr,Antlr4,Ebnf,我想使用Antlr来解析SQL表DDL语句。但我只需要列标识符和列类型。我不关心任何约束,我希望避免编写整个语法,特别是针对CHECK约束,因为在我看来,这几乎就是SQL的全部内容 这是约束的一个示例: CREATE TABLE "T" ( "A" CHAR (1) CHECK ( "A" IN ('N', 'Y')), "B" CHAR (1) CHECK ( "B" IN ('N', 'Y')) ); 这是BNF的一部分,模仿乔纳森·莱夫勒的: 我的问题是如何忽略任何布尔值

我想使用Antlr来解析SQL表DDL语句。但我只需要列标识符和列类型。我不关心任何约束,我希望避免编写整个语法,特别是针对
CHECK
约束,因为在我看来,这几乎就是SQL的全部内容

这是约束的一个示例:

 CREATE TABLE "T" (
   "A" CHAR (1) CHECK ( "A" IN ('N', 'Y')),
   "B" CHAR (1) CHECK ( "B" IN ('N', 'Y'))
 );
这是BNF的一部分,模仿乔纳森·莱夫勒的:

我的问题是如何忽略任何布尔值表达式而不详细指定其内容


我想忽略左括号和右括号之间的所有内容。但是可以使用嵌套括号。所以我不能忽略所有的事情,直到最后的括号。相反,我必须计算开始和结束括号。这怎么能用Antlr(4)BNF来表达呢?

我认为类似的东西会起作用

check_constraint_definition
    : CHECK '(' boolean_value_expression ')'
    ;
boolean_value_expression
    : (~')')+
    | '(' boolean_value_expression ')'
    ;

我尝试了类似的方法,但没有成功:我找到了我的bug。这就是路。但是我必须定义两个规则来实现递归,因为括号表达式可以包含额外的括号。
check_constraint_definition
    : CHECK '(' boolean_value_expression ')'
    ;
boolean_value_expression
    : (~')')+
    | '(' boolean_value_expression ')'
    ;