-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.mly
75 lines (67 loc) · 2.17 KB
/
parser.mly
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
/*
PARSER
- For making sense of info passed by lexer using a defined grammar
- Based on a basic CFG
- Returns the formula by parsing
*/
%{
open Backend;;
%}
/* DEFINING TOKENS. To be used in lexer */
/* floating constants */
%token <float> FLOAT
/* index */
%token <int * int> INDICE
/* range */
%token <Backend.index * Backend.index> RANGE
/* other tokens */
%token LP RP LB RB COMMA COLON COUNT ROWCOUNT COLCOUNT SUM ROWSUM COLSUM AVG ROWAVG COLAVG MIN ROWMIN COLMIN MAX ROWMAX COLMAX ADD SUBT MULT DIV EQ DELIMITER EOF
/* STARTING GRAMMAR */
/* Defining the start symbol for the grammar */
%start main
/* Referring to the return type as 'Backend.formula' */
%type <Backend.formula> main
%%
main:
/* Main */
formulas DELIMITER EOF {$1}
;
formulas:
/* I := FUNC R ; */
INDICE EQ unary RANGE {UNARY(INDICE((fst $1),(snd $1)), $3, RANGE((fst $4),(snd $4)))}
/* I := FUNC R R ; */
| INDICE EQ binary RANGE RANGE {BINARY1(INDICE((fst $1),(snd $1)), $3, RANGE((fst $4),(snd $4)), RANGE((fst $5),(snd $5)))}
/* I := FUNC C R ; */
| INDICE EQ binary FLOAT RANGE {BINARY2(INDICE((fst $1),(snd $1)), $3, $4, RANGE((fst $5),(snd $5)))}
/* I := FUNC R C ; */
| INDICE EQ binary RANGE FLOAT {BINARY2(INDICE((fst $1),(snd $1)), $3, $5, RANGE((fst $4),(snd $4)))}
/* I := FUNC I R ; */
| INDICE EQ binary INDICE RANGE {BINARY3(INDICE((fst $1),(snd $1)), $3, INDICE((fst $4),(snd $4)), RANGE((fst $5),(snd $5)))}
/* I := FUNC R I ; */
| INDICE EQ binary RANGE INDICE {BINARY3(INDICE((fst $1),(snd $1)), $3, INDICE((fst $5),(snd $5)), RANGE((fst $4),(snd $4)))}
;
unary:
/* Unary Operators */
COUNT {COUNT}
| ROWCOUNT {ROWCOUNT}
| COLCOUNT {COLCOUNT}
| SUM {SUM}
| ROWSUM {ROWSUM}
| COLSUM {COLSUM}
| AVG {AVG}
| ROWAVG {ROWAVG}
| COLAVG {COLAVG}
| MIN {MIN}
| ROWMIN {ROWMIN}
| COLMIN {COLMIN}
| MAX {MAX}
| ROWMAX {ROWMAX}
| COLMAX {COLMAX}
;
binary:
/* Binary Operators */
ADD {ADD}
| SUBT {SUBT}
| MULT {MULT}
| DIV {DIV}
;