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

时间:2013-05-17 09:47:38

标签: 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的一部分,模仿Jonathan Leffler的hyperlinked SQL BNF

column_definition
    : ID data_type column_constraint_definition*
    ;

column_constraint_definition
    : constraint_name_definition? column_constraint constraint_characteristics?
    ;

constraint_name_definition
    : CONSTRAINT ID
    ;

column_constraint
    : NOT NULL
    | UNIQUE | PRIMARY KEY
    | references_specification
    | check_constraint_definition
    ;

references_specification
    : REFERENCES ID ( '(' ID ( ',' ID )? )?
    ;

check_constraint_definition
    : CHECK '(' boolean_value_expression ')'
    ;

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

我想忽略左右括号之间的所有内容。但是允许使用嵌套括号。所以我不能忽略关闭括号的所有内容。相反,我必须计算开括号和右括号。如何在Antlr(4)BNF中表达?

1 个答案:

答案 0 :(得分:1)

我认为这样的事情会起作用。

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