From: Michael D. Lowis Date: Fri, 30 Apr 2021 20:21:41 +0000 (-0400) Subject: reworked global generation to take into account export marker X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=0b61fafd64db36752c8526e4559f02f1d4bef42e;p=proto%2Fobnc.git reworked global generation to take into account export marker --- diff --git a/cerise/backend/c99/codegen.c b/cerise/backend/c99/codegen.c index 2df1a3d..9ce8dc1 100644 --- a/cerise/backend/c99/codegen.c +++ b/cerise/backend/c99/codegen.c @@ -131,9 +131,10 @@ void codegen_imports(Parser* p) (void)p; } -void codegen_global(Parser* p, char* name, Type* type) +void codegen_global(Parser* p, Symbol* sym) { - printf("%s %s_%s;\n", TypeNames[type->form], p->name, name); + printf("%s%s %s_%s;\n", + (sym->export ? "" : "static "), TypeNames[sym->type->form], p->name, sym->name); } void codegen_main(Parser* p) diff --git a/cerise/backend/test/codegen.c b/cerise/backend/test/codegen.c index 2826e8d..f1cbc37 100644 --- a/cerise/backend/test/codegen.c +++ b/cerise/backend/test/codegen.c @@ -51,9 +51,9 @@ void codegen_imports(Parser* p) (void)p; } -void codegen_global(Parser* p, char* name, Type* type) +void codegen_global(Parser* p, Symbol* sym) { - (void)p, (void)name, (void)type; + (void)p, (void)sym; } void codegen_main(Parser* p) diff --git a/cerise/backend/x86_64/codegen.c b/cerise/backend/x86_64/codegen.c index 904ca9d..d2b44ff 100644 --- a/cerise/backend/x86_64/codegen.c +++ b/cerise/backend/x86_64/codegen.c @@ -216,11 +216,11 @@ void codegen_imports(Parser* p) } } -void codegen_global(Parser* p, char* name, Type* type) +void codegen_global(Parser* p, Symbol* sym) { printf(" .data\n"); - printf("%s_%s:\n", p->name, name); - printf(" .zero %d\n\n", type->size); + printf("%s_%s:\n", p->name, sym->name); + printf(" .zero %d\n\n", sym->type->size); } void codegen_main(Parser* p) diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index 47f2656..1aae1fd 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -201,7 +201,7 @@ void codegen_setint(Item* item, Type* type, long long val); void codegen_setreal(Item* item, double val); void codegen_setstr(Item* item, char* val); void codegen_imports(Parser* p); -void codegen_global(Parser* p, char* name, Type* type); +void codegen_global(Parser* p, Symbol* sym); void codegen_main(Parser* p); void codegen_startproc(Parser* p, char* name, bool exported); void codegen_endproc(Parser* p); @@ -212,3 +212,34 @@ void codegen_if(Parser* p, Item* item); void codegen_else(Parser* p, Item* item); void codegen_endif(Parser* p, long elsifs, Item* item); +/* + +typedef struct AnfNode { + enum { + ANF_VAR, ANF_BEGIN, ANF_PROC, ANF_IF, ANF_SET, ANF_LET + } form; +} AnfNode; + +;; ::= ... + +;; ::= (define ) +;; | (begin ...) +;; | + +;; ::= (λ ( ...) ) +;; | +;; | +;; | +;; | +;; | (void) + +;; ::= ( ...) +;; | (if ) +;; | (set! ) + +;; ::= (let ([ ]) ) +;; | +;; | + + +*/ diff --git a/cerise/oberon0/OSP.Mod b/cerise/oberon0/OSP.Mod index ef157dc..4185e42 100644 --- a/cerise/oberon0/OSP.Mod +++ b/cerise/oberon0/OSP.Mod @@ -52,7 +52,12 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) PROCEDURE OpenScope; VAR s: OSG.Object; - BEGIN NEW(s); s.class := OSG.Head; s.dsc := topScope; s.next := NIL; topScope := s + BEGIN + NEW(s); + s.class := OSG.Head; + s.dsc := topScope; + s.next := NIL; + topScope := s END OpenScope; PROCEDURE CloseScope; @@ -65,6 +70,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) VAR y: OSG.Item; obj: OSG.Object; BEGIN WHILE (sym = OSS.lbrak) OR (sym = OSS.period) DO + IF sym = OSS.lbrak THEN OSS.Get(sym); expression(y); IF x.type.form = OSG.Array THEN @@ -72,6 +78,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) ELSE OSS.Mark("not an array") END ; Check(OSS.rbrak, "no ]") + ELSE (*period*) OSS.Get(sym); IF sym = OSS.ident THEN IF x.type.form = OSG.Record THEN @@ -299,6 +306,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) ELSE OSG.MakeItem(x, obj, level); selector(x); + IF sym = OSS.becomes THEN (*assignment*) OSS.Get(sym); expression(y); @@ -307,10 +315,12 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) ELSE OSS.Mark("incompatible assignment") END + ELSIF sym = OSS.eql THEN OSS.Mark("should be :="); OSS.Get(sym); expression(y) + ELSIF sym = OSS.lparen THEN (*procedure call*) OSS.Get(sym); IF (obj.class = OSG.Proc) & (obj.type = NIL) THEN @@ -319,6 +329,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) ELSE OSS.Mark("not a procedure") END + ELSIF obj.class = OSG.Proc THEN (*procedure call without parameters*) IF obj.nofpar > 0 THEN OSS.Mark("missing parameters") @@ -327,10 +338,13 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017 OSPX*) OSG.Call(obj) ELSE OSS.Mark("not a procedure") END + ELSIF (obj.class = OSG.SProc) & (obj.val = 3) THEN OSG.WriteLn + ELSIF obj.class = OSG.Typ THEN OSS.Mark("illegal assignment") + ELSE OSS.Mark("not a procedure") END diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index da2f7ca..5503ca3 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -315,7 +315,7 @@ RULE(var_decl) for (int i = 0; i < nsyms; i++) { sym->type = type->type; - codegen_global(p, sym->name, sym->type); + codegen_global(p, sym); sym = sym->next; } }