AstNode* expr = factor(p);
-// while (matches_oneof(p, (int[]){'*', '/', '%', AND, 0}))
-// {
-// Item right = { 0 };
-// int op = consume(p);
-// factor(p, &right);
-// switch(op)
-// {
-// case '*':
-// case '/':
-// case '%':
-// check_nums(p, item, &right);
-// codegen_binop(p, op, item, &right);
-// break;
-//
-// case AND:
-// check_bools(p, item, &right);
-// codegen_binop(p, op, item, &right);
-// break;
-//
-// default:
-// assert(!"not supported");
-// break;
-// }
-// }
+ while (matches_oneof(p, (int[]){'*', '/', '%', AND, 0}))
+ {
+ int op = consume(p);
+ AstNode* right = factor(p);
+ switch(op)
+ {
+ case '*':
+ case '/':
+ case '%':
+ check_nums(p, expr, right);
+ expr = ast_binop(op, expr, right);
+ break;
+
+ case AND:
+ check_bools(p, expr, right);
+ expr = ast_binop(op, expr, right);
+ break;
+
+ default:
+ assert(!"not supported");
+ break;
+ }
+ }
EXIT_RULE();
assert(expr != NULL);
AstNode* expr;
- /* first term and +/- */
+ /* first term and +/- unary ops */
if (matches_oneof(p, (int[]){'+', '-', 0}))
{
- int op = consume(p); // OP
+ int op = consume(p);
AstNode* operand = term(p);
-// check_num(p, operand);
+ check_num(p, operand);
expr = ast_unop(op, operand);
}
else
expr = term(p);
}
-// /* optional second term and op */
-// while (matches_oneof(p, (int[]){'+', '-', OR, 0}))
-// {
-// Item right = { 0 };
-// int op = consume(p);
-// term(p, &right);
-// if (op == OR)
-// {
-// check_bools(p, item, &right);
-// }
-// else
-// {
-// check_nums(p, item, &right);
-// }
-// codegen_binop(p, op, item, &right);
-// }
+ /* optional second term and binary ops */
+ while (matches_oneof(p, (int[]){'+', '-', OR, 0}))
+ {
+ int op = consume(p);
+ AstNode* right = term(p);
+ if (op == OR)
+ {
+ check_bools(p, expr, right);
+ }
+ else
+ {
+ check_nums(p, expr, right);
+ }
+ expr = ast_binop(op, expr, right);
+ }
EXIT_RULE();
assert(expr != NULL);
static AstNode* expression(Parser* p)
{
+ const int ops[] = { EQ, NEQ, '<', LTEQ, '>', GTEQ, 0 };
ENTER_RULE();
-// int ops[] = { EQ, NEQ, '<', LTEQ, '>', GTEQ, IS, 0 };
-
AstNode* expr = simple_expr(p);
-// if (matches_oneof(p, ops))
-// {
-// Item right = { 0 };
-// int op = consume(p);
-// simple_expr(p, &right);
-// check_nums(p, item, &right);
-// codegen_binop(p, op, item, &right);
-// }
+ if (matches_oneof(p, ops))
+ {
+ int op = consume(p);
+ AstNode* right = simple_expr(p);
+ check_nums(p, expr, right);
+ expr = ast_binop(op, expr, right);
+ }
EXIT_RULE();
assert(expr != NULL);
static void const_decl(Parser* p)
{
-// ENTER_RULE();
+ ENTER_RULE();
char* name = NULL;
bool export = false;
Symbol* sym = NULL;
sym->value = expression(p);
ast_print(sym->value);
puts("");
- (void)sym; /* TODO: put const value into symbol table */
-// ir_getconst(p, sym);
-// sym->imm = item->imm;
-// sym->type = item->type;
}
while (matches(p, IDENT));
-// EXIT_RULE();
+ EXIT_RULE();
}
//RULE(proc_decl, Item* item)
static void import_list(Parser* p)
{
-// ENTER_RULE();
+ ENTER_RULE();
expect(p, IMPORT);
do
{
m->next = p->imports;
p->imports = m;
}
-// EXIT_RULE();
+ EXIT_RULE();
}
static void module(Parser* p)