1 package org.gnunet.seaspider;
3 import org.gnunet.seaspider.parser.nodes.ANDExpression;
4 import org.gnunet.seaspider.parser.nodes.AdditiveExpression;
5 import org.gnunet.seaspider.parser.nodes.ArgumentExpressionList;
6 import org.gnunet.seaspider.parser.nodes.AssignmentExpression;
7 import org.gnunet.seaspider.parser.nodes.AssignmentOperator;
8 import org.gnunet.seaspider.parser.nodes.CastExpression;
9 import org.gnunet.seaspider.parser.nodes.CompoundStatement;
10 import org.gnunet.seaspider.parser.nodes.ConditionalExpression;
11 import org.gnunet.seaspider.parser.nodes.ConstantExpression;
12 import org.gnunet.seaspider.parser.nodes.DoWhileStatement;
13 import org.gnunet.seaspider.parser.nodes.EqualityExpression;
14 import org.gnunet.seaspider.parser.nodes.ExclusiveORExpression;
15 import org.gnunet.seaspider.parser.nodes.Expression;
16 import org.gnunet.seaspider.parser.nodes.ExpressionStatement;
17 import org.gnunet.seaspider.parser.nodes.ForStatement;
18 import org.gnunet.seaspider.parser.nodes.FunctionDeclaration;
19 import org.gnunet.seaspider.parser.nodes.IfStatement;
20 import org.gnunet.seaspider.parser.nodes.InclusiveORExpression;
21 import org.gnunet.seaspider.parser.nodes.InitDeclarator;
22 import org.gnunet.seaspider.parser.nodes.InitDeclaratorList;
23 import org.gnunet.seaspider.parser.nodes.Initializer;
24 import org.gnunet.seaspider.parser.nodes.InitializerList;
25 import org.gnunet.seaspider.parser.nodes.JumpStatement;
26 import org.gnunet.seaspider.parser.nodes.LogicalANDExpression;
27 import org.gnunet.seaspider.parser.nodes.LogicalORExpression;
28 import org.gnunet.seaspider.parser.nodes.MultiplicativeExpression;
29 import org.gnunet.seaspider.parser.nodes.Node;
30 import org.gnunet.seaspider.parser.nodes.NodeChoice;
31 import org.gnunet.seaspider.parser.nodes.NodeSequence;
32 import org.gnunet.seaspider.parser.nodes.NodeToken;
33 import org.gnunet.seaspider.parser.nodes.ParameterDeclaration;
34 import org.gnunet.seaspider.parser.nodes.PostfixExpression;
35 import org.gnunet.seaspider.parser.nodes.PrimaryExpression;
36 import org.gnunet.seaspider.parser.nodes.RelationalExpression;
37 import org.gnunet.seaspider.parser.nodes.ShiftExpression;
38 import org.gnunet.seaspider.parser.nodes.StructOrUnionSpecifier;
39 import org.gnunet.seaspider.parser.nodes.SwitchStatement;
40 import org.gnunet.seaspider.parser.nodes.TranslationUnit;
41 import org.gnunet.seaspider.parser.nodes.TypeDeclaration;
42 import org.gnunet.seaspider.parser.nodes.UnaryExpression;
43 import org.gnunet.seaspider.parser.nodes.UnaryOperator;
44 import org.gnunet.seaspider.parser.nodes.VariableDeclaration;
45 import org.gnunet.seaspider.parser.nodes.WhileStatement;
46 import org.gnunet.seaspider.parser.visitors.DepthFirstVisitor;
47 import org.grothoff.LineNumberInfo;
53 public class ExpressionExtractorVisitor extends DepthFirstVisitor {
55 class ExpressionBuilder {
56 String expression = "";
58 void push(String token) {
59 expression = expression + token;
62 void commit(int line) {
63 ExpressionDatabaseHandler.insertIntoExpressionTable(filename,
64 expression, line, scope_end_line);
69 final String filename;
71 ExpressionBuilder current_expression;
77 boolean skip_mode = true;
82 public ExpressionExtractorVisitor(String filename) {
83 this.filename = filename;
86 public void visit(TranslationUnit n) {
87 LineNumberInfo lin = LineNumberInfo.get(n);
88 scope_end_line = lin.lineEnd;
90 assert scope_end_line == lin.lineEnd;
93 public void visit(NodeToken n) {
96 current_expression.push(n.tokenImage);
99 public void visit(StructOrUnionSpecifier n) {
100 // do nothing -- skip!
103 public void visit(TypeDeclaration n) {
104 // do nothing -- skip!
107 public void visit(InitDeclaratorList n) {
108 assert skip_mode == true;
110 assert skip_mode == true;
113 public void visit(Initializer n) {
114 assert skip_mode == true;
115 if (n.f0.which == 0) {
116 boolean old_mode = skip_mode;
118 ExpressionBuilder old = current_expression;
119 current_expression = new ExpressionBuilder();
122 old.push(current_expression.expression);
123 LineNumberInfo lin = LineNumberInfo.get(n);
124 old.commit(lin.lineEnd);
126 current_expression = old;
127 skip_mode = old_mode;
131 assert skip_mode == true;
134 public void visit(InitializerList n) {
135 assert skip_mode == true;
137 assert skip_mode == true;
140 public void visit(VariableDeclaration n) {
141 assert skip_mode == true;
145 public void visit(FunctionDeclaration n) {
148 int old_scope = scope_end_line;
149 LineNumberInfo lin = LineNumberInfo.get(n);
150 scope_end_line = lin.lineEnd;
153 assert scope_end_line == lin.lineEnd;
154 scope_end_line = old_scope;
157 public void visit(ParameterDeclaration n) {
159 assert current_expression == null;
160 if (n.f1.present()) {
161 NodeSequence ns = (NodeSequence) n.f1.node;
162 Node var = ns.elementAt(0);
163 current_expression = new ExpressionBuilder();
165 LineNumberInfo lin = LineNumberInfo.get(var);
166 current_expression.commit(lin.lineEnd);
168 current_expression = null;
172 public void visit(InitDeclarator n) {
174 assert current_expression == null;
175 current_expression = new ExpressionBuilder();
177 current_expression = null;
182 public void visit(ExpressionStatement n) {
185 assert current_expression == null;
187 current_expression = new ExpressionBuilder();
189 LineNumberInfo lin = LineNumberInfo.get(n);
190 current_expression.commit(lin.lineEnd);
191 current_expression = null;
195 public void visit(CompoundStatement n) {
196 assert current_expression == null;
197 assert skip_mode == true;
198 int old_end = scope_end_line;
199 scope_end_line = n.f2.endLine;
201 scope_end_line = old_end;
204 public void visit(SwitchStatement n) {
205 assert current_expression == null;
207 current_expression = new ExpressionBuilder();
209 current_expression.commit(n.f0.endLine);
211 current_expression = null;
215 public void visit(IfStatement n) {
216 assert current_expression == null;
218 current_expression = new ExpressionBuilder();
220 current_expression.commit(n.f0.endLine);
222 current_expression = null;
227 public void visit(WhileStatement n) {
228 assert current_expression == null;
230 current_expression = new ExpressionBuilder();
232 current_expression.commit(n.f0.endLine);
234 current_expression = null;
238 public void visit(DoWhileStatement n) {
239 assert current_expression == null;
241 current_expression = new ExpressionBuilder();
243 current_expression.commit(n.f6.endLine);
245 current_expression = null;
249 public void visit(ForStatement n) {
250 assert current_expression == null;
252 int old_scope = scope_end_line;
253 LineNumberInfo lin = LineNumberInfo.get(n);
254 scope_end_line = lin.lineEnd;
255 if (n.f2.present()) {
256 current_expression = new ExpressionBuilder();
258 current_expression.commit(n.f3.endLine);
260 if (n.f4.present()) {
261 current_expression = new ExpressionBuilder();
263 current_expression.commit(n.f5.endLine);
265 if (n.f6.present()) {
266 current_expression = new ExpressionBuilder();
268 current_expression.commit(n.f7.endLine);
271 current_expression = null;
273 scope_end_line = old_scope;
276 public void visit(JumpStatement n) {
279 NodeSequence ns = (NodeSequence) n.f0.choice;
280 assert current_expression == null;
282 current_expression = new ExpressionBuilder();
283 ns.elementAt(1).accept(this);
284 LineNumberInfo lin = LineNumberInfo.get(n);
285 current_expression.commit(lin.lineEnd);
286 current_expression = null;
290 public void visit(Expression n) {
291 ExpressionBuilder old = current_expression;
292 current_expression = new ExpressionBuilder();
294 for (int i = 0; i < n.f1.size(); i++) {
295 NodeSequence ns = (NodeSequence) n.f1.elementAt(i);
296 current_expression = new ExpressionBuilder();
297 ns.elementAt(1).accept(this);
299 old.push(current_expression.expression);
300 current_expression = old;
303 public void visit(AssignmentOperator n) {
309 public void visit(ConditionalExpression n) {
310 ExpressionBuilder old = current_expression;
311 current_expression = new ExpressionBuilder();
313 old.push(current_expression.expression);
314 if (n.f1.present()) {
315 LineNumberInfo lin = LineNumberInfo.get(n);
316 NodeSequence ns = (NodeSequence) n.f1.node;
317 current_expression = new ExpressionBuilder();
318 ns.elementAt(1).accept(this);
319 current_expression.commit(lin.lineEnd);
321 old.push(current_expression.expression);
322 current_expression = new ExpressionBuilder();
323 ns.elementAt(3).accept(this);
324 current_expression.commit(lin.lineEnd);
326 old.push(current_expression.expression);
327 old.commit(lin.lineEnd);
329 current_expression = old;
332 public void visit(ConstantExpression n) {
336 public void visit(LogicalORExpression n) {
337 assert skip_mode == false;
338 ExpressionBuilder old = current_expression;
339 current_expression = new ExpressionBuilder();
341 if (n.f1.present()) {
342 LineNumberInfo lin = LineNumberInfo.get(n);
343 current_expression.commit(lin.lineEnd);
345 NodeSequence ns = (NodeSequence) n.f1.node;
346 ns.nodes.get(0).accept(this);
348 old.push(current_expression.expression);
349 current_expression = new ExpressionBuilder();
350 ns.nodes.get(1).accept(this);
351 current_expression.commit(lin.lineEnd);
353 old.push(current_expression.expression);
354 current_expression = old;
357 public void visit(LogicalANDExpression n) {
358 assert skip_mode == false;
359 ExpressionBuilder old = current_expression;
360 current_expression = new ExpressionBuilder();
362 if (n.f1.present()) {
363 LineNumberInfo lin = LineNumberInfo.get(n);
364 current_expression.commit(lin.lineEnd);
366 NodeSequence ns = (NodeSequence) n.f1.node;
367 ns.nodes.get(0).accept(this);
369 old.push(current_expression.expression);
370 current_expression = new ExpressionBuilder();
371 ns.nodes.get(1).accept(this);
372 current_expression.commit(lin.lineEnd);
374 old.push(current_expression.expression);
375 current_expression = old;
378 public void visit(InclusiveORExpression n) {
379 assert skip_mode == false;
380 ExpressionBuilder old = current_expression;
381 current_expression = new ExpressionBuilder();
383 if (n.f1.present()) {
385 NodeSequence ns = (NodeSequence) n.f1.node;
386 ns.nodes.get(0).accept(this);
388 ns.nodes.get(1).accept(this);
390 old.push(current_expression.expression);
391 current_expression = old;
394 public void visit(ExclusiveORExpression n) {
395 assert skip_mode == false;
396 ExpressionBuilder old = current_expression;
397 current_expression = new ExpressionBuilder();
399 if (n.f1.present()) {
401 NodeSequence ns = (NodeSequence) n.f1.node;
402 ns.nodes.get(0).accept(this);
404 ns.nodes.get(1).accept(this);
406 old.push(current_expression.expression);
407 current_expression = old;
410 public void visit(ANDExpression n) {
411 assert skip_mode == false;
412 ExpressionBuilder old = current_expression;
413 current_expression = new ExpressionBuilder();
415 if (n.f1.present()) {
417 NodeSequence ns = (NodeSequence) n.f1.node;
418 ns.nodes.get(0).accept(this);
420 ns.nodes.get(1).accept(this);
422 old.push(current_expression.expression);
423 current_expression = old;
426 // Safey: this function was fixed to commit the right hand side, the
427 // other similar functions still need to be updated accordingly...
428 public void visit(EqualityExpression n) {
429 assert skip_mode == false;
430 ExpressionBuilder old = current_expression;
431 current_expression = new ExpressionBuilder();
433 if (n.f1.present()) {
434 LineNumberInfo lin = LineNumberInfo.get(n);
435 current_expression.commit(lin.lineEnd);
437 NodeSequence ns = (NodeSequence) n.f1.node;
438 ns.nodes.get(0).accept(this);
440 old.push(current_expression.expression);
441 current_expression = new ExpressionBuilder();
442 ns.nodes.get(1).accept(this);
443 current_expression.commit(lin.lineEnd);
445 old.push(current_expression.expression);
446 current_expression = old;
449 public void visit(RelationalExpression n) {
450 assert skip_mode == false;
451 ExpressionBuilder old = current_expression;
452 current_expression = new ExpressionBuilder();
454 if (n.f1.present()) {
456 NodeSequence ns = (NodeSequence) n.f1.node;
457 ns.nodes.get(0).accept(this);
459 ns.nodes.get(1).accept(this);
461 old.push(current_expression.expression);
462 current_expression = old;
465 public void visit(ShiftExpression n) {
466 assert skip_mode == false;
467 ExpressionBuilder old = current_expression;
468 current_expression = new ExpressionBuilder();
470 if (n.f1.present()) {
472 NodeSequence ns = (NodeSequence) n.f1.node;
473 ns.nodes.get(0).accept(this);
475 ns.nodes.get(1).accept(this);
477 old.push(current_expression.expression);
478 current_expression = old;
481 public void visit(AdditiveExpression n) {
482 assert skip_mode == false;
483 ExpressionBuilder old = current_expression;
484 current_expression = new ExpressionBuilder();
486 if (n.f1.present()) {
488 NodeSequence ns = (NodeSequence) n.f1.node;
489 ns.nodes.get(0).accept(this);
491 ns.nodes.get(1).accept(this);
493 old.push(current_expression.expression);
494 current_expression = old;
497 public void visit(MultiplicativeExpression n) {
498 assert skip_mode == false;
499 ExpressionBuilder old = current_expression;
500 current_expression = new ExpressionBuilder();
502 if (n.f1.present()) {
504 NodeSequence ns = (NodeSequence) n.f1.node;
505 ns.nodes.get(0).accept(this);
507 ns.nodes.get(1).accept(this);
509 old.push(current_expression.expression);
510 current_expression = old;
513 public void visit(CastExpression n) {
514 if (n.f0.which == 1) {
518 NodeSequence ns = (NodeSequence) n.f0.choice;
519 ns.nodes.get(3).accept(this);
522 public void visit(UnaryExpression n) {
523 if ((n.f0.which == 1) || (n.f0.which == 2)) {
524 NodeSequence ns = (NodeSequence) n.f0.choice;
525 ns.nodes.get(1).accept(this);
531 public void visit(UnaryOperator n) {
537 public void visit(PostfixExpression n) {
539 for (int i = 0; i < n.f1.size(); i++) {
540 NodeChoice nc = (NodeChoice) n.f1.elementAt(i);
544 ExpressionBuilder old = current_expression;
545 current_expression = new ExpressionBuilder();
546 NodeSequence ns = (NodeSequence) nc.choice;
547 ns.elementAt(1).accept(this);
548 LineNumberInfo lin = LineNumberInfo.get(n);
549 current_expression.commit(lin.colEnd);
551 old.push(current_expression.expression);
553 current_expression = old;
557 ExpressionBuilder old = current_expression;
558 current_expression = new ExpressionBuilder();
559 NodeSequence ns = (NodeSequence) nc.choice;
560 ns.elementAt(1).accept(this);
562 old.push(current_expression.expression);
564 current_expression = old;
570 ExpressionBuilder old = current_expression;
571 LineNumberInfo lin = LineNumberInfo.get(n);
572 old.commit(lin.lineEnd);
573 current_expression = new ExpressionBuilder();
574 NodeSequence ns = (NodeSequence) nc.choice;
575 ns.elementAt(1).accept(this);
580 old.push(current_expression.expression);
581 current_expression = old;
589 throw new Error("Oops!");
594 public void visit(PrimaryExpression n) {
595 if (n.f0.which == 2) {
596 ExpressionBuilder old = current_expression;
597 current_expression = new ExpressionBuilder();
598 NodeSequence ns = (NodeSequence) n.f0.choice;
599 ns.elementAt(1).accept(this);
601 old.push(current_expression.expression);
603 LineNumberInfo lin = LineNumberInfo.get(n);
604 old.commit(lin.lineEnd);
605 current_expression = old;
610 public void visit(ArgumentExpressionList n) {
611 ExpressionBuilder old = current_expression;
612 current_expression = new ExpressionBuilder();
614 old.push(current_expression.expression);
615 for (int i = 0; i < n.f1.size(); i++) {
616 NodeSequence ns = (NodeSequence) n.f1.elementAt(i);
617 current_expression = new ExpressionBuilder();
618 ns.elementAt(1).accept(this);
620 old.push(current_expression.expression);
622 current_expression = old;