|
|
@@ -56,13 +56,13 @@ prog_t *prog_get(void)
|
|
56
|
56
|
prog->locals = &locals;
|
|
57
|
57
|
prog->globals = &globals;
|
|
58
|
58
|
|
|
59
|
|
- /* (@ ('{' reads ((pid))) (quantize arg2)) */
|
|
60
|
|
- prog->probe = "k:SyS_read"; /* { reads{pid()} @ quantize(arg2) } */
|
|
|
59
|
+ /* (@ ([ reads ((pid))) (quantize arg2)) */
|
|
|
60
|
+ prog->probe = "k:SyS_read"; /* { @reads[pid()] = quantize(arg2) } */
|
|
61
|
61
|
prog->ast =
|
|
62
|
62
|
node_list(
|
|
63
|
|
- node_vlist(node_ident("@"),
|
|
64
|
|
- node_vlist(node_ident("{"),
|
|
65
|
|
- node_ident("reads"),
|
|
|
63
|
+ node_vlist(node_keyword('='),
|
|
|
64
|
+ node_vlist(node_keyword('['),
|
|
|
65
|
+ node_ident("@reads"),
|
|
66
|
66
|
node_list(node_ident("pid")),
|
|
67
|
67
|
NULL),
|
|
68
|
68
|
node_vlist(node_ident("quantize"),
|
|
|
@@ -76,16 +76,8 @@ prog_t *prog_get(void)
|
|
76
|
76
|
return prog;
|
|
77
|
77
|
}
|
|
78
|
78
|
|
|
79
|
|
-int is_builtin(char *ident)
|
|
80
|
|
-{
|
|
81
|
|
- if (!strcmp("@", ident) ||
|
|
82
|
|
- !strcmp("{", ident))
|
|
83
|
|
- return 1;
|
|
84
|
|
-
|
|
85
|
|
- return 0;
|
|
86
|
|
-}
|
|
87
|
79
|
|
|
88
|
|
-int symbol_resolve(node_t *n, void *_prog)
|
|
|
80
|
+int pass_resolve_symbols(node_t *n, void *_prog)
|
|
89
|
81
|
{
|
|
90
|
82
|
prog_t *prog = _prog;
|
|
91
|
83
|
provider_t *global = provider_get(":");
|
|
|
@@ -96,12 +88,9 @@ int symbol_resolve(node_t *n, void *_prog)
|
|
96
|
88
|
return 0;
|
|
97
|
89
|
|
|
98
|
90
|
/* .IDENT/->IDENT is a struct/union member, skip */
|
|
99
|
|
- op = node_prev(node_prev(n));
|
|
100
|
|
- if (op && (op->ntype == N_IDENT) && !strcmp(".", op->ident))
|
|
101
|
|
- return 0;
|
|
102
|
|
-
|
|
103
|
|
- if (is_builtin(n->ident))
|
|
104
|
|
- return 0;
|
|
|
91
|
+ /* op = node_prev(node_prev(n)); */
|
|
|
92
|
+ /* if (op && (op->ntype == N_IDENT) && !strcmp(".", op->ident)) */
|
|
|
93
|
+ /* return 0; */
|
|
105
|
94
|
|
|
106
|
95
|
err = prog->provider->resolve(prog, n);
|
|
107
|
96
|
if (!err || (err != -ENOENT))
|
|
|
@@ -116,10 +105,78 @@ int symbol_resolve(node_t *n, void *_prog)
|
|
116
|
105
|
return sym_add(prog->globals, n->ident, NULL);
|
|
117
|
106
|
}
|
|
118
|
107
|
|
|
119
|
|
-/* int symbol_infer(node_t *n, void *_prog) */
|
|
120
|
|
-/* { */
|
|
121
|
|
-/* return 0; */
|
|
122
|
|
-/* } */
|
|
|
108
|
+int infer_type_list(prog_t *prog, node_t *n)
|
|
|
109
|
+{
|
|
|
110
|
+ type_t *t;
|
|
|
111
|
+
|
|
|
112
|
+ /* list of lists (code block) => void */
|
|
|
113
|
+ if (n->list->ntype == N_LIST) {
|
|
|
114
|
+ n->type = &t_v;
|
|
|
115
|
+ return 0;
|
|
|
116
|
+ }
|
|
|
117
|
+
|
|
|
118
|
+ t = n->list->type;
|
|
|
119
|
+ if (!t)
|
|
|
120
|
+ return 0;
|
|
|
121
|
+
|
|
|
122
|
+ switch (t->ttype) {
|
|
|
123
|
+ case T_FUNC:
|
|
|
124
|
+ n->type = t->t.func.type;
|
|
|
125
|
+ break;
|
|
|
126
|
+ default:
|
|
|
127
|
+ n->type = t;
|
|
|
128
|
+ }
|
|
|
129
|
+ return 0;
|
|
|
130
|
+}
|
|
|
131
|
+
|
|
|
132
|
+int infer_type_keyword(prog_t *prog, node_t *n)
|
|
|
133
|
+{
|
|
|
134
|
+ node_t *c;
|
|
|
135
|
+
|
|
|
136
|
+ switch (n->keyword) {
|
|
|
137
|
+ case KW_SUBSCRIPT:
|
|
|
138
|
+ c = node_next(node_next(n));
|
|
|
139
|
+ assert(c);
|
|
|
140
|
+ n->type = c->type;
|
|
|
141
|
+ return 0;
|
|
|
142
|
+ case KW_ASSIGN:
|
|
|
143
|
+ /* TODO: assignment is statement for now. do we need
|
|
|
144
|
+ * c-style assignment expressions? e.g `a = b = 2;` */
|
|
|
145
|
+ n->type = &t_v;
|
|
|
146
|
+ return 0;
|
|
|
147
|
+ }
|
|
|
148
|
+
|
|
|
149
|
+ return -ENOSYS;
|
|
|
150
|
+}
|
|
|
151
|
+
|
|
|
152
|
+int infer_type_sym(prog_t *prog, node_t *n)
|
|
|
153
|
+{
|
|
|
154
|
+ printf("WKZ\n");
|
|
|
155
|
+
|
|
|
156
|
+ return 0;
|
|
|
157
|
+}
|
|
|
158
|
+
|
|
|
159
|
+int pass_infer_types(node_t *n, void *_prog)
|
|
|
160
|
+{
|
|
|
161
|
+ prog_t *prog = _prog;
|
|
|
162
|
+
|
|
|
163
|
+ if (n->type)
|
|
|
164
|
+ return 0;
|
|
|
165
|
+
|
|
|
166
|
+ switch (n->ntype) {
|
|
|
167
|
+ case N_LIST:
|
|
|
168
|
+ return infer_type_list(prog, n);
|
|
|
169
|
+ case N_KEYWORD:
|
|
|
170
|
+ return infer_type_keyword(prog, n);
|
|
|
171
|
+ case N_IDENT:
|
|
|
172
|
+ return infer_type_sym(prog, n);
|
|
|
173
|
+ default:
|
|
|
174
|
+ break;
|
|
|
175
|
+ }
|
|
|
176
|
+
|
|
|
177
|
+ return 0;
|
|
|
178
|
+}
|
|
|
179
|
+
|
|
123
|
180
|
|
|
124
|
181
|
int pass_walk(pass_t *pass, prog_t *prog)
|
|
125
|
182
|
{
|
|
|
@@ -127,8 +184,9 @@ int pass_walk(pass_t *pass, prog_t *prog)
|
|
127
|
184
|
}
|
|
128
|
185
|
|
|
129
|
186
|
pass_t passes[] = {
|
|
130
|
|
- { .run = pass_walk, .pre = symbol_resolve },
|
|
131
|
|
- /* { .run = pass_walk, .pre = symbol_infer }, */
|
|
|
187
|
+ { .run = pass_walk, .post = pass_resolve_symbols },
|
|
|
188
|
+ { .run = pass_walk, .post = pass_infer_types },
|
|
|
189
|
+ { .run = pass_walk, .post = pass_infer_types },
|
|
132
|
190
|
|
|
133
|
191
|
{ NULL }
|
|
134
|
192
|
};
|