-
Notifications
You must be signed in to change notification settings - Fork 0
/
transform.y
90 lines (82 loc) · 1.86 KB
/
transform.y
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
%{
#include "transform.h"
#include <stdio.h>
%}
%expect 8
%union {
struct ast_node *ast;
int d;
char *s;
}
%token <d> NUMBER
%token SCRANGE COLLECT MAP VAL IF ELSE
%token <s> IDENTIFIER
%token STRING CHAR ARROW EQ NE GE LE
%type <ast> Program MapOps UDF Expression SimpleExpr TupleExpr ComplexExpr AssignExprs AssignExpr PureExpr CompExpr Op Comp
%start Program
%%
Program:
SCRANGE '(' NUMBER ',' NUMBER ')' MapOps COLLECT {
ast_node *root = program($3, $5, $7);
// walk(root, 0);
trans(root);
printf("\n");
free_ast_tree(root);
}
;
MapOps:
/* empty */ { $$ = NULL; }
| MapOps MAP '(' UDF ')' { $$ = ast('M', $1, $4); }
;
UDF:
IDENTIFIER ARROW Expression { $$ = udf($1, $3); }
;
Expression:
'{' ComplexExpr '}' { $$ = $2; }
| SimpleExpr { $$ = $1; }
;
SimpleExpr:
PureExpr { $$ = $1; }
| '(' TupleExpr ')' { $$ = $2; }
;
TupleExpr:
PureExpr ',' PureExpr { $$ = ast('T', $1, $3); }
| TupleExpr ',' PureExpr { $$ = ast('T', $1, $3); }
;
ComplexExpr:
SimpleExpr { $$ = $1; }
| AssignExprs ';' SimpleExpr { $$ = ast('S', $1, $3); }
;
AssignExprs:
AssignExpr { $$ = $1; }
| AssignExprs ';' AssignExpr { $$ = ast('S', $1, $3); }
;
AssignExpr:
VAL IDENTIFIER '=' PureExpr { $$ = assignment($2, $4); }
;
PureExpr:
NUMBER { $$ = num($1); }
| IDENTIFIER { $$ = id($1); }
| IDENTIFIER '.' IDENTIFIER { $$ = dotID($1, $3); }
| '(' PureExpr ')' { $$ = $2; }
| PureExpr Op PureExpr { $$ = operation($1, $2, $3); }
| IF '(' CompExpr ')' PureExpr ELSE PureExpr { $$ = ifstmt($3, $5, $7); }
;
CompExpr:
PureExpr Comp PureExpr { $$ = comparison($1, $2, $3); }
;
Op:
'+' { $$ = op('+'); }
| '-' { $$ = op('-'); }
| '*' { $$ = op('*'); }
| '%' { $$ = op('%'); }
;
Comp:
EQ { $$ = comparator(eq); }
| '<' { $$ = comparator(lt); }
| '>' { $$ = comparator(gt); }
| NE { $$ = comparator(ne); }
| GE { $$ = comparator(ge); }
| LE { $$ = comparator(le); }
;
%%