-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpandaQ.g4
116 lines (74 loc) · 2.46 KB
/
pandaQ.g4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
grammar pandaQ;
root : query ';' # querySola
| var ':=' query ';' # assig
| plot ';' # plotInstr
;
query : SELECT '*' FROM taula innerJoin* whereInstr? orderBy? # selectAll
| SELECT campos FROM taula innerJoin* whereInstr? orderBy? # selectCampos
;
campos : campo (',' campo)*
;
campo : columna # campoNoCalculado
| expr ALIAS ID # campoCalculado
;
expr : '(' expr ')' # parentesis
| expr '*' expr # multiplicacio
| expr '/' expr # divisio
| expr '+' expr # suma
| expr '-' expr # resta
| numero # num
| columna # columnaSola
;
orderBy : ORDER_BY columna orden? (',' columna orden?)*
;
orden : ASC | DESC ;
whereInstr : WHERE cond # whereSimple
| WHERE columna IN '(' subquery ')' # whereSubquery
;
cond : '(' cond ')' # parentesisCond
| NOT cond # notCond
| cond AND cond # andCond
| condSimple # soloCond
;
condSimple : columna '=' valor # igualCond
| columna '<' valor # menorCond
;
valor : numero # valorNum
| string # valorString
| columna # valorCol
;
innerJoin : INNER_JOIN taula ON condJoin
;
condJoin : columna '=' columna
;
subquery : query
;
plot : PLOT var # plotNormal
| SCATTER var # plotScatter
| AREA var # plotArea
| BAR var # plotBar
;
var : ID ;
taula : ID ;
columna : ID ;
numero : NUM ;
string : ID ;
SELECT : ('select'|'SELECT') ;
FROM : ('from'|'FROM') ;
ALIAS : ('as'|'AS') ;
ORDER_BY : ('order by'|'ORDER BY') ;
ASC : ('asc'|'ASC') ;
DESC : ('desc'|'DESC') ;
WHERE : ('where'|'WHERE') ;
NOT : ('not'|'NOT') ;
AND : ('and'|'AND') ;
INNER_JOIN : ('inner join'|'INNER JOIN') ;
ON : ('on'|'ON') ;
PLOT : ('plot'|'PLOT') ;
IN : ('in'|'IN') ;
SCATTER : ('scatter'|'SCATTER') ;
AREA : ('area'|'AREA') ;
BAR : ('bar'|'BAR') ;
ID : [a-zA-Z_]+ ;
NUM : [0-9]+ ('.' [0-9]+)? ; // int o float
WS : [ \t\n\r]+ -> skip ;