我想使用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的超链接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中表达的?
我想这样做是可行的。
check_constraint_definition
: CHECK '(' boolean_value_expression ')'
;
boolean_value_expression
: (~')')+
| '(' boolean_value_expression ')'
;