diff --git a/src/oberon.c b/src/oberon.c
index 5816c2b3fb0a96f2076f0e6ff82fbeb2b87058d2..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);
- if(ctx -> token == ELSE)
+ 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);
oberon_statement_seq(ctx);
}