разбор оператора SQL CREATE с использованием ANTLR4: нет жизнеспособной альтернативы при входе «конфликт»

Я новичок в ANTLR и пытаюсь разобрать следующий оператор создания sql. (Я отказался от какой-то неважной части как SQL, так и грамматики)

CREATE TABLE Account (_id integer primary key, conflict integer default 1);

и грамматика такая: (Вы можете скомпилировать эту грамматику с помощью копирования и вставки)

grammar CreateTable;

tableList : (createTableStmt)* ;

createTableStmt : CREATE TABLE tableName LP columnDefs (COMMA tableConstraints)? RP SEMICOLON ;

columnDefs      : columnDef (COMMA columnDef)* ;
columnDef       : columnName typeName? columnConstraint* ;
typeName        : sqliteType (LP SIGNED_NUMBER (COMMA SIGNED_NUMBER)? RP)?  ;
sqliteType      : intType | textType | ID ;
intType         : 'INTEGER'|'LONG';
textType        : TEXT ; 

columnConstraint
    : (CONSTRAINT name)? PRIMARY KEY conflictClause?
    | (CONSTRAINT name)? UNIQUE conflictClause?
    | (CONSTRAINT name)? DEFAULT SIGNED_NUMBER
    ;

tableConstraints
    : tableConstraint (COMMA tableConstraint)* ;

tableConstraint
    : (CONSTRAINT name)? (PRIMARY KEY|UNIQUE) LP indexedColumns RP conflictClause? ;

conflictClause  : ON CONFLICT REPLACE ;
indexedColumns  : indexedColumn (COMMA indexedColumn)* ;
indexedColumn   : columnName;
columnName      : name ;
tableName       : name ;
name            : ID | '\"' ID '\"' | STRING_LITERAL ;

SIGNED_NUMBER   : (PLUS|MINUS)? NUMERIC_LITERAL ;
NUMERIC_LITERAL : DIGIT+ ;
STRING_LITERAL  : '\'' (~'\'')* '\'' ;

LP              : '(' ;
RP              : ')' ;
COMMA           : ',' ;
SEMICOLON       : ';' ;
PLUS            : '+' ;
MINUS           : '-' ;

CONFLICT        : C O N F L I C T ; 
CONSTRAINT      : C O N S T R A I N T ; 
CREATE          : C R E A T E ; 
DEFAULT         : D E F A U L T;
KEY             : K E Y ; 
ON              : O N;
PRIMARY         : P R I M A R Y ; 
REPLACE         : R E P L A C E;
TABLE           : T A B L E ; 
TEXT            : T E X T;
UNIQUE          : U N I Q U E ; 

WS              : [ \t\r\n\f]+ -> channel(HIDDEN);
ID              : LETTER (LETTER|DIGIT)*;
fragment LETTER : [a-zA-Z_];
fragment DIGIT  : [0-9] ;
NL              : '\r'? '\n' ;

fragment A:('a'|'A'); fragment B:('b'|'B'); fragment C:('c'|'C'); 
fragment D:('d'|'D'); fragment E:('e'|'E'); fragment F:('f'|'F'); 
fragment G:('g'|'G'); fragment I:('i'|'I'); fragment K:('k'|'K'); 
fragment L:('l'|'L'); fragment M:('m'|'M'); fragment N:('n'|'N'); 
fragment O:('o'|'O'); fragment P:('p'|'P'); fragment Q:('q'|'Q'); 
fragment R:('r'|'R'); fragment S:('s'|'S'); fragment T:('t'|'T'); 
fragment U:('u'|'U'); fragment X:('x'|'X');

Кстати, приведенный выше оператор SQL, который я должен разобрать, использует зарезервированное слово «конфликт» в качестве имени столбца. Если я изменю имя столбца «конфликт» на другое имя, например «конфликт1», все будет в порядке.

Где я должен изменить, чтобы проанализировать приведенный выше оператор SQL?

Деревья синтаксического анализа выглядят следующим образом.

неправильный регистрправильный регистр

Спасибо


person yielding    schedule 22.07.2013    source источник


Ответы (1)


Вы определяете входной «конфликт» как отдельный токен CONFLICT. Поэтому, если это также допустимое имя таблицы и имя столбца, это должно работать:

name            : ID | '\"' ID '\"' | STRING_LITERAL | CONFLICT
person Ken Homer    schedule 24.07.2013