grammar: Support escaping backticks using double backticks

This adds support for escaping backticks inside an identifier using
backticks as quote characters by adding a second backtick following the
first one (e.g. `test``test`  => 'test`test').
This commit is contained in:
Martin Kleusberg
2015-08-17 00:16:03 +02:00
parent 282c439228
commit 160bc87d3c
3 changed files with 79 additions and 73 deletions

View File

@@ -472,17 +472,23 @@ void Sqlite3Lexer::mQUOTEDID(bool _createToken) {
match(L'`' /* charlit */ );
{ // ( ... )*
for (;;) {
if ((_tokenSet_0.member(LA(1)))) {
if ((LA(1) == 0x60 /* '`' */ ) && (LA(2) == 0x60 /* '`' */ )) {
{
match(L'`' /* charlit */ );
match(L'`' /* charlit */ );
}
}
else if ((_tokenSet_0.member(LA(1)))) {
{
match(_tokenSet_0);
}
}
else {
goto _loop10;
goto _loop11;
}
}
_loop10:;
_loop11:;
} // ( ... )*
match(L'`' /* charlit */ );
break;
@@ -498,11 +504,11 @@ void Sqlite3Lexer::mQUOTEDID(bool _createToken) {
}
}
else {
goto _loop13;
goto _loop14;
}
}
_loop13:;
_loop14:;
} // ( ... )*
match(L']' /* charlit */ );
break;
@@ -538,11 +544,11 @@ void Sqlite3Lexer::mQUOTEDLITERAL(bool _createToken) {
matchNot(L'\"' /* charlit */ );
}
else {
goto _loop17;
goto _loop18;
}
}
_loop17:;
_loop18:;
} // ( ... )*
match(L'\"' /* charlit */ );
if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {
@@ -572,18 +578,18 @@ void Sqlite3Lexer::mNUMERIC(bool _createToken) {
case 0x39 /* '9' */ :
{
{ // ( ... )+
int _cnt21=0;
int _cnt22=0;
for (;;) {
if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
mDIGIT(false);
}
else {
if ( _cnt21>=1 ) { goto _loop21; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
if ( _cnt22>=1 ) { goto _loop22; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
}
_cnt21++;
_cnt22++;
}
_loop21:;
_loop22:;
} // ( ... )+
{
if ((LA(1) == 0x2e /* '.' */ )) {
@@ -594,11 +600,11 @@ void Sqlite3Lexer::mNUMERIC(bool _createToken) {
mDIGIT(false);
}
else {
goto _loop24;
goto _loop25;
}
}
_loop24:;
_loop25:;
} // ( ... )*
}
else {
@@ -612,18 +618,18 @@ void Sqlite3Lexer::mNUMERIC(bool _createToken) {
match(L'.' /* charlit */ );
_ttype=DOT;
{ // ( ... )+
int _cnt26=0;
int _cnt27=0;
for (;;) {
if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
mDIGIT(false);
}
else {
if ( _cnt26>=1 ) { goto _loop26; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
if ( _cnt27>=1 ) { goto _loop27; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
}
_cnt26++;
_cnt27++;
}
_loop26:;
_loop27:;
} // ( ... )+
break;
}
@@ -668,18 +674,18 @@ void Sqlite3Lexer::mNUMERIC(bool _createToken) {
}
}
{ // ( ... )+
int _cnt30=0;
int _cnt31=0;
for (;;) {
if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) {
mDIGIT(false);
}
else {
if ( _cnt30>=1 ) { goto _loop30; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
if ( _cnt31>=1 ) { goto _loop31; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());}
}
_cnt30++;
_cnt31++;
}
_loop30:;
_loop31:;
} // ( ... )+
}
else {
@@ -773,11 +779,11 @@ void Sqlite3Lexer::mCOMMENT(bool _createToken) {
}
}
else {
goto _loop37;
goto _loop38;
}
}
_loop37:;
_loop38:;
} // ( ... )*
mNL(false);
newline();
@@ -790,7 +796,7 @@ void Sqlite3Lexer::mCOMMENT(bool _createToken) {
{ // ( ... )*
for (;;) {
// nongreedy exit test
if ((LA(1) == 0x2a /* '*' */ ) && (LA(2) == 0x2f /* '/' */ )) goto _loop40;
if ((LA(1) == 0x2a /* '*' */ ) && (LA(2) == 0x2f /* '/' */ )) goto _loop41;
if ((_tokenSet_3.member(LA(1))) && ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xfffe))) {
{
match(_tokenSet_3);
@@ -801,11 +807,11 @@ void Sqlite3Lexer::mCOMMENT(bool _createToken) {
newline();
}
else {
goto _loop40;
goto _loop41;
}
}
_loop40:;
_loop41:;
} // ( ... )*
match(L'*' /* charlit */ );
match(L'/' /* charlit */ );
@@ -887,11 +893,11 @@ void Sqlite3Lexer::mSTRINGLITERAL(bool _createToken) {
matchNot(L'\'' /* charlit */ );
}
else {
goto _loop46;
goto _loop47;
}
}
_loop46:;
_loop47:;
} // ( ... )*
match(L'\'' /* charlit */ );
if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) {

View File

@@ -280,11 +280,11 @@ void Sqlite3Parser::statementlist() {
}
}
else {
goto _loop81;
goto _loop82;
}
}
_loop81:;
_loop82:;
} // ( ... )*
statementlist_AST = currentAST.root;
returnAST = statementlist_AST;
@@ -498,11 +498,11 @@ void Sqlite3Parser::createtable() {
}
}
else {
goto _loop92;
goto _loop93;
}
}
_loop92:;
_loop93:;
} // ( ... )*
{ // ( ... )*
for (;;) {
@@ -539,11 +539,11 @@ void Sqlite3Parser::createtable() {
}
}
else {
goto _loop95;
goto _loop96;
}
}
_loop95:;
_loop96:;
} // ( ... )*
ANTLR_USE_NAMESPACE(antlr)RefAST tmp21_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
@@ -980,11 +980,11 @@ void Sqlite3Parser::columndef() {
}
}
else {
goto _loop104;
goto _loop105;
}
}
_loop104:;
_loop105:;
} // ( ... )*
if ( inputState->guessing==0 ) {
columndef_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root);
@@ -1076,11 +1076,11 @@ void Sqlite3Parser::tableconstraint() {
}
}
else {
goto _loop125;
goto _loop126;
}
}
_loop125:;
_loop126:;
} // ( ... )*
ANTLR_USE_NAMESPACE(antlr)RefAST tmp57_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
@@ -1149,11 +1149,11 @@ void Sqlite3Parser::tableconstraint() {
}
}
else {
goto _loop128;
goto _loop129;
}
}
_loop128:;
_loop129:;
} // ( ... )*
ANTLR_USE_NAMESPACE(antlr)RefAST tmp61_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
@@ -1254,11 +1254,11 @@ void Sqlite3Parser::tableconstraint() {
}
}
else {
goto _loop131;
goto _loop132;
}
}
_loop131:;
_loop132:;
} // ( ... )*
ANTLR_USE_NAMESPACE(antlr)RefAST tmp69_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
@@ -1940,7 +1940,7 @@ void Sqlite3Parser::type_name() {
ANTLR_USE_NAMESPACE(antlr)RefAST type_name_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
{ // ( ... )+
int _cnt108=0;
int _cnt109=0;
for (;;) {
if ((_tokenSet_1.member(LA(1)))) {
name();
@@ -1949,12 +1949,12 @@ void Sqlite3Parser::type_name() {
}
}
else {
if ( _cnt108>=1 ) { goto _loop108; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
if ( _cnt109>=1 ) { goto _loop109; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
}
_cnt108++;
_cnt109++;
}
_loop108:;
_loop109:;
} // ( ... )+
{
switch ( LA(1)) {
@@ -2671,11 +2671,11 @@ void Sqlite3Parser::expr() {
}
}
else {
goto _loop159;
goto _loop160;
}
}
_loop159:;
_loop160:;
} // ( ... )*
expr_AST = currentAST.root;
returnAST = expr_AST;
@@ -2805,11 +2805,11 @@ void Sqlite3Parser::foreignkeyclause() {
}
}
else {
goto _loop141;
goto _loop142;
}
}
_loop141:;
_loop142:;
} // ( ... )*
ANTLR_USE_NAMESPACE(antlr)RefAST tmp166_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
@@ -2992,17 +2992,17 @@ void Sqlite3Parser::foreignkeyclause() {
}
default:
{
goto _loop146;
goto _loop147;
}
}
}
_loop146:;
_loop147:;
} // ( ... )*
{
bool synPredMatched149 = false;
bool synPredMatched150 = false;
if (((LA(1) == NOT) && (LA(2) == DEFERRABLE))) {
int _m149 = mark();
synPredMatched149 = true;
int _m150 = mark();
synPredMatched150 = true;
inputState->guessing++;
try {
{
@@ -3011,12 +3011,12 @@ void Sqlite3Parser::foreignkeyclause() {
}
}
catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) {
synPredMatched149 = false;
synPredMatched150 = false;
}
rewind(_m149);
rewind(_m150);
inputState->guessing--;
}
if ( synPredMatched149 ) {
if ( synPredMatched150 ) {
ANTLR_USE_NAMESPACE(antlr)RefAST tmp179_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
tmp179_AST = astFactory->create(LT(1));
@@ -3513,11 +3513,11 @@ void Sqlite3Parser::subexpr() {
}
}
else {
goto _loop167;
goto _loop168;
}
}
_loop167:;
_loop168:;
} // ( ... )*
break;
}
@@ -4001,7 +4001,7 @@ void Sqlite3Parser::caseexpr() {
}
{ // ( ... )+
int _cnt175=0;
int _cnt176=0;
for (;;) {
if ((LA(1) == WHEN)) {
ANTLR_USE_NAMESPACE(antlr)RefAST tmp227_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
@@ -4026,12 +4026,12 @@ void Sqlite3Parser::caseexpr() {
}
}
else {
if ( _cnt175>=1 ) { goto _loop175; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
if ( _cnt176>=1 ) { goto _loop176; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
}
_cnt175++;
_cnt176++;
}
_loop175:;
_loop176:;
} // ( ... )+
{
switch ( LA(1)) {
@@ -4297,11 +4297,11 @@ void Sqlite3Parser::suffixexpr() {
}
}
else {
goto _loop186;
goto _loop187;
}
}
_loop186:;
_loop187:;
} // ( ... )*
ANTLR_USE_NAMESPACE(antlr)RefAST tmp244_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
if ( inputState->guessing == 0 ) {
@@ -4424,11 +4424,11 @@ void Sqlite3Parser::suffixexpr() {
}
}
else {
goto _loop190;
goto _loop191;
}
}
_loop190:;
_loop191:;
} // ( ... )*
break;
}
@@ -4589,7 +4589,7 @@ void Sqlite3Parser::between_subexpr() {
astFactory->addASTChild( currentAST, returnAST );
}
{ // ( ... )+
int _cnt180=0;
int _cnt181=0;
for (;;) {
if ((LA(1) == AND)) {
ANTLR_USE_NAMESPACE(antlr)RefAST tmp254_AST = ANTLR_USE_NAMESPACE(antlr)nullAST;
@@ -4604,12 +4604,12 @@ void Sqlite3Parser::between_subexpr() {
}
}
else {
if ( _cnt180>=1 ) { goto _loop180; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
if ( _cnt181>=1 ) { goto _loop181; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename());}
}
_cnt180++;
_cnt181++;
}
_loop180:;
_loop181:;
} // ( ... )+
between_subexpr_AST = currentAST.root;
returnAST = between_subexpr_AST;

View File

@@ -100,7 +100,7 @@ ID
;
QUOTEDID
: '`' ( ~('`') )* '`'
: '`' ( ~('`') | ('`' '`') )* '`'
| '[' ( ~(']') )* ']'
;