source: proto/pabloj/trunk/src/toolchain/pabloS/semanticAnalyzer/SemanticAnalyzer.java @ 3254

Last change on this file since 3254 was 3254, checked in by shermer, 6 years ago

beginning to implement typechecking.

File size: 5.3 KB
Line 
1package toolchain.pabloS.semanticAnalyzer;
2import pabloS.ast.*;
3import toolchain.pabloS.ast.Accessors;
4import toolchain.pabloS.lang.type.PrimitiveType;
5import toolchain.pabloS.lang.type.StreamType;
6import toolchain.pabloS.lang.type.Type;
7
8public class SemanticAnalyzer {
9
10        public class SemanticAnalysisVisitor extends VoidVisitor.Default {
11
12                @Override
13                public void visitLeave(ASTNode node) {
14                        throw new IllegalStateException("unimplemented node type " + node.getClass().getName() + " in SemanticAnalysisVisitor");
15                }
16
17                //
18                // p r o g r a m 
19                //
20                @Override
21                public void visitEnter(ProgramNode node) {
22                        node.setSymbolTable(new SymbolTable());
23                }
24                @Override
25                public void visitLeave(ProgramNode node) {
26                        // TODO Auto-generated method stub     
27                }
28               
29                //
30                // s t r e a m   s t r u c t   d e c l a r a t i o n s 
31                //
32                @Override
33                public void visitEnter(StructDeclNode node) {
34                        node.setSymbolTable(new SymbolTable());
35                }
36                @Override
37                public void visitLeave(StructDeclNode node) {
38                        // TODO Auto-generated method stub     
39                }               
40                @Override
41                public void visitLeave(StructDeclBodyNode node) {
42                        // TODO Auto-generated method stub     
43                }
44                @Override
45                public void visitLeave(StructMemberNode node) {
46                        // TODO Auto-generated method stub     
47                }
48               
49            //
50                // s t r e a m   f u n c t i o n   d e c l a r a t i o n s                                                     
51                //
52                @Override
53                public void visitEnter(FuncDefNode node) {
54                        node.setSymbolTable(new SymbolTable());
55                }
56                @Override
57                public void visitLeave(FuncDefNode node) {
58                        // TODO Auto-generated method stub
59                }
60                @Override
61                public void visitLeave(ParameterListNode node) {
62                        // TODO Auto-generated method stub
63                }
64                @Override
65                public void visitLeave(ParameterNode node) {
66                        // TODO Auto-generated method stub
67                }
68               
69                //
70                // b l o c k   s t a t e m e n t s
71                //
72                @Override
73                public void visitLeave(BlockStmtNode node) {
74                        // TODO Check that each child that is an expression
75                        //      is a function call.
76                }
77               
78                //
79                // s t a t e m e n t s
80                //
81                @Override
82                public void visitLeave(LocalVarDeclNode node) {
83                        // TODO Check initialization type vs. declared type;
84                        //      then enter into symbol table
85                }
86                @Override
87                public void visitLeave(AssignNode node) {
88                        // TODO typecheck left = right
89                }
90                @Override
91                public void visitLeave(IfStmtNode node) {
92                        // TODO check condition node is type STREAM(1)?
93                }
94                @Override
95                public void visitLeave(WhileStmtNode node) {
96                        // TODO check condition node is type STREAM(1)?
97                }
98                @Override
99                public void visitLeave(ReturnStmtNode node) {
100                        // TODO Verify child is same type as declared return type of
101                        //      enclosing stream function declaration
102                }
103
104                //
105                // e x p r e s s i o n s
106                //     
107                @Override
108                public void visitLeave(BinaryOperatorNode node) {
109                        // TODO typecheck against operator signatures
110                }
111                @Override
112                public void visitLeave(UnaryOperatorNode node) {
113                        // TODO Auto-generated method stub                     
114                }
115               
116            //   
117                // f u n c t i o n   c a l l s
118                //
119                @Override
120                public void visitLeave(FuncCallNode node) {
121                        // TODO look up name, check signature
122                }
123                @Override
124                public void visitLeave(FuncCallArgListNode node) {
125                        // TODO Auto-generated method stub
126                }
127               
128            //   
129                // i d e n t i f i e r s
130                //
131                @Override
132                public void visitLeave(CompoundIdentifierNode node) {
133                        // TODO Auto-generated method stub
134                }
135                @Override
136                public void visitLeave(IdentifierNode node) {
137                        ASTNode parent = node.getParent();
138                        if(parent instanceof CompoundIdentifierNode) {
139                                // let parent handle
140                        }
141                        else if(isBeingDefined(node)) {
142                                // parent creates binding, maybe gives this node a type.
143                        }
144                        else {
145                                String name = Accessors.name(node);
146                                for(ASTNode ancestor: node.pathToRoot()) {
147                                        if(ancestor instanceof HasSymbolTableNodeType) {
148                                                SymbolTable symbolTable = ((HasSymbolTableNodeType) ancestor).getSymbolTable();
149                                                if(symbolTable.hasBinding(name)) {
150                                                        node.setBinding(symbolTable.bindingFor(name));
151                                                }                                                                                                               // I WAS HERE: TS
152                                        }
153                                }
154                        }
155                }
156
157                private boolean isBeingDefined(IdentifierNode node) {
158                        ASTNode parent = node.getParent();
159                        return ((parent instanceof FuncDefNode) && node == Accessors.funcIdentifier((FuncDefNode) parent));
160                }
161
162            //   
163                // c o n s t a n t s
164                //
165                @Override
166                public void visitLeave(IntegerConstantNode node) {
167                        node.setType(PrimitiveType.INTEGER);
168                }
169                @Override
170                public void visitLeave(StringConstantNode node) {
171                        node.setType(PrimitiveType.STRING);
172                }
173               
174            //   
175                // t y p e s
176                //
177                @Override
178                public void visitLeave(IntTypeNode node) {
179                        node.setType(PrimitiveType.INTEGER);
180                }
181                @Override
182                public void visitLeave(VoidTypeNode node) {
183                        node.setType(PrimitiveType.VOID);
184                }
185                @Override
186                public void visitLeave(StreamTypeNode node) {
187                        Type type = StreamType.STREAM(node.getFieldWidth());
188                        node.setType(type);
189                }
190                @Override
191                public void visitLeave(StructTypeNode node) {
192                        // TODO Auto-generated method stub                     
193                }
194               
195            //   
196                // s h o u l d   n e v e r   s e e
197                //
198
199                @Override
200                public void visitLeave(FuncCallOrAssignStmtNode node) {
201                        // really a functionCallStatement.  Check that expr
202                        // in statement position is a function call.
203                        // I don't think this node ever occurs.
204                }
205                @Override
206                public void visitLeave(ErrorNode node) {
207                        node.setType(PrimitiveType.ERROR);
208                }
209                @Override
210                public void visitLeave(EpsilonNode node) {
211                        node.setType(PrimitiveType.ERROR);
212                }
213
214        }
215}
Note: See TracBrowser for help on using the repository browser.