From 160bc87d3ce598ee4b779ddb697a4d89b5ac3d0e Mon Sep 17 00:00:00 2001 From: Martin Kleusberg Date: Mon, 17 Aug 2015 00:16:03 +0200 Subject: [PATCH] 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'). --- src/grammar/Sqlite3Lexer.cpp | 62 +++++++++++++----------- src/grammar/Sqlite3Parser.cpp | 88 +++++++++++++++++------------------ src/grammar/sqlite3.g | 2 +- 3 files changed, 79 insertions(+), 73 deletions(-) diff --git a/src/grammar/Sqlite3Lexer.cpp b/src/grammar/Sqlite3Lexer.cpp index 2ddc859e..a52cd126 100644 --- a/src/grammar/Sqlite3Lexer.cpp +++ b/src/grammar/Sqlite3Lexer.cpp @@ -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 ) { diff --git a/src/grammar/Sqlite3Parser.cpp b/src/grammar/Sqlite3Parser.cpp index f34ba7a4..7014b0a6 100644 --- a/src/grammar/Sqlite3Parser.cpp +++ b/src/grammar/Sqlite3Parser.cpp @@ -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; diff --git a/src/grammar/sqlite3.g b/src/grammar/sqlite3.g index 3fb26da5..43bb56d8 100644 --- a/src/grammar/sqlite3.g +++ b/src/grammar/sqlite3.g @@ -100,7 +100,7 @@ ID ; QUOTEDID - : '`' ( ~('`') )* '`' + : '`' ( ~('`') | ('`' '`') )* '`' | '[' ( ~(']') )* ']' ;