X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Foberon.c;h=e8cbf428c12a7261b90dd057c8dc96381f465a3b;hb=a4fb30372d14e8415e2f9b8e647c20daeab59d7d;hp=b428ecf73f6bda15c85365a8d49a5dd6aafb45ad;hpb=e9b64944925eadc5022edfee26281a4814fd9124;p=dsw-obn.git diff --git a/src/oberon.c b/src/oberon.c index b428ecf..e8cbf42 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -65,7 +65,11 @@ enum { IF, THEN, ELSE, - ELSIF + ELSIF, + WHILE, + DO, + REPEAT, + UNTIL }; // ======================================================================= @@ -400,6 +404,22 @@ oberon_read_ident(oberon_context_t * ctx) { ctx -> token = ELSIF; } + else if(strcmp(ident, "WHILE") == 0) + { + ctx -> token = WHILE; + } + else if(strcmp(ident, "DO") == 0) + { + ctx -> token = DO; + } + else if(strcmp(ident, "REPEAT") == 0) + { + ctx -> token = REPEAT; + } + else if(strcmp(ident, "UNTIL") == 0) + { + ctx -> token = UNTIL; + } } static void @@ -2951,6 +2971,52 @@ oberon_statement(oberon_context_t * ctx) 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 == REPEAT) + { + gen_label_t * begin; + oberon_expr_t * cond; + + begin = oberon_generator_reserve_label(ctx); + oberon_generate_label(ctx, begin); + oberon_assert_token(ctx, REPEAT); + + oberon_statement_seq(ctx); + + oberon_assert_token(ctx, UNTIL); + + cond = oberon_expr(ctx); + if(cond -> result -> class != OBERON_TYPE_BOOLEAN) + { + oberon_error(ctx, "condition must be boolean"); + } + + oberon_generate_branch(ctx, cond, true, begin); + } else if(ctx -> token == RETURN) { oberon_assert_token(ctx, RETURN);