0
私はANTLRには比較的新しいので、文法をJavaプログラムに統合しようとしていました。これは私の.g4ファイルです。ネストされた解析木にアクセスするJava Antlr
/*
* The MIT License (MIT)
*
* Copyright (c) 2014 by Bart Kiers
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*
* Project : sqlite-parser; an ANTLR4 grammar for SQLite
* https://github.com/bkiers/sqlite-parser
* Developed by : Bart Kiers, [email protected]
*/
grammar SQLite;
parse
: (sql_stmt_list | error)* EOF
;
error
: UNEXPECTED_CHAR
{
throw new RuntimeException("UNEXPECTED_CHAR=" + $UNEXPECTED_CHAR.text);
}
;
sql_stmt_list
: ';'* sql_stmt (';'+ sql_stmt)* ';'*
;
sql_stmt
: (K_EXPLAIN (K_QUERY K_PLAN)?)? (alter_table_stmt
| analyze_stmt
| attach_stmt
| begin_stmt
| commit_stmt
| compound_select_stmt
| create_index_stmt
| create_table_stmt
| create_trigger_stmt
| create_view_stmt
| create_virtual_table_stmt
| delete_stmt
| delete_stmt_limited
| detach_stmt
| drop_index_stmt
| drop_table_stmt
| drop_trigger_stmt
| drop_view_stmt
| factored_select_stmt
| insert_stmt
| pragma_stmt
| reindex_stmt
| release_stmt
| rollback_stmt
| savepoint_stmt
| simple_select_stmt
| select_stmt
| update_stmt
| update_stmt_limited
| vacuum_stmt)
;
alter_table_stmt
: K_ALTER K_TABLE (database_name '.')? table_name
(K_RENAME K_TO new_table_name
| K_ADD K_COLUMN? column_def
)
;
analyze_stmt
: K_ANALYZE (database_name | table_or_index_name | database_name '.' table_or_index_name)?
;
attach_stmt
: K_ATTACH K_DATABASE? expr K_AS database_name
;
begin_stmt
: K_BEGIN (K_DEFERRED | K_IMMEDIATE | K_EXCLUSIVE)? (K_TRANSACTION transaction_name?)?
;
commit_stmt
: (K_COMMIT | K_END) (K_TRANSACTION transaction_name?)?
;
compound_select_stmt
: with_clause?
select_core ((K_UNION K_ALL? | K_INTERSECT | K_EXCEPT) select_core)+
(K_ORDER K_BY ordering_term (',' ordering_term)*)?
(K_LIMIT expr ((K_OFFSET | ',') expr)?)?
;
create_index_stmt
: K_CREATE K_UNIQUE? K_INDEX (K_IF K_NOT K_EXISTS)?
(database_name '.')? index_name K_ON table_name '(' indexed_column (',' indexed_column)* ')'
(K_WHERE expr)?
;
create_table_stmt
: K_CREATE (K_TEMP | K_TEMPORARY)? K_TABLE (K_IF K_NOT K_EXISTS)?
(database_name '.')? table_name
('(' column_def (',' column_def)*? (',' table_constraint)* ')' (K_WITHOUT IDENTIFIER)?
| K_AS select_stmt
)
;
create_trigger_stmt
: K_CREATE (K_TEMP | K_TEMPORARY)? K_TRIGGER (K_IF K_NOT K_EXISTS)?
(database_name '.')? trigger_name (K_BEFORE | K_AFTER | K_INSTEAD K_OF)?
(K_DELETE | K_INSERT | K_UPDATE (K_OF column_name (',' column_name)*)?) K_ON (database_name '.')? table_name
(K_FOR K_EACH K_ROW)? (K_WHEN expr)?
K_BEGIN ((update_stmt | insert_stmt | delete_stmt | select_stmt) ';')+ K_END
;
create_view_stmt
: K_CREATE (K_TEMP | K_TEMPORARY)? K_VIEW (K_IF K_NOT K_EXISTS)?
(database_name '.')? view_name K_AS select_stmt
;
create_virtual_table_stmt
: K_CREATE K_VIRTUAL K_TABLE (K_IF K_NOT K_EXISTS)?
(database_name '.')? table_name
K_USING module_name ('(' module_argument (',' module_argument)* ')')?
;
delete_stmt
: with_clause? K_DELETE K_FROM qualified_table_name
(K_WHERE expr)?
;
delete_stmt_limited
: with_clause? K_DELETE K_FROM qualified_table_name
(K_WHERE expr)?
((K_ORDER K_BY ordering_term (',' ordering_term)*)?
K_LIMIT expr ((K_OFFSET | ',') expr)?
)?
;
detach_stmt
: K_DETACH K_DATABASE? database_name
;
drop_index_stmt
: K_DROP K_INDEX (K_IF K_EXISTS)? (database_name '.')? index_name
;
drop_table_stmt
: K_DROP K_TABLE (K_IF K_EXISTS)? (database_name '.')? table_name
;
drop_trigger_stmt
: K_DROP K_TRIGGER (K_IF K_EXISTS)? (database_name '.')? trigger_name
;
drop_view_stmt
: K_DROP K_VIEW (K_IF K_EXISTS)? (database_name '.')? view_name
;
factored_select_stmt
: with_clause?
select_core (compound_operator select_core)*
(K_ORDER K_BY ordering_term (',' ordering_term)*)?
(K_LIMIT expr ((K_OFFSET | ',') expr)?)?
;
insert_stmt
: with_clause? (K_INSERT
| K_REPLACE
| K_INSERT K_OR K_REPLACE
| K_INSERT K_OR K_ROLLBACK
| K_INSERT K_OR K_ABORT
| K_INSERT K_OR K_FAIL
| K_INSERT K_OR K_IGNORE) K_INTO
(database_name '.')? table_name ('(' column_name (',' column_name)* ')')?
(K_VALUES '(' expr (',' expr)* ')' (',' '(' expr (',' expr)* ')')*
| select_stmt
| K_DEFAULT K_VALUES
)
;
pragma_stmt
: K_PRAGMA (database_name '.')? pragma_name ('=' pragma_value
| '(' pragma_value ')')?
;
reindex_stmt
: K_REINDEX (collation_name
| (database_name '.')? (table_name | index_name)
)?
;
release_stmt
: K_RELEASE K_SAVEPOINT? savepoint_name
;
rollback_stmt
: K_ROLLBACK (K_TRANSACTION transaction_name?)? (K_TO K_SAVEPOINT? savepoint_name)?
;
savepoint_stmt
: K_SAVEPOINT savepoint_name
;
simple_select_stmt
: with_clause?
select_core (K_ORDER K_BY ordering_term (',' ordering_term)*)?
(K_LIMIT expr ((K_OFFSET | ',') expr)?)?
;
select_stmt
: with_clause?
select_or_values (compound_operator select_or_values)*
(K_ORDER K_BY ordering_term (',' ordering_term)*)?
(K_LIMIT limit | (expr ((K_OFFSET | ',') expr)?))?
(K_SKIP skip)?
;//Skip and Contains will come here added
select_or_values
: K_SELECT (K_DISTINCT | K_ALL)? result_column (',' result_column)* (',' K_OVER'(' K_PARTITION K_BY (K_WITHIN K_DISTANCE)? '('partition_term')' ',' K_COLLECTIVE'(' (K_SKIP skip (K_LIMIT limit)?')' (K_HAVING expr K_ORDER K_BY ordering_term (',' ordering_term)*)?)?')')?
(K_FROM (table_or_subquery (',' table_or_subquery)* | join_clause))?
(K_WHERE expr)?
(K_COLLECTIVE '(' K_ORDER K_BY ordering_term ((K_LIMIT limit K_SKIP skip)?|(K_SKIP skip K_LIMIT limit)?) ')')?
(K_GROUP K_BY expr ((',')? K_COLLECTIVE '(' K_ORDER K_BY ordering_term(',' ordering_term)* ((K_LIMIT limit K_SKIP skip)?| (K_SKIP skip K_LIMIT limit)?)')')? (',' expr)* (K_HAVING expr)?)?
| K_VALUES '(' expr (',' expr)* ')' (',' '(' expr (',' expr)* ')')*
;
//Partition by added here
partition_term
: any_name '.' any_name ',' any_name
;
//Partition by and within distance term
update_stmt
: with_clause? K_UPDATE (K_OR K_ROLLBACK
| K_OR K_ABORT
| K_OR K_REPLACE
| K_OR K_FAIL
| K_OR K_IGNORE)? qualified_table_name
K_SET column_name '=' expr (',' column_name '=' expr)* (K_WHERE expr)?
;
update_stmt_limited
: with_clause? K_UPDATE (K_OR K_ROLLBACK
| K_OR K_ABORT
| K_OR K_REPLACE
| K_OR K_FAIL
| K_OR K_IGNORE)? qualified_table_name
K_SET column_name '=' expr (',' column_name '=' expr)* (K_WHERE expr)?
((K_ORDER K_BY ordering_term (',' ordering_term)*)?
K_LIMIT expr ((K_OFFSET | ',') expr)?
)?
;
vacuum_stmt
: K_VACUUM
;
column_def
: column_name type_name? column_constraint*
;
type_name
: name+? ('(' signed_number ')'
| '(' signed_number ',' signed_number ')')?
;
column_constraint
: (K_CONSTRAINT name)?
(K_PRIMARY K_KEY (K_ASC | K_DESC)? conflict_clause K_AUTOINCREMENT?
| K_NOT? K_NULL conflict_clause
| K_UNIQUE conflict_clause
| K_CHECK '(' expr ')'
| K_DEFAULT (signed_number | literal_value | '(' expr ')')
| K_COLLATE collation_name
| foreign_key_clause
)
;
conflict_clause
: (K_ON K_CONFLICT (K_ROLLBACK
| K_ABORT
| K_FAIL
| K_IGNORE
| K_REPLACE
)
)?
;
//added limit here
limit
:(K_CONTAINS (contain)?)?
//(K_CONTAINS ('(' K_COLLECT '('(file_read)')' ',' '"'any_name'"' ')')?)?
//(K_CONTAINS (contain)?)?
;
contain
: '(' K_COLLECT '('(file_read)')' ',' (any_name)? (file_read)?')'((file_read)? | (any_name)?)
//'(' K_COLLECT '('(file_read)')' ',' (any_name)? ')'')'
;
skip
: (K_CONTAINS (contain)?)?
//(K_CONTAINS ('(' K_COLLECT '('(file_read)')' ',' ('"'(any_name)'"')? (file_read)?)?)?')'
;
/*
SQLite understands the following binary operators, in order from highest to
lowest precedence:
||
* / %
+ -
<< >> & |
< <= > >=
= == != <> IS IS NOT IN LIKE GLOB MATCH REGEXP
AND
OR
*/
//added
file_name
: any_name '.' any_name
;
read_name
: '"' any_name (',' any_name)* '"'
;
//initial adition of Overlap
expr
: literal_value
| BIND_PARAMETER
| file_read
| read_name
| function_name '(' (K_DISTINCT? expr (',' expr)* | '*')? ')'
| ((database_name '.')? table_name '.')? column_name
| unary_operator expr
| expr '||' expr
| expr ('*' | '/' | '%') expr
| expr ('+' | '-') expr
| expr ('<<' | '>>' | '&' | '|') expr
| expr ('<' | '<=' | '>' | '>=') expr
| expr ('=' | '==' | '!=' | '<>') expr
| expr K_AND expr
| expr K_OR expr
| '(' expr ')'
| K_CAST '(' expr K_AS type_name ')'
| expr K_COLLATE collation_name
| expr K_NOT? (K_LIKE | K_GLOB | K_REGEXP | K_MATCH) expr (K_ESCAPE expr)?
| expr (K_ISNULL | K_NOTNULL | K_NOT K_NULL)
| expr K_IS K_NOT? expr
| expr K_NOT? K_BETWEEN expr K_AND expr
| expr K_NOT? K_IN ('(' (select_stmt
| expr (',' expr)*
)?
')'
| (database_name '.')? table_name)
| ((K_NOT)? K_EXISTS)? '(' select_stmt ')'
| K_CASE expr? (K_WHEN expr K_THEN expr)+ (K_ELSE expr)? K_END
| raise_function
;
foreign_key_clause
: K_REFERENCES foreign_table ('(' column_name (',' column_name)* ')')?
((K_ON (K_DELETE | K_UPDATE) (K_SET K_NULL
| K_SET K_DEFAULT
| K_CASCADE
| K_RESTRICT
| K_NO K_ACTION)
| K_MATCH name
)
)*
(K_NOT? K_DEFERRABLE (K_INITIALLY K_DEFERRED | K_INITIALLY K_IMMEDIATE)?)?
;
raise_function
: K_RAISE '(' (K_IGNORE
| (K_ROLLBACK | K_ABORT | K_FAIL) ',' error_message)
')'
;
indexed_column
: column_name (K_COLLATE collation_name)? (K_ASC | K_DESC)?
;
table_constraint
: (K_CONSTRAINT name)?
((K_PRIMARY K_KEY | K_UNIQUE) '(' indexed_column (',' indexed_column)* ')' conflict_clause
| K_CHECK '(' expr ')'
| K_FOREIGN K_KEY '(' column_name (',' column_name)* ')' foreign_key_clause
)
;
with_clause
: K_WITH K_RECURSIVE? common_table_expression (',' common_table_expression)*
;
qualified_table_name
: (database_name '.')? table_name (K_INDEXED K_BY index_name
| K_NOT K_INDEXED)?
;
ordering_term
: expr (K_COLLATE collation_name)? (K_ASC | K_DESC)?
| expr '+' expr
;
pragma_value
: signed_number
| name
| STRING_LITERAL
;
common_table_expression
: table_name ('(' column_name (',' column_name)* ')')? K_AS '(' select_stmt ')'
;
result_column
: '*'
| table_name '.' '*'
| expr (K_AS? column_alias)?
;
table_or_subquery
: (schema_name '.')? table_name (K_AS? table_alias)?
(K_INDEXED K_BY index_name
| K_NOT K_INDEXED)?
| (schema_name '.')? table_function_name '(' (expr (',' expr)*)? ')' (K_AS? table_alias)?
| '(' (table_or_subquery (',' table_or_subquery)*
| join_clause)
')'
| '(' select_stmt ')' (K_AS? table_alias)?
;
join_clause
: table_or_subquery (join_operator table_or_subquery join_constraint)*
;
join_operator
: ','
| K_NATURAL? (K_LEFT K_OUTER? | K_INNER | K_CROSS)? K_JOIN
;
join_constraint
: (K_ON expr
| K_USING '(' column_name (',' column_name)* ')')?
;
select_core
: K_SELECT (K_DISTINCT | K_ALL)? result_column (',' result_column)*
(K_FROM (table_or_subquery (',' table_or_subquery)* | join_clause))?
(K_WHERE expr)?
(K_GROUP K_BY expr (',' expr)* (K_HAVING expr)?)?
| K_VALUES '(' expr (',' expr)* ')' (',' '(' expr (',' expr)* ')')*
;
compound_operator
: K_UNION
| K_UNION K_ALL
| K_INTERSECT
| K_EXCEPT
;
signed_number
: ('+' | '-')? NUMERIC_LITERAL
;
literal_value
: NUMERIC_LITERAL
| STRING_LITERAL
| BLOB_LITERAL
| K_NULL
| K_CURRENT_TIME
| K_CURRENT_DATE
| K_CURRENT_TIMESTAMP
;
unary_operator
: '-'
| '+'
| '~'
| K_NOT
;
error_message
: STRING_LITERAL
;
module_argument // TODO check what exactly is permitted here
: expr
| column_def
;
column_alias
: IDENTIFIER
| STRING_LITERAL
;
keyword
: K_ABORT
| K_ACTION
| K_ADD
| K_AFTER
| K_ALL
| K_ALTER
| K_ANALYZE
| K_AND
| K_AS
| K_ASC
| K_ATTACH
| K_AUTOINCREMENT
| K_BEFORE
| K_BEGIN
| K_BETWEEN
| K_BY
| K_CASCADE
| K_CASE
| K_CAST
| K_CHECK
| K_COLLATE
| K_COLUMN
| K_COMMIT
| K_CONFLICT
| K_CONSTRAINT
| K_CREATE
| K_CROSS
| K_CURRENT_DATE
| K_CURRENT_TIME
| K_CURRENT_TIMESTAMP
| K_DATABASE
| K_DEFAULT
| K_DEFERRABLE
| K_DEFERRED
| K_DELETE
| K_DESC
| K_DETACH
| K_DISTINCT
| K_DROP
| K_EACH
| K_ELSE
| K_END
| K_ESCAPE
| K_EXCEPT
| K_EXCLUSIVE
| K_EXISTS
| K_EXPLAIN
| K_FAIL
| K_FOR
| K_FOREIGN
| K_FROM
| K_FULL
| K_GLOB
| K_GROUP
| K_HAVING
| K_IF
| K_IGNORE
| K_IMMEDIATE
| K_IN
| K_INDEX
| K_INDEXED
| K_INITIALLY
| K_INNER
| K_INSERT
| K_INSTEAD
| K_INTERSECT
| K_INTO
| K_IS
| K_ISNULL
| K_JOIN
| K_KEY
| K_LEFT
| K_LIKE
| K_LIMIT
| K_MATCH
| K_NATURAL
| K_NO
| K_NOT
| K_NOTNULL
| K_NULL
| K_OF
| K_OFFSET
| K_ON
| K_OR
| K_ORDER
| K_OUTER
| K_PLAN
| K_PRAGMA
| K_PRIMARY
| K_QUERY
| K_RAISE
| K_RECURSIVE
| K_REFERENCES
| K_REGEXP
| K_REINDEX
| K_RELEASE
| K_RENAME
| K_REPLACE
| K_RESTRICT
| K_RIGHT
| K_ROLLBACK
| K_ROW
| K_SAVEPOINT
| K_SELECT
| K_SET
| K_TABLE
| K_TEMP
| K_TEMPORARY
| K_THEN
| K_TO
| K_TRANSACTION
| K_TRIGGER
| K_UNION
| K_UNIQUE
| K_UPDATE
| K_USING
| K_VACUUM
| K_VALUES
| K_VIEW
| K_VIRTUAL
| K_WHEN
| K_WHERE
| K_WITH
| K_WITHOUT
| K_PARTITION
| K_SKIP
| K_OVER
| K_COLLECTIVE
| K_WITHIN
| K_DISTANCE
| K_CONTAINS
| K_COLLECT
| K_OVERLAP
;
// TODO check all names below
name
: any_name
;
function_name
: any_name
;
database_name
: any_name
;
schema_name
: any_name
;
table_function_name
: any_name
;
table_name
: any_name
;
table_or_index_name
: any_name
;
new_table_name
: any_name
;
column_name
: any_name
;
collation_name
: any_name
;
foreign_table
: any_name
;
index_name
: any_name
;
trigger_name
: any_name
;
view_name
: any_name
;
module_name
: any_name
;
pragma_name
: any_name
;
savepoint_name
: any_name
;
table_alias
: IDENTIFIER
| STRING_LITERAL
| '(' table_alias ')'
;
transaction_name
: any_name
;
file_read
: any_name '.' any_name
;
//added
inner_loop
: IDENTIFIER
| inner_loop ',' inner_loop
| any_name '.' any_name ',' any_name
;
any_name
: IDENTIFIER
| keyword
| STRING_LITERAL
| '(' any_name ')'
| any_name '.' any_name
| '"'any_name'"'
;
//added
file_splitter
: IDENTIFIER
| keyword
|STRING_LITERAL
| file_splitter ','
| ',' file_splitter ','
| ',' file_splitter
;
SCOL : ';';
DOT : '.';
OPEN_PAR : '(';
CLOSE_PAR : ')';
COMMA : ',';
ASSIGN : '=';
STAR : '*';
PLUS : '+';
MINUS : '-';
TILDE : '~';
PIPE2 : '||';
DIV : '/';
MOD : '%';
LT2 : '<<';
GT2 : '>>';
AMP : '&';
PIPE : '|';
LT : '<';
LT_EQ : '<=';
GT : '>';
GT_EQ : '>=';
EQ : '==';
NOT_EQ1 : '!=';
NOT_EQ2 : '<>';
// http://www.sqlite.org/lang_keywords.html
K_ABORT : A B O R T;
K_ACTION : A C T I O N;
K_ADD : A D D;
K_AFTER : A F T E R;
K_ALL : A L L;
K_ALTER : A L T E R;
K_ANALYZE : A N A L Y Z E;
K_AND : A N D;
K_AS : A S;
K_ASC : A S C;
K_ATTACH : A T T A C H;
K_AUTOINCREMENT : A U T O I N C R E M E N T;
K_BEFORE : B E F O R E;
K_BEGIN : B E G I N;
K_BETWEEN : B E T W E E N;
K_BY : B Y;
K_CASCADE : C A S C A D E;
K_CASE : C A S E;
K_CAST : C A S T;
K_CHECK : C H E C K;
K_COLLATE : C O L L A T E;
K_COLUMN : C O L U M N;
K_COMMIT : C O M M I T;
K_CONFLICT : C O N F L I C T;
K_CONSTRAINT : C O N S T R A I N T;
K_CREATE : C R E A T E;
K_CROSS : C R O S S;
K_CURRENT_DATE : C U R R E N T '_' D A T E;
K_CURRENT_TIME : C U R R E N T '_' T I M E;
K_CURRENT_TIMESTAMP : C U R R E N T '_' T I M E S T A M P;
K_DATABASE : D A T A B A S E;
K_DEFAULT : D E F A U L T;
K_DEFERRABLE : D E F E R R A B L E;
K_DEFERRED : D E F E R R E D;
K_DELETE : D E L E T E;
K_DESC : D E S C;
K_DETACH : D E T A C H;
K_DISTINCT : D I S T I N C T;
K_DROP : D R O P;
K_EACH : E A C H;
K_ELSE : E L S E;
K_END : E N D;
K_ESCAPE : E S C A P E;
K_EXCEPT : E X C E P T;
K_EXCLUSIVE : E X C L U S I V E;
K_EXISTS : E X I S T S;
K_EXPLAIN : E X P L A I N;
K_FAIL : F A I L;
K_FOR : F O R;
K_FOREIGN : F O R E I G N;
K_FROM : F R O M;
K_FULL : F U L L;
K_GLOB : G L O B;
K_GROUP : G R O U P;
K_HAVING : H A V I N G;
K_IF : I F;
K_IGNORE : I G N O R E;
K_IMMEDIATE : I M M E D I A T E;
K_IN : I N;
K_INDEX : I N D E X;
K_INDEXED : I N D E X E D;
K_INITIALLY : I N I T I A L L Y;
K_INNER : I N N E R;
K_INSERT : I N S E R T;
K_INSTEAD : I N S T E A D;
K_INTERSECT : I N T E R S E C T;
K_INTO : I N T O;
K_IS : I S;
K_ISNULL : I S N U L L;
K_JOIN : J O I N;
K_KEY : K E Y;
K_LEFT : L E F T;
K_LIKE : L I K E;
K_LIMIT : L I M I T;
K_MATCH : M A T C H;
K_NATURAL : N A T U R A L;
K_NO : N O;
K_NOT : N O T;
K_NOTNULL : N O T N U L L;
K_NULL : N U L L;
K_OF : O F;
K_OFFSET : O F F S E T;
K_ON : O N;
K_OR : O R;
K_ORDER : O R D E R;
K_OUTER : O U T E R;
K_PLAN : P L A N;
K_PRAGMA : P R A G M A;
K_PRIMARY : P R I M A R Y;
K_QUERY : Q U E R Y;
K_RAISE : R A I S E;
K_RECURSIVE : R E C U R S I V E;
K_REFERENCES : R E F E R E N C E S;
K_REGEXP : R E G E X P;
K_REINDEX : R E I N D E X;
K_RELEASE : R E L E A S E;
K_RENAME : R E N A M E;
K_REPLACE : R E P L A C E;
K_RESTRICT : R E S T R I C T;
K_RIGHT : R I G H T;
K_ROLLBACK : R O L L B A C K;
K_ROW : R O W;
K_SAVEPOINT : S A V E P O I N T;
K_SELECT : S E L E C T;
K_SET : S E T;
K_TABLE : T A B L E;
K_TEMP : T E M P;
K_TEMPORARY : T E M P O R A R Y;
K_THEN : T H E N;
K_TO : T O;
K_TRANSACTION : T R A N S A C T I O N;
K_TRIGGER : T R I G G E R;
K_UNION : U N I O N;
K_UNIQUE : U N I Q U E;
K_UPDATE : U P D A T E;
K_USING : U S I N G;
K_VACUUM : V A C U U M;
K_VALUES : V A L U E S;
K_VIEW : V I E W;
K_VIRTUAL : V I R T U A L;
K_WHEN : W H E N;
K_WHERE : W H E R E;
K_WITH : W I T H;
K_WITHOUT : W I T H O U T; //My additions
K_PARTITION : P A R T I T I O N;
K_SKIP : S K I P;
K_OVER : O V E R;
K_COLLECTIVE : C O L L E C T I V E;
K_WITHIN : W I T H I N;
K_DISTANCE : D I S T A N C E;
K_CONTAINS : C O N T A I N S;
K_COLLECT : C O L L E C T;
K_OVERLAP : O V E R L A P;
//added
IDENTIFIER
: '"' (~'"' | '""')* '"'
| '`' (~'`' | '``')* '`'
| '[' ~']'* ']'
| [a-zA-Z_] [a-zA-Z_0-9]* // TODO check: needs more chars in set
| [a-zA-Z_0-9]* //added
;
NUMERIC_LITERAL
: DIGIT+ ('.' DIGIT*)? (E [-+]? DIGIT+)?
| '.' DIGIT+ (E [-+]? DIGIT+)?
;
BIND_PARAMETER
: '?' DIGIT*
| [:@$] IDENTIFIER
;
STRING_LITERAL
: '\'' (~'\'' | '\'\'')* '\''
;
BLOB_LITERAL
: X STRING_LITERAL
;
SINGLE_LINE_COMMENT
: '--' ~[\r\n]* -> channel(HIDDEN)
;
MULTILINE_COMMENT
: '/*' .*? ('*/' | EOF) -> channel(HIDDEN)
;
SPACES
: [ \u000B\t\r\n] -> channel(HIDDEN)
;
UNEXPECTED_CHAR
: .
;
fragment DIGIT : [0-9];
fragment A : [aA];
fragment B : [bB];
fragment C : [cC];
fragment D : [dD];
fragment E : [eE];
fragment F : [fF];
fragment G : [gG];
fragment H : [hH];
fragment I : [iI];
fragment J : [jJ];
fragment K : [kK];
fragment L : [lL];
fragment M : [mM];
fragment N : [nN];
fragment O : [oO];
fragment P : [pP];
fragment Q : [qQ];
fragment R : [rR];
fragment S : [sS];
fragment T : [tT];
fragment U : [uU];
fragment V : [vV];
fragment W : [wW];
fragment X : [xX];
fragment Y : [yY];
fragment Z : [zZ];
これは私だけ出力さパースツリーの最初のレベルにアクセスする必要がプログラムです: -
//package nl.bigo.sqliteparser;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.misc.NotNull;
import org.antlr.v4.runtime.tree.ParseTree;
import org.antlr.v4.runtime.tree.ParseTreeWalker;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
// The list that will hold our function names.
final List<String> functionNames = new ArrayList<String>();
// The select-statement to be parsed.
String sql = "SELECT log AS x FROM t1 \n" +
"GROUP BY x\n" +
"HAVING count(*) >= 4 \n" +
"ORDER BY max(n) + 0 \n";
// Create a lexer and parser for the input.
SQLiteLexer lexer = new SQLiteLexer(new ANTLRInputStream(sql));
SQLiteParser parser = new SQLiteParser(new CommonTokenStream(lexer));
// Invoke the `select_stmt` production.
ParseTree tree = parser.select_stmt(); //selects the parse tree
// Walk the `select_stmt` production and listen when the parser
// enters the `expr` production.
ParseTreeWalker.DEFAULT.walk(new SQLiteBaseListener(){
@Override
public void enterExpr(@NotNull SQLiteParser.ExprContext ctx) {
// Check if the expression is a function call.
if (ctx.function_name() != null) {
// Yes, it was a function call: add the name of the function
// to out list.
functionNames.add(ctx.function_name().getText());
}
}
}, tree);
ParseTreeWalker.DEFAULT.walk(new SQLiteBaseListener() {
//@Override
public void enterExpr(@NotNull SQLiteParser.Ordering_termContext ctx){
if(ctx.expr() !=null)
{
//what to add here?
}
}
}, tree);
}
}
私はパースツリートラバーサルをどのように行うのですか?私はexprルールの中の入れ子構造にアクセスしようとしていました。たとえば、exprが内部に別のexprを持っていた場合、javaでのアクセスはどのようになりますか? 私が持っていたAnotherQuestionは、ordered_termネストされたツリーの3番目のレベルにアクセスしなければならない場合、それはまだ可能でしょうか?もしそうなら、どのように?