annotate sema/ScopeBuilder.d @ 133:9c48871eb816

Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
author Anders Johnsen <skabet@gmail.com>
date Mon, 30 Jun 2008 16:43:40 +0200
parents a101853eaae0
children 2be29b296081
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 86
diff changeset
1 module sema.ScopeBuilder;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
2
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
3 import tango.io.Stdout,
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
4 tango.core.Array : find;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
5
26
b4dc2b2c0e38 Added a DType class
Anders Halager <halager@gmail.com>
parents: 24
diff changeset
6 public
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
7 import sema.Scope,
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
8 sema.Symbol;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
9
59
1d6f4ad38a91 Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents: 56
diff changeset
10 import sema.Visitor,
1d6f4ad38a91 Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents: 56
diff changeset
11 basic.SmallArray;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
12
92
771ac63898e2 A few better parser errors plus renaming most of the sema classes to match that they do now. Some have changes a lot.
Anders Johnsen <skabet@gmail.com>
parents: 86
diff changeset
13 class ForwardReference : Visitor!(void)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
14 {
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
15 override void visit(Module[] modules)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
16 {
133
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
17 (new TypeBuilder).visit(modules);
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
18 this.modules = modules;
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
19 inFunctionBodyStack.push(false);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
20 foreach (mod; modules)
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
21 {
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
22 current = mod;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
23 foreach (decl; mod.decls)
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
24 visitDecl(decl);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
25 }
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
26 }
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
27
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
28 override void visitFuncDecl(FuncDecl d)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
29 {
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
30
63
9f8131676242 Now Decl's have a DType type(), and should use varType and returnType to get the old type id
Anders Halager <halager@gmail.com>
parents: 59
diff changeset
31 visitExp(d.returnType);
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
32 visitExp(d.identifier);
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
33 foreach (arg; d.funcArgs)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
34 visitDecl(arg);
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
35
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
36 inFunctionBodyStack.push(true);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
37
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
38 foreach (stmt; d.statements)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
39 visitStmt(stmt);
59
1d6f4ad38a91 Make most of the tests pass again
Anders Halager <halager@gmail.com>
parents: 56
diff changeset
40
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
41 inFunctionBodyStack.pop();
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
42
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
43 d.sym = current.symbol.createMember(d.identifier.get, d.type);
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
44 }
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
45
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
46 override void visitVarDecl(VarDecl d)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
47 {
82
06dda301ea61 Can declare outside functions and call c-functions
Anders Johnsen <skabet@gmail.com>
parents: 81
diff changeset
48 visitExp(d.varType);
86
29f486ccc203 Fixed a bug that made arrays as params fail big time
Anders Johnsen <skabet@gmail.com>
parents: 83
diff changeset
49 visitExp(d.identifier);
82
06dda301ea61 Can declare outside functions and call c-functions
Anders Johnsen <skabet@gmail.com>
parents: 81
diff changeset
50
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
51 if (d.init)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
52 visitExp(d.init);
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
53
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
54 DType t = typeOf(d.varType, d.env);
132
a101853eaae0 Better scope-building. Still an error with structs and forward ref though.
Anders Johnsen <skabet@gmail.com>
parents: 130
diff changeset
55 d.sym = current.symbol.createAlias(d.identifier.get,d.env.find(d.varType).sym);
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
56 }
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
57
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
58 override void visitStructDecl(StructDecl s)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
59 {
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
60 auto old = current.symbol;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
61 current.symbol = s.sym;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
62 inFunctionBodyStack.push(false);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
63 super.visitStructDecl(s);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
64 inFunctionBodyStack.pop();
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
65 current.symbol = old;
133
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
66 }
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
67
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
68 DType typeOf(Identifier id, Scope sc)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
69 {
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
70 if(auto i = cast(PointerIdentifier)id)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
71 return (typeOf(i.pointerOf, sc)).getPointerTo();
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
72 else if(auto i = cast(ArrayIdentifier)id)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
73 return typeOf(i.arrayOf, sc).getAsArray(i.size);
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
74 return sc.findType(id);
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
75 }
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
76
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
77 Module[] modules;
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
78 Module current;
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
79 SmallArray!(bool) inFunctionBodyStack;
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
80 }
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
81
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
82 class TypeBuilder : Visitor!(void)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
83 {
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
84 override void visit(Module[] modules)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
85 {
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
86 foreach (mod; modules)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
87 {
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
88 current = mod;
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
89 foreach (decl; mod.decls)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
90 visitDecl(decl);
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
91 }
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
92 }
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
93
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
94 override void visitStructDecl(StructDecl s)
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
95 {
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
96 auto st = s.env.findType(s.identifier).asStruct;
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
97 s.sym = current.symbol.createMember(s.identifier.get, st);
55
79cb0afafabe Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents: 53
diff changeset
98
107
189c049cbfcc Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents: 103
diff changeset
99 foreach (decl; s.decls)
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
100 {
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
101 DType type;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
102 char[] name;
107
189c049cbfcc Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents: 103
diff changeset
103 if (auto varDecl = cast(VarDecl)decl)
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
104 {
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
105 type = typeOf(varDecl.varType, varDecl.env);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
106 name = varDecl.identifier.get;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
107 }
107
189c049cbfcc Cleanup of codegen, better support for operators a few bugfixes
Anders Halager <halager@gmail.com>
parents: 103
diff changeset
108 else if (auto fd = cast(FuncDecl)decl)
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
109 {
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
110 type = fd.type;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
111 name = fd.identifier.get;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
112 }
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
113 st.addMember(type, name);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
114 }
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
115 }
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
116
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
117 DType typeOf(Identifier id, Scope sc)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
118 {
77
13eea2c4e60d Now able of --ast-dump-code with Pointer types and also codeGen int* x;
Anders Johnsen <skabet@gmail.com>
parents: 64
diff changeset
119 if(auto i = cast(PointerIdentifier)id)
83
9e90694f5da0 Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents: 82
diff changeset
120 return (typeOf(i.pointerOf, sc)).getPointerTo();
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
121 else if(auto i = cast(ArrayIdentifier)id)
83
9e90694f5da0 Parse array indexing, and allow reading from arrays
Anders Halager <halager@gmail.com>
parents: 82
diff changeset
122 return typeOf(i.arrayOf, sc).getAsArray(i.size);
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
123 return sc.findType(id);
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
124 }
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
125
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
126 Module current;
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
127 }
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
128
133
9c48871eb816 Now working with forward ref and structs in scope builder. New Symbol system should now be good to go!
Anders Johnsen <skabet@gmail.com>
parents: 132
diff changeset
129
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
130 /**
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
131 Add scopes to everything, and add all identifiers that correspond to types.
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
132 Types/Symbols are added by ForwardReference.
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
133 **/
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
134 class ScopeBuilder : Visitor!(void)
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
135 {
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
136 static ModuleHandler mHandle;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
137
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
138 static this()
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
139 {
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
140 mHandle = new ModuleHandler;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
141 }
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
142
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
143 this()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
144 {
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
145 }
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
146
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
147 override void visit(Module[] modules)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
148 {
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
149 foreach(m ; modules)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
150 visitModule(m);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
151
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
152 auto fr = new ForwardReference();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
153
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
154 fr.visit(modules);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
155 }
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
156
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
157 private void registerBasicTypeTo(char[] n, DType t, Scope sc, Module m)
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
158 {
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
159 sc.types[n] = t;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
160 auto sym = m.symbol.createMember(n, t);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
161 auto id = new Identifier(n);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
162 id.env = sc;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
163 auto decl = new DummyDecl();
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
164 decl.sym = sym;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
165 decl.env = sc;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
166 sc.put(id, decl);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
167 }
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
168
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
169 override void visitModule(Module m)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
170 {
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
171 auto root = new Scope;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
172 table ~= root;
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
173
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
174 m.symbol = new Symbol;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
175
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
176 registerBasicTypeTo("void", DType.Void, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
177 registerBasicTypeTo("bool", DType.Bool, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
178 registerBasicTypeTo("byte", DType.Byte, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
179 registerBasicTypeTo("ubyte", DType.UByte, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
180 registerBasicTypeTo("short", DType.Short, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
181 registerBasicTypeTo("ushort", DType.UShort, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
182 registerBasicTypeTo("int", DType.Int, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
183 registerBasicTypeTo("uint", DType.UInt, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
184 registerBasicTypeTo("long", DType.Long, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
185 registerBasicTypeTo("ulong", DType.ULong, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
186
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
187 registerBasicTypeTo("char", DType.Char, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
188 registerBasicTypeTo("wchar", DType.WChar, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
189 registerBasicTypeTo("dchar", DType.DChar, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
190
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
191 registerBasicTypeTo("float", DType.Float, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
192 registerBasicTypeTo("double", DType.Double, root, m);
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
193 registerBasicTypeTo("real", DType.Real, root, m);
119
c0b531362ca6 Non compileing commit. Work on floating points and casts
Anders Johnsen <skabet@gmail.com>
parents: 107
diff changeset
194
99
857f0d530789 Imports and improved module statement
Anders Halager <halager@gmail.com>
parents: 94
diff changeset
195 current().inModule = m;
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
196 current().mHandle = mHandle;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
197 mHandle.add(m);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
198 m.env = current();
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
199 super.visitModule(m);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
200 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
201
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
202 override void visitDecl(Decl d)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
203 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
204 d.env = current();
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
205 super.visitDecl(d);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
206 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
207
101
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
208 override void visitImportDecl(ImportDecl i)
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
209 {
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
210 i.env.imports ~= i;
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
211 super.visitImportDecl(i);
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
212 }
fea8d61a2451 First step(the other first was a bad one) toward imports. You can now compile two files that use eachother - given that they both are in the command line. Right now it's only root sturcts and methods you can use(i guess...?)
Anders Johnsen <skabet@gmail.com>
parents: 99
diff changeset
213
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
214 override void visitStmt(Stmt s)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
215 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
216 s.env = current();
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 55
diff changeset
217 s.stmtIndex = s.env.stmtIndex;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
218 super.visitStmt(s);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
219 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
220
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
221 override void visitExp(Exp e)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
222 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
223 e.env = current();
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 55
diff changeset
224 e.stmtIndex = e.env.stmtIndex;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
225 super.visitExp(e);
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
226 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
227
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
228 override void visitFuncDecl(FuncDecl d)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
229 {
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
230 current().put(d.identifier, d);
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 27
diff changeset
231 auto sc = push();
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
232
63
9f8131676242 Now Decl's have a DType type(), and should use varType and returnType to get the old type id
Anders Halager <halager@gmail.com>
parents: 59
diff changeset
233 visitExp(d.returnType);
2
ae5bbe4e7fd6 Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
234 visitExp(d.identifier);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
235 d.env = current();
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 55
diff changeset
236 sc.parentFunction = d;
2
ae5bbe4e7fd6 Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
237 foreach (arg; d.funcArgs)
ae5bbe4e7fd6 Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
238 visitDecl(arg);
ae5bbe4e7fd6 Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
239 foreach (stmt; d.statements)
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 55
diff changeset
240 {
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 55
diff changeset
241 sc.currentStmtIndex++;
2
ae5bbe4e7fd6 Lots of stuff, here are the git comments:
Anders Halager <halager@gmail.com>
parents: 1
diff changeset
242 visitStmt(stmt);
56
4ae365eff712 Now return types works for structs... Also, simplyfing in AST have been startet - but still messy. This update is a little messy...
Anders Johnsen <skabet@gmail.com>
parents: 55
diff changeset
243 }
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
244 pop(sc);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
245 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
246
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
247 override void visitVarDecl(VarDecl d)
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
248 {
24
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
249 if (d.init)
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
250 visitExp(d.init);
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
251
53
da551f90e03f Added struct decl and forward ref. A note on structs: they need to make a new scope when declared. Otherwise you could access struct members as globals
Anders Johnsen <skabet@gmail.com>
parents: 45
diff changeset
252 if (need_push > 0 && current().parentFunction !is null) {
24
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
253 push();
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
254 --need_push;
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
255 }
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
256
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
257 auto sc = current();
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
258 sc.put(d.identifier, d);
24
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
259 d.env = sc;
63
9f8131676242 Now Decl's have a DType type(), and should use varType and returnType to get the old type id
Anders Halager <halager@gmail.com>
parents: 59
diff changeset
260 visitExp(d.varType);
24
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
261 visitExp(d.identifier);
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
262 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
263
22
e331e4e816e4 now handling structs to some extend
johnsen@johnsen-laptop
parents: 14
diff changeset
264 override void visitStructDecl(StructDecl s)
e331e4e816e4 now handling structs to some extend
johnsen@johnsen-laptop
parents: 14
diff changeset
265 {
e331e4e816e4 now handling structs to some extend
johnsen@johnsen-laptop
parents: 14
diff changeset
266 auto sc = current();
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
267 sc.put(s.identifier, s);
55
79cb0afafabe Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents: 53
diff changeset
268 s.env = sc;
79cb0afafabe Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents: 53
diff changeset
269 auto type = new DStruct(s.identifier);
129
ed815b31479b Added a Symbol
Anders Halager <halager@gmail.com>
parents: 119
diff changeset
270
28
69464d465284 Now supporting structs - both read and write. Still a few errors though, so watch out.
Anders Johnsen <skabet@gmail.com>
parents: 27
diff changeset
271 sc.types[s.identifier.get] = type;
55
79cb0afafabe Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents: 53
diff changeset
272
79cb0afafabe Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents: 53
diff changeset
273 sc = push();
22
e331e4e816e4 now handling structs to some extend
johnsen@johnsen-laptop
parents: 14
diff changeset
274 super.visitStructDecl(s);
55
79cb0afafabe Now structs are somewhat useable to use.
Anders Johnsen <skabet@gmail.com>
parents: 53
diff changeset
275 pop(sc);
22
e331e4e816e4 now handling structs to some extend
johnsen@johnsen-laptop
parents: 14
diff changeset
276 }
e331e4e816e4 now handling structs to some extend
johnsen@johnsen-laptop
parents: 14
diff changeset
277
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
278 override void visitDeclStmt(DeclStmt d)
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
279 {
24
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
280 ++need_push;
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
281 super.visitDeclStmt(d);
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
282 }
24
2d28b21faad6 New codegen!
Anders Halager <halager@gmail.com>
parents: 22
diff changeset
283 private uint need_push = 0;
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
284
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
285 override void visitIfStmt(IfStmt s)
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
286 {
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
287 s.env = current();
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
288 visitExp(s.cond);
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
289 auto sc = push();
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
290 visitStmt(s.then_body);
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
291 pop(sc);
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
292
45
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
293 if (s.else_body !is null)
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
294 {
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
295 sc = push();
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
296 visitStmt(s.else_body);
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
297 pop(sc);
9bc660cbdbec If statements are back
Anders Halager <halager@gmail.com>
parents: 44
diff changeset
298 }
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
299 }
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
300
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
301 override void visitWhileStmt(WhileStmt s)
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
302 {
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
303 s.env = current();
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
304 auto sc = push();
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
305 super.visitWhileStmt(s);
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
306 pop(sc);
11
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
307 }
642c6a998fd9 Support for while statements and fixed scope for if
Anders Halager <halager@gmail.com>
parents: 2
diff changeset
308
44
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
309 override void visitCompoundStmt(CompoundStatement s)
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
310 {
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
311 s.env = current();
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
312 auto sc = push();
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
313 super.visitCompoundStmt(s);
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
314 pop(sc);
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
315 }
495188f9078e Big update - Moving towards a better, more seperated parser
Anders Halager <halager@gmail.com>
parents: 28
diff changeset
316
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
317 private:
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
318 Scope[] table;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
319
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
320 Scope push()
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
321 {
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
322 auto sc = new Scope(current());
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
323 table ~= sc;
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
324 return sc;
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
325 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
326
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
327 Scope pop(Scope sc = null)
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
328 {
14
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
329 if (sc !is null)
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
330 {
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
331 table.length = table.find(sc);
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
332 return sc;
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
333 }
a51bdf15a33d Better scopes.
Anders Halager <halager@gmail.com>
parents: 11
diff changeset
334
1
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
335 auto res = table[$ - 1];
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
336 table.length = table.length - 1;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
337 return res;
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
338 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
339
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
340 Scope current()
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
341 {
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
342 return table[$ - 1];
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
343 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
344 }
2168f4cb73f1 First push
johnsen@johnsen-desktop
parents:
diff changeset
345