0

我是新手 ANTLR 用户并尝试解析以下 sql create 语句。(我删除了 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 语句使用保留字“冲突”作为列名。如果我将列名 'conflict' 更改为其他名称,如 'conflict1',一切都很好。

我应该在哪里更改以解析上面的 SQL 语句?

解析树看起来像这样。

错误案例 正确案例

谢谢

4

1 回答 1

1

您将输入“冲突”定义为单独的标记 CONFLICT。因此,如果它也是有效的表名和列名,则应该可以:

name            : ID | '\"' ID '\"' | STRING_LITERAL | CONFLICT
于 2013-07-24T16:35:52.193 回答