Как синтаксически игнорировать часть выражения в Antlr BNF?

Я хотел бы использовать 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?


person ceving    schedule 17.05.2013    source источник


Ответы (1)


Я думаю, что-то вроде этого будет работать.

check_constraint_definition
    : CHECK '(' boolean_value_expression ')'
    ;
boolean_value_expression
    : (~')')+
    | '(' boolean_value_expression ')'
    ;
person monty0    schedule 17.05.2013
comment
Я пробовал нечто подобное, но безуспешно: groups.google.com/d/ msg/antlr-discussion/759y87plOOM/ - person ceving; 18.05.2013
comment
Я нашел свой баг. Это путь. Но мне пришлось определить два правила для реализации рекурсии, потому что выражение в скобках может содержать дополнительные скобки. - person ceving; 21.05.2013