📄 tinysql.cup
字号:
// JavaCup specification for SQL Grammar
import java_cup.runtime.*;
import java.util.*;
import java.lang.*;
import java.io.*;
action code {:
Vector actions = new Vector();
Hashtable Statement = new Hashtable();
Vector value_list = new Vector();
Vector foo = new Vector();
Vector column_list = new Vector();
Vector search_list = new Vector();
public void addAction (Vector v, String type) {
Hashtable h = ( (Hashtable) Statement.clone() );
h.put("TYPE", type);
v.addElement(h);
Statement.clear();
value_list.removeAllElements();
foo.removeAllElements();
column_list.removeAllElements();
search_list.removeAllElements();
}
public Vector getActions() {
return actions;
}
:};
parser code {:
InputStream parserInputStream;
public parser(InputStream is) {
this();
parserInputStream = is;
}
:};
init with {: scanner.init(parserInputStream); :};
scan with {: return scanner.next_token(); :};
terminal token INSERT, VALUES, COMMA, PERIOD, LPAREN,
RPAREN, INTO, SELECT, FROM, SEMI, CHARACTER,
NUMERIC, CREATE, TABLE, INTEGER, DROP, WHERE,
AND, SET, UPDATE, DELETE, ASTERISK;
terminal str_token NAME, INT_NUM, STRING, COMPARISON;
/* */
non terminal int_token insert_statement, select_statement,
sql_statement, sql_batch, create_table_statement,
drop_table_statement, where_clause,
search_expr, search_condition, set_expr,
update_statement, set_clause;
non terminal str_token column_commalist, column, values_clause,
value, value_commalist, table, table_commalist,
column_def, column_def_commalist, delete_statement;
/* Grammar */
sql_batch ::= sql_statement
|
sql_batch SEMI sql_statement
;
sql_statement ::= select_statement
|
insert_statement
|
create_table_statement
|
drop_table_statement
|
update_statement
|
delete_statement
;
delete_statement ::= DELETE FROM table:s1
{: Statement.clear();
Statement.put("TABLE", s1.str_val);
:}
where_clause
{:
Statement.put("WHERE", (Vector) search_list.clone());
addAction(actions, "DELETE");
:}
;
update_statement ::= UPDATE table:s1
{: Statement.clear();
Statement.put("TABLE", s1.str_val);
:}
set_clause
{: Statement.put("COLUMNS", (Vector) foo.clone());
Statement.put("VALUES", (Vector) value_list.clone());
:}
where_clause
{:
Statement.put("WHERE", (Vector) search_list.clone());
addAction(actions, "UPDATE");
:}
;
select_statement ::= SELECT column_commalist
{: Statement.clear();
Statement.put("COLUMNS", (Vector) foo.clone()); :}
FROM table_commalist
{:
Statement.put("TABLES", (Vector) foo.clone()); :}
where_clause
{:
Statement.put("WHERE", (Vector) search_list.clone());
addAction(actions, "SELECT");
:}
;
insert_statement ::= INSERT INTO table:s1
{: Statement.clear();
Statement.put("TABLE", s1.str_val); :}
LPAREN column_commalist RPAREN
{: Statement.put("COLUMNS", (Vector) foo.clone()); :}
values_clause
{: Statement.put("VALUES", (Vector) value_list.clone());
addAction(actions, "INSERT");
:}
;
drop_table_statement
::= DROP TABLE table:s1
{: Statement.clear();
Statement.put("TABLE", s1.str_val);
addAction(actions, "DROP_TABLE");
:}
;
create_table_statement
::= CREATE TABLE table:s1
{: Statement.clear();
Statement.put("TABLE", s1.str_val); :}
LPAREN column_def_commalist RPAREN
{:
Statement.put("COLUMN_DEF",
(Vector) column_list.clone());
addAction(actions, "CREATE");
:}
;
values_clause ::= VALUES LPAREN value_commalist RPAREN
;
value ::= INT_NUM:s1
{: RESULT.str_val = s1.str_val; :}
|
STRING:s1
{: RESULT.str_val = s1.str_val; :}
;
value_commalist ::= value:s1
{: value_list.removeAllElements();
value_list.addElement(new String(s1.str_val));
RESULT.str_val = s1.str_val;
:}
|
value_commalist:s1 COMMA value:s2
{: value_list.addElement(new String(s2.str_val));
RESULT.str_val = s1.str_val;
:}
;
column_commalist ::= column:s1
{: foo.removeAllElements();
foo.addElement(new String(s1.str_val));
RESULT.str_val = s1.str_val;
:}
|
column_commalist:s1 COMMA column:s2
{: foo.addElement(new String(s2.str_val));
RESULT.str_val = s1.str_val;
:}
;
table_commalist ::= table:s1
{: foo.removeAllElements();
foo.addElement(new String(s1.str_val));
RESULT.str_val = s1.str_val;
:}
|
table_commalist:s1 COMMA table:s2
{: foo.addElement(new String(s2.str_val));
RESULT.str_val = s1.str_val;
:}
;
column ::= ASTERISK
{: RESULT.str_val = "*"; :}
|
NAME:s1
{: RESULT.str_val = s1.str_val; :}
|
table:s1 PERIOD column:s2
{: RESULT.str_val = s1.str_val + "." + s2.str_val; :}
;
table ::= NAME:s1
{: RESULT.str_val = s1.str_val; :}
;
column_def_commalist
::= column_def
|
column_def_commalist COMMA column_def
;
column_def ::= column:s1 CHARACTER LPAREN INT_NUM:s2 RPAREN
{:
String column_def[] = new String[3];
column_def[0] = "CHAR";
column_def[1] = s1.str_val;
column_def[2] = s2.str_val;
column_list.addElement( column_def );
:}
|
column:s1 NUMERIC LPAREN INT_NUM:s2 RPAREN
{:
String column_def[] = new String[3];
column_def[0] = "NUMERIC";
column_def[1] = s1.str_val;
column_def[2] = s2.str_val;
column_list.addElement( column_def );
:}
|
column:s1 INTEGER
{:
String column_def[] = new String[3];
column_def[0] = "NUMERIC";
column_def[1] = s1.str_val;
column_def[2] = "3";
column_list.addElement( column_def );
:}
;
where_clause ::=
/* EMPTY */
|
WHERE search_condition
;
search_condition ::= search_expr
|
search_condition AND search_expr
;
search_expr ::= column:s1 COMPARISON:s2 column:s3
{:
String search_expr_def[] = new String[4];
search_expr_def[0] = "JOIN";
search_expr_def[1] = s1.str_val;
search_expr_def[2] = s2.str_val;
search_expr_def[3] = s3.str_val;
search_list.addElement( search_expr_def );
:}
|
column:s1 COMPARISON:s2 STRING:s3
{:
String search_expr_def[] = new String[4];
search_expr_def[0] = "STRING_COMPARE";
search_expr_def[1] = s1.str_val;
search_expr_def[2] = s2.str_val;
search_expr_def[3] = s3.str_val;
search_list.addElement( search_expr_def );
:}
|
column:s1 COMPARISON:s2 INT_NUM:s3
{:
String search_expr_def[] = new String[4];
search_expr_def[0] = "INT_COMPARE";
search_expr_def[1] = s1.str_val;
search_expr_def[2] = s2.str_val;
search_expr_def[3] = s3.str_val;
search_list.addElement( search_expr_def );
:}
;
set_clause ::= SET set_expr
|
set_clause COMMA set_expr
;
set_expr ::= column:s1 COMPARISON value:s2
{:
foo.addElement(new String(s1.str_val));
value_list.addElement(new String(s2.str_val));
:}
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -