X-Git-Url: http://deadsoftware.ru/gitweb?p=dsw-obn.git;a=blobdiff_plain;f=src%2Foberon.c;h=b428ecf73f6bda15c85365a8d49a5dd6aafb45ad;hp=f2c901433aeb49363ef01007ed8336a1e5db1919;hb=e9b64944925eadc5022edfee26281a4814fd9124;hpb=ffca530414fc4c94c3d95b9bc52f4d0cee3326e9 diff --git a/src/oberon.c b/src/oberon.c index f2c9014..b428ecf 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -64,7 +64,8 @@ enum { STRING, IF, THEN, - ELSE + ELSE, + ELSIF }; // ======================================================================= @@ -395,6 +396,10 @@ oberon_read_ident(oberon_context_t * ctx) { ctx -> token = ELSE; } + else if(strcmp(ident, "ELSIF") == 0) + { + ctx -> token = ELSIF; + } } static void @@ -2918,8 +2923,25 @@ oberon_statement(oberon_context_t * ctx) 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);