diff --git a/src/oberon.c b/src/oberon.c
index b428ecf73f6bda15c85365a8d49a5dd6aafb45ad..8a84e1359dcd48f368f41cd945a76bb92a11b599 100644 (file)
--- a/src/oberon.c
+++ b/src/oberon.c
IF,
THEN,
ELSE,
- ELSIF
+ ELSIF,
+ WHILE,
+ DO
};
// =======================================================================
{
ctx -> token = ELSIF;
}
+ else if(strcmp(ident, "WHILE") == 0)
+ {
+ ctx -> token = WHILE;
+ }
+ else if(strcmp(ident, "DO") == 0)
+ {
+ ctx -> token = DO;
+ }
}
static void
oberon_generate_label(ctx, end);
oberon_assert_token(ctx, END);
}
+ else if(ctx -> token == WHILE)
+ {
+ gen_label_t * begin;
+ gen_label_t * end;
+ oberon_expr_t * cond;
+
+ begin = oberon_generator_reserve_label(ctx);
+ end = oberon_generator_reserve_label(ctx);
+
+ oberon_assert_token(ctx, WHILE);
+ oberon_generate_label(ctx, begin);
+ cond = oberon_expr(ctx);
+ if(cond -> result -> class != OBERON_TYPE_BOOLEAN)
+ {
+ oberon_error(ctx, "condition must be boolean");
+ }
+ oberon_generate_branch(ctx, cond, false, end);
+
+ oberon_assert_token(ctx, DO);
+ oberon_statement_seq(ctx);
+ oberon_generate_goto(ctx, begin);
+
+ oberon_assert_token(ctx, END);
+ oberon_generate_label(ctx, end);
+ }
else if(ctx -> token == RETURN)
{
oberon_assert_token(ctx, RETURN);