void symbol_export(Parser* p, char* path);
// src/type_checks.c
-void check_int(Parser* p, AstNode* a);
-void check_ints(Parser* p, AstNode* a, AstNode* b);
-void check_real(Parser* p, AstNode* a);
-void check_reals(Parser* p, AstNode* a, AstNode* b);
-void check_num(Parser* p, AstNode* a);
-void check_nums(Parser* p, AstNode* a, AstNode* b);
-void check_bool(Parser* p, AstNode* a);
-void check_bools(Parser* p, AstNode* a, AstNode* b);
-void check_type(Parser* p, Type* type, AstNode* a);
-void check_types(Parser* p, AstNode* a, AstNode* b);
+void check_int(Parser* p, SsaNode* a);
+void check_ints(Parser* p, SsaNode* a, SsaNode* b);
+void check_real(Parser* p, SsaNode* a);
+void check_reals(Parser* p, SsaNode* a, SsaNode* b);
+void check_num(Parser* p, SsaNode* a);
+void check_nums(Parser* p, SsaNode* a, SsaNode* b);
+void check_bool(Parser* p, SsaNode* a);
+void check_bools(Parser* p, SsaNode* a, SsaNode* b);
+void check_type(Parser* p, Type* type, SsaNode* a);
+void check_types(Parser* p, SsaNode* a, SsaNode* b);
// src/grammar.c
void compile(char* fname);
error(p, "attempting to index non-array value");
}
SsaNode* index = expression(p);
-// check_int(p, index);
+ check_int(p, index);
expr = ssa_index(p, expr, index);
expect(p, ']');
break;
case '*':
case '/':
case '%':
-// check_nums(p, expr, right);
+ check_nums(p, expr, right);
expr = ssa_op(p, op, expr, right);
break;
case AND:
-// check_bools(p, expr, right);
+ check_bools(p, expr, right);
expr = ssa_op(p, op, expr, right);
break;
{
int op = consume(p);
SsaNode* operand = term(p);
-// check_num(p, operand);
+ check_num(p, operand);
expr = ssa_op(p, op, operand, NULL);
}
else
SsaNode* right = term(p);
if (op == OR)
{
-// check_bools(p, expr, right);
+ check_bools(p, expr, right);
}
else
{
-// check_nums(p, expr, right);
+ check_nums(p, expr, right);
}
expr = ssa_op(p, op, expr, right);
}
{
int op = consume(p);
SsaNode* right = simple_expr(p);
-// check_nums(p, expr, right);
+ check_nums(p, expr, right);
expr = ssa_op(p, op, expr, right);
}
{
error(p, "non-constant array size");
}
-// check_int(p, lnode);
+ check_int(p, lnode);
long long length = ssa_asint(lnode);
expect(p, OF);
Type* base = type(p);
static SsaBlock* statement_seq(Parser* p)
{
ENTER_RULE();
- SsaBlock* block = ssa_block();
+ p->curr_block = ssa_block();
do
{
if (accept(p, '='))
{
SsaNode* right = expression(p);
-// check_types(p, expr, right);
+ check_types(p, expr, right);
expr = ssa_store(p, expr, right);
}
+ else
+ {
+ ssa_block_add(p->curr_block, expr);
+ }
expect(p, ';');
- ssa_block_add(block, expr);
}
}
while (!matches(p, END) && !matches(p, ELSE) && !matches(p, ELSIF) && !matches(p, RETURN));
EXIT_RULE();
- return block;
+ return p->curr_block;
}
static void var_decl(Parser* p)
expect(p, '=');
sym->value = expression(p);
sym->type = sym->value->type;
- ssa_print(p, sym->value);
+ if (sym->value->mode != MODE_CONST)
+ {
+ error(p, "constant defined with non-constant expression");
+ }
}
while (matches(p, IDENT));
if (accept(p, BEGIN))
{
// p->curr_join = ast_block();
-// if (!matches(p, END))
-// {
-// AstNode* block = ast_block();
-// statement_seq(p, block);
-// ast_print(p, block);
-// }
if (!matches(p, END))
{
+// p->curr_block = ssa_block();
SsaBlock* block = statement_seq(p);
-// ast_print(p, block);
+// ssa_print_block(block);
(void)block;
}
expect(p, END);
assert("!stores are not implemented");
load(p, value);
load(p, dest);
- return NULL;
+ SsaNode* node = ssa_node('=', MODE_VAR);
+ node->type = dest->type;
+ node->dest = dest->left.var;
+ ssa_block_add(p->curr_block, node);
+ node->loaded = 1;
+ return node;
}
SsaNode* ssa_fieldref(Parser* p, SsaNode* record, char* fname)
#include "cerise.h"
-void check_int(Parser* p, AstNode* a)
+void check_int(Parser* p, SsaNode* a)
{
- if (a->hdr.type->form != FORM_INT)
+ if (a->type->form != FORM_INT)
{
error(p, "not an int");
}
}
-void check_ints(Parser* p, AstNode* a, AstNode* b)
+void check_ints(Parser* p, SsaNode* a, SsaNode* b)
{
check_int(p, a);
check_int(p, b);
}
-void check_real(Parser* p, AstNode* a)
+void check_real(Parser* p, SsaNode* a)
{
- if (a->hdr.type->form != FORM_REAL)
+ if (a->type->form != FORM_REAL)
{
error(p, "not a real");
}
}
-void check_reals(Parser* p, AstNode* a, AstNode* b)
+void check_reals(Parser* p, SsaNode* a, SsaNode* b)
{
check_real(p, a);
check_real(p, b);
}
-void check_num(Parser* p, AstNode* a)
+void check_num(Parser* p, SsaNode* a)
{
- if (a->hdr.type->form == FORM_REAL)
+ if (a->type->form == FORM_REAL)
{
check_real(p, a);
}
- else if (a->hdr.type->form == FORM_INT)
+ else if (a->type->form == FORM_INT)
{
check_int(p, a);
}
}
}
-void check_nums(Parser* p, AstNode* a, AstNode* b)
+void check_nums(Parser* p, SsaNode* a, SsaNode* b)
{
- if (a->hdr.type->form == FORM_REAL)
+ if (a->type->form == FORM_REAL)
{
check_reals(p, a, b);
}
}
}
-void check_bool(Parser* p, AstNode* a)
+void check_bool(Parser* p, SsaNode* a)
{
- if (a->hdr.type->form != FORM_BOOL)
+ if (a->type->form != FORM_BOOL)
{
error(p, "not an bool");
}
}
-void check_bools(Parser* p, AstNode* a, AstNode* b)
+void check_bools(Parser* p, SsaNode* a, SsaNode* b)
{
check_bool(p, a);
check_bool(p, b);
}
-void check_type(Parser* p, Type* type, AstNode* a)
+void check_type(Parser* p, Type* type, SsaNode* a)
{
if (type->form == FORM_REAL)
{
{
check_bool(p, a);
}
-// else if (a->hdr.type->form == FORM_ARRAY)
+// else if (a->type->form == FORM_ARRAY)
// {
// }
else
}
}
-void check_types(Parser* p, AstNode* a, AstNode* b)
+void check_types(Parser* p, SsaNode* a, SsaNode* b)
{
-// printf("%d %d\n", a->hdr.type->form, b->hdr.type->form);
- if (a->hdr.type->form == FORM_REAL)
+// printf("%d %d\n", a->type->form, b->type->form);
+ if (a->type->form == FORM_REAL)
{
check_reals(p, a, b);
}
- else if (a->hdr.type->form == FORM_INT)
+ else if (a->type->form == FORM_INT)
{
check_ints(p, a, b);
}
- else if (a->hdr.type->form == FORM_BOOL)
+ else if (a->type->form == FORM_BOOL)
{
check_bools(p, a, b);
}
-// else if (a->hdr.type->form == FORM_ARRAY)
+// else if (a->type->form == FORM_ARRAY)
// {
// }
else