mirror of
https://github.com/sqlitebrowser/sqlitebrowser.git
synced 2026-01-20 02:50:46 -06:00
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:
@@ -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 ) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -100,7 +100,7 @@ ID
|
||||
;
|
||||
|
||||
QUOTEDID
|
||||
: '`' ( ~('`') )* '`'
|
||||
: '`' ( ~('`') | ('`' '`') )* '`'
|
||||
| '[' ( ~(']') )* ']'
|
||||
;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user