Я хотел бы использовать Antlr для анализа операторов DDL таблицы SQL. Но мне нужны только идентификаторы столбцов и типы столбцов. Меня не волнуют какие-либо ограничения, и я хотел бы избежать написания всего синтаксиса специально для ограничений CHECK
, потому что мне кажется, что это почти все в SQL.
Это пример ограничения:
CREATE TABLE "T" (
"A" CHAR (1) CHECK ( "A" IN ('N', 'Y')),
"B" CHAR (1) CHECK ( "B" IN ('N', 'Y'))
);
А это часть BNF, созданная по образцу с гиперссылками 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?