From 9b634ea6457f946bcad612a1602e92bea21f6c9f Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 30 Apr 2021 09:13:54 -0400 Subject: [PATCH] implemented code generation for if statements. Only the C backend for now --- cerise/backend/c99/codegen.c | 23 +++++++++++++++++++++++ cerise/backend/test/codegen.c | 15 +++++++++++++++ cerise/backend/x86_64/codegen.c | 15 +++++++++++++++ cerise/inc/cerise.h | 4 ++++ cerise/src/grammar.c | 18 +++++++----------- cerise/tests/Module.m | 21 +++++++++++++++++++++ 6 files changed, 85 insertions(+), 11 deletions(-) diff --git a/cerise/backend/c99/codegen.c b/cerise/backend/c99/codegen.c index bb14f9a..2df1a3d 100644 --- a/cerise/backend/c99/codegen.c +++ b/cerise/backend/c99/codegen.c @@ -206,3 +206,26 @@ void codegen_store(Parser* p, Item* a, Item* b) assert(!"bad store op"); } } + +void codegen_if(Parser* p, Item* item) +{ + load_var(p, item); + printf(" if (_T%d) {\n", item->reg); +} + +void codegen_else(Parser* p, Item* item) +{ + (void)p, (void)item; + printf(" } else {\n"); +} + +void codegen_endif(Parser* p, long elsifs, Item* item) +{ + (void)p, (void)item; + printf(" "); + for (long i = 0; i < elsifs; i ++) + { + printf("}"); + } + printf("}\n"); +} diff --git a/cerise/backend/test/codegen.c b/cerise/backend/test/codegen.c index fa252c6..2826e8d 100644 --- a/cerise/backend/test/codegen.c +++ b/cerise/backend/test/codegen.c @@ -85,3 +85,18 @@ void codegen_store(Parser* p, Item* a, Item* b) { (void)p, (void)a, (void)b; } + +void codegen_if(Parser* p, Item* item) +{ + (void)p, (void)item; +} + +void codegen_else(Parser* p, Item* item) +{ + (void)p, (void)item; +} + +void codegen_endif(Parser* p, long elsifs, Item* item) +{ + (void)p, (void)elsifs, (void)item; +} diff --git a/cerise/backend/x86_64/codegen.c b/cerise/backend/x86_64/codegen.c index 4f8602c..904ca9d 100644 --- a/cerise/backend/x86_64/codegen.c +++ b/cerise/backend/x86_64/codegen.c @@ -314,3 +314,18 @@ void codegen_store(Parser* p, Item* a, Item* b) // assert(!"bad store op"); } } + +void codegen_if(Parser* p, Item* item) +{ + (void)p, (void)item; +} + +void codegen_else(Parser* p, Item* item) +{ + (void)p, (void)item; +} + +void codegen_endif(Parser* p, long elsifs, Item* item) +{ + (void)p, (void)elsifs, (void)item; +} diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index ec85ec6..f416a53 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -208,3 +208,7 @@ void codegen_endproc(Parser* p); void codegen_unop(Parser* p, int op, Item* a); void codegen_binop(Parser* p, int op, Item* a, Item* b); void codegen_store(Parser* p, Item* a, Item* b); +void codegen_if(Parser* p, Item* item); +void codegen_else(Parser* p, Item* item); +void codegen_endif(Parser* p, long elsifs, Item* item); + diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index 51b1547..15e3136 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -383,30 +383,26 @@ RULE(statement_seq) expect(p, IF); expression(p, item); check_bool(p, item); - // CFJump(item) + codegen_if(p, item); expect(p, THEN); statement_seq(p, &(Item){0}); - // L = 0 + int elsifs = 0; while (accept(p, ELSIF)) { - // FJump(L) - // FixLink(item->imm.i) + elsifs++; + codegen_else(p, item); expression(p, item); check_bool(p, item); - // CFJump(item) + codegen_if(p, item); expect(p, THEN); statement_seq(p, &(Item){0}); } if (accept(p, ELSE)) { - // FJump(L) - // FixLink(item->imm.i) + codegen_else(p, item); statement_seq(p, &(Item){0}); } - else - { - // FixLink(item->imm.i) - } + codegen_endif(p, elsifs, item); expect(p, END); } else diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index d73b8e4..f7bc47c 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -55,10 +55,31 @@ begin # # Complex arithmetic # c = b + b * b + b; # + + + # If statements + if 1 == 1 then + c = 1; + end + + if 1 == 1 then + c = 1; + else + c = 1; + end + + if 1 == 1 then + c = 1; + elsif 2 == 2 then + c = 1; + end + if 1 == 1 then c = 1; elsif 2 == 2 then c = 2; + elsif 2 == 2 then + c = 2; else c = 3; end -- 2.49.0