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