--- /dev/null
+* Optimize variable initialization to use constants
ImmValue imm;
} Symbol;
+typedef struct Module {
+ struct Module* next;
+ Symbol* symbols;
+ char* name;
+ char* alias;
+} Module;
+
typedef struct {
enum {
ITEM_CONST, ITEM_VAR
LexFile* done;
LexFile* file;
Tok tok;
+ Module* imports;
Symbol* scope;
} Parser;
void codegen_setreal(Item* item, double val);
void codegen_setstr(Item* item, char* val);
+void codegen_import(char* name);
void codegen_var(char* name, Type* type);
void codegen_main(char* modname);
void codegen_startproc(char* name, long long localsz);
}
}
+void codegen_import(char* name)
+{
+ printf(" call %s\n", name);
+}
+
void codegen_var(char* name, Type* type)
{
- if (type->form == FORM_BOOL || type->form == FORM_INT)
- {
- printf(".data\n");
- printf("%s:\n", name);
- printf(" .zero %d\n\n", type->size);
- }
- else if (type->form == FORM_REAL)
- {
- }
- else
- {
- assert(!"not supported");
- }
+ printf(" .data\n");
+ printf("%s:\n", name);
+ printf(" .zero %d\n\n", type->size);
}
void codegen_main(char* modname)
{
codegen_startproc("main", 0);
-// op_l (OP_CALL, modname);
- printf(" call %s\n", modname);
- printf(" xor %%rax, %%rax\n");
+ printf(" call %s\n", modname);
+ printf(" xor %%rax, %%rax\n");
codegen_endproc();
}
printf(" .globl %s\n", name);
printf("%s:\n", name);
-// op_r (OP_PUSH, RBP);
- printf(" pushq %%rbp\n");
+ printf(" pushq %%rbp\n");
if (localsz > 0)
{
-// op_rr (OP_MOVE, RSP, RBP);
- printf(" movq %%rsp, %%rbp\n");
-// op_ri (OP_SUB, localsz, RSP);
- printf(" sub $%lld, %%rsp\n\n", localsz);
+ printf(" movq %%rsp, %%rbp\n");
+ printf(" sub $%lld, %%rsp\n\n", localsz);
}
else
{
-// op_rr (OP_MOVE, RSP, RBP);
- printf(" movq %%rsp, %%rbp\n\n");
+ printf(" movq %%rsp, %%rbp\n\n");
}
}
void codegen_endproc(void)
{
-// op_r (OP_POP, RBP);
-// op_0 (OP_RET);
- printf("\n pop %%rbp\n");
+ puts("");
+ printf(" pop %%rbp\n");
printf(" ret\n\n");
}
{
printf(" movq $%lld, %s(%%rip)\n", b->imm.i, a->imm.s);
}
- (void)a, (void)b;
+ else
+ {
+ assert(!"bad store op");
+ }
}
sym = sym->next;
}
- if (!accept(p, ','))
+ if (!matches(p, IDENT))
{
break;
}
sym->imm = item->imm;
sym->type = item->type;
- if (!accept(p, ','))
+ if (!matches(p, IDENT))
{
break;
}
/* TODO: add function calls and other complex stuff */
error(p, "expected assignment");
}
+ expect(p, ';');
}
else if (matches(p, IF))
{
+ assert("!not implemented");
}
else
{
error(p, "expected a statement");
}
- expect(p, ';');
- if (matches_oneof(p, (int[]){END, 0}))
+
+ if (matches(p, END))
{
break;
}
}
}
-RULE(declaration_seq)
-{
- if (accept(p, CONST))
- {
- const_decl(p, item);
- expect(p, ';');
- }
-
- if (accept(p, TYPE))
- {
- type_decl(p, item);
- expect(p, ';');
- }
-
- if (accept(p, VAR))
- {
- var_decl(p, item);
- expect(p, ';');
- }
-
- /* WHILE sym = OSS.procedure DO ProcedureDecl; Check(OSS.semicolon, "; expected") END ; */
-}
-
RULE(import_list)
{
(void)item;
expect(p, IMPORT);
while (1)
{
- expect(p, IDENT);
+ Module* m = calloc(1, sizeof(Module));
+ m->name = expect_text(p, IDENT);
if (accept(p, '='))
{
- expect(p, IDENT);
+ m->alias = m->name;
+ m->name = expect_text(p, IDENT);
+ m->next = p->imports;
+ p->imports = m;
}
- if (matches(p, ';'))
+
+ if (!matches(p, IDENT))
{
break;
}
- expect(p, ',');
}
- expect(p, ';');
+
+ /* reverse the list so when we init it happens in the right order */
+ Module* imports = p->imports;
+ p->imports = NULL;
+ while (imports)
+ {
+ Module* m = imports;
+ imports = m->next;
+ m->next = p->imports;
+ p->imports = m;
+ }
}
RULE(module)
expect(p, MODULE);
char* sname = expect_text(p, IDENT);
/* TODO: Check that it matches filename here */
- expect(p, ';');
+ (void)sname;
if (matches(p, IMPORT))
{
import_list(p, item);
}
- declaration_seq(p, item);
+ if (accept(p, CONST))
+ {
+ const_decl(p, item);
+ }
- if (accept(p, BEGIN))
+ if (accept(p, TYPE))
{
- codegen_startproc("Module", 0);
- statement_seq(p, item);
- codegen_endproc();
+ type_decl(p, item);
}
- expect(p, END);
- char* ename = expect_text(p, IDENT);
- if (strcmp(sname, ename))
+ if (accept(p, VAR))
{
- error(p, "Expected module name '%s', recieved '%s' instead", sname, ename);
+ var_decl(p, item);
}
- expect(p, ';');
+
+ codegen_startproc("Module", 0);
+ if (accept(p, BEGIN))
+ {
+ for (Module* m = p->imports; m; m = m->next)
+ {
+ codegen_import(m->name);
+ }
+ statement_seq(p, item);
+ expect(p, END);
+ }
+ codegen_endproc();
+
+// char* ename = expect_text(p, IDENT);
+// if (strcmp(sname, ename))
+// {
+// error(p, "Expected module name '%s', recieved '%s' instead", sname, ename);
+// }
+// expect(p, ';');
}
static inline char* file_load(char* path)
-module Module;
+module Module
+
+#import
+# A = Foo
+# B = Bar
const
- A = true,
+ A = true
B = 42
- ;
var
- a : Bool,
+ a : Bool
b : Int
- ;
begin
a = true;
b = 24;
b = B;
# c = a + b;
-end Module;
+end
-.data
+ .data
a:
.zero 1
-.data
+ .data
b:
.zero 8
.text
.globl Module
Module:
- pushq %rbp
- movq %rsp, %rbp
+ pushq %rbp
+ movq %rsp, %rbp
movq $1, a(%rip)
movq $1, a(%rip)
movq $24, b(%rip)
movq $42, b(%rip)
- pop %rbp
+ pop %rbp
ret
.text
.globl main
main:
- pushq %rbp
- movq %rsp, %rbp
+ pushq %rbp
+ movq %rsp, %rbp
- call Module
- xor %rax, %rax
+ call Module
+ xor %rax, %rax
- pop %rbp
+ pop %rbp
ret