2013-07-22 46 views
0

我是新手ANTLR用戶並試圖解析下面的sql create語句。 (我放棄了SQL和語法的一些不重要的部分)使用ANTLR4解析SQL CREATE語句:在輸入'衝突'時沒有可行的替代方案

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語句使用保留字'conflict'作爲列名。如果我用'conflict1'等其他名稱更改列名'衝突',一切都沒問題。

我應該在哪裏更改以解析上面的SQL語句?

解析樹看起來像這樣。

wrong case correct case

感謝

回答

1

您所定義的輸入 「衝突」 作爲一個單獨的令牌的衝突。所以如果它也是一個有效的表名和列名,這應該工作:

name   : ID | '\"' ID '\"' | STRING_LITERAL | CONFLICT 
+0

謝謝肯。有用! – yielding

相關問題