1 #include <boost/foreach.hpp>
3 #include <core/assert.hh>
4 #include "scope-builder-visitor.hh"
9 ScopeBuilderVisitor::ScopeBuilderVisitor()
14 ScopeBuilderVisitor::~ScopeBuilderVisitor()
19 ScopeBuilderVisitor::visit(File
& node
)
21 node
.scope
= new Scope();
22 node
.scope
->setParent(parent_
);
26 parent_
= node
.scope
->parent();
30 ScopeBuilderVisitor::visit(FunctionDecl
& node
)
35 FunctionType
*ftype
= new FunctionType
;
36 ftype
->returnType
= node
.returnType
;
37 ftype
->argsType
= new std::vector
<Type
*> ();
38 BOOST_FOREACH (VarDecl
* varDecl
, *node
.args
)
39 ftype
->argsType
->push_back(varDecl
->type
);
41 Symbol
* symbol
= new Symbol
;
42 symbol
->name
= node
.name
;
44 symbol
->address
= new MemoryAddress
;
45 parent_
->addSymbol(symbol
);
49 ScopeBuilderVisitor::visit(Function
& node
)
55 FunctionType
*ftype
= new FunctionType
;
56 ftype
->returnType
= node
.returnType
;
57 ftype
->argsType
= new std::vector
<Type
*> ();
58 BOOST_FOREACH (VarDecl
* varDecl
, *node
.args
)
59 ftype
->argsType
->push_back(varDecl
->type
);
61 Symbol
* symbol
= new Symbol
;
62 symbol
->name
= node
.name
;
64 symbol
->address
= new MemoryAddress
;
65 parent_
->addSymbol(symbol
);
67 node
.scope
= new Scope
;
68 node
.scope
->setParent(parent_
);
70 BOOST_FOREACH (VarDecl
* varDecl
, *node
.args
)
75 symbol
->name
= varDecl
->name
;
76 ReferenceType
* rtype
= new ReferenceType
;
77 rtype
->type
= varDecl
->type
;
79 symbol
->address
= new MemoryAddress
;
80 node
.scope
->addSymbol(symbol
);
84 node
.block
->accept(*this);
85 parent_
= node
.scope
->parent();
89 ScopeBuilderVisitor::visit(Block
& node
)
92 node
.scope
= new Scope();
93 node
.scope
->setParent(parent_
);
96 /// @todo fill the scope with the declarated variables
97 assert(node
.varDecls
);
98 BOOST_FOREACH (VarDecl
* varDecl
, (*node
.varDecls
))
100 Symbol
* symbol
= new Symbol
;
103 symbol
->name
= varDecl
->name
;
104 ReferenceType
* rtype
= new ReferenceType
;
105 rtype
->type
= varDecl
->type
;
106 symbol
->type
= rtype
;
107 symbol
->address
= new MemoryAddress
;
108 node
.scope
->addSymbol(symbol
);
111 super_t::visit(node
);
112 parent_
= node
.scope
->parent();
116 ScopeBuilderVisitor::visit(StringExp
& /*node*/)
120 /// @todo create a global variable