(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)
(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)
}
}
-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)
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);
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;
+
+;; <prog> ::= <dec> ...
+
+;; <dec> ::= (define <var> <exp>)
+;; | (begin <dec> ...)
+;; | <exp>
+
+;; <aexp> ::= (λ (<name> ...) <exp>)
+;; | <number>
+;; | <boolean>
+;; | <string>
+;; | <var>
+;; | (void)
+
+;; <cexp> ::= (<aexp> <aexp> ...)
+;; | (if <aexp> <exp> <exp>)
+;; | (set! <var> <exp>)
+
+;; <exp> ::= (let ([<var> <cexp>]) <exp>)
+;; | <aexp>
+;; | <cexp>
+
+
+*/
\r
PROCEDURE OpenScope;\r
VAR s: OSG.Object;\r
- BEGIN NEW(s); s.class := OSG.Head; s.dsc := topScope; s.next := NIL; topScope := s\r
+ BEGIN\r
+ NEW(s);\r
+ s.class := OSG.Head;\r
+ s.dsc := topScope;\r
+ s.next := NIL;\r
+ topScope := s\r
END OpenScope;\r
\r
PROCEDURE CloseScope;\r
VAR y: OSG.Item; obj: OSG.Object;\r
BEGIN\r
WHILE (sym = OSS.lbrak) OR (sym = OSS.period) DO\r
+\r
IF sym = OSS.lbrak THEN\r
OSS.Get(sym); expression(y);\r
IF x.type.form = OSG.Array THEN\r
ELSE OSS.Mark("not an array")\r
END ;\r
Check(OSS.rbrak, "no ]")\r
+\r
ELSE (*period*) OSS.Get(sym);\r
IF sym = OSS.ident THEN\r
IF x.type.form = OSG.Record THEN\r
ELSE\r
OSG.MakeItem(x, obj, level);\r
selector(x);\r
+\r
IF sym = OSS.becomes THEN (*assignment*)\r
OSS.Get(sym);\r
expression(y);\r
ELSE\r
OSS.Mark("incompatible assignment")\r
END\r
+\r
ELSIF sym = OSS.eql THEN\r
OSS.Mark("should be :=");\r
OSS.Get(sym);\r
expression(y)\r
+\r
ELSIF sym = OSS.lparen THEN (*procedure call*)\r
OSS.Get(sym);\r
IF (obj.class = OSG.Proc) & (obj.type = NIL) THEN\r
ELSE\r
OSS.Mark("not a procedure")\r
END\r
+\r
ELSIF obj.class = OSG.Proc THEN (*procedure call without parameters*)\r
IF obj.nofpar > 0 THEN\r
OSS.Mark("missing parameters")\r
OSG.Call(obj) ELSE\r
OSS.Mark("not a procedure")\r
END\r
+\r
ELSIF (obj.class = OSG.SProc) & (obj.val = 3) THEN\r
OSG.WriteLn\r
+\r
ELSIF obj.class = OSG.Typ THEN\r
OSS.Mark("illegal assignment")\r
+\r
ELSE\r
OSS.Mark("not a procedure")\r
END\r
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;
}
}