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;
116 assert skip_mode == true;
119 public void visit(InitializerList n) {
120 assert skip_mode == true;
122 assert skip_mode == true;
125 public void visit(VariableDeclaration n) {
126 assert skip_mode == true;
130 public void visit(FunctionDeclaration n) {
133 int old_scope = scope_end_line;
134 LineNumberInfo lin = LineNumberInfo.get(n);
135 scope_end_line = lin.lineEnd;
138 assert scope_end_line == lin.lineEnd;
139 scope_end_line = old_scope;
142 public void visit(ParameterDeclaration n) {
144 assert current_expression == null;
147 NodeSequence ns = (NodeSequence) n.f1.node;
148 Node var = ns.elementAt(0);
149 current_expression = new ExpressionBuilder();
151 LineNumberInfo lin = LineNumberInfo.get(var);
152 current_expression.commit(lin.lineEnd);
154 current_expression = null;
158 public void visit(InitDeclarator n) {
160 assert current_expression == null;
161 current_expression = new ExpressionBuilder();
163 current_expression = null;
168 public void visit(ExpressionStatement n) {
171 assert current_expression == null;
173 current_expression = new ExpressionBuilder();
175 LineNumberInfo lin = LineNumberInfo.get(n);
176 current_expression.commit(lin.lineEnd);
177 current_expression = null;
181 public void visit(CompoundStatement n) {
182 assert current_expression == null;
183 assert skip_mode == true;
184 int old_end = scope_end_line;
185 scope_end_line = n.f2.endLine;
187 scope_end_line = old_end;
190 public void visit(SwitchStatement n) {
191 assert current_expression == null;
193 current_expression = new ExpressionBuilder();
195 current_expression.commit(n.f0.endLine);
197 current_expression = null;
201 public void visit(IfStatement n) {
202 assert current_expression == null;
204 current_expression = new ExpressionBuilder();
206 current_expression.commit(n.f0.endLine);
208 current_expression = null;
213 public void visit(WhileStatement n) {
214 assert current_expression == null;
216 current_expression = new ExpressionBuilder();
218 current_expression.commit(n.f0.endLine);
220 current_expression = null;
224 public void visit(DoWhileStatement n) {
225 assert current_expression == null;
227 current_expression = new ExpressionBuilder();
229 current_expression.commit(n.f6.endLine);
231 current_expression = null;
235 public void visit(ForStatement n) {
236 assert current_expression == null;
238 int old_scope = scope_end_line;
239 LineNumberInfo lin = LineNumberInfo.get(n);
240 scope_end_line = lin.lineEnd;
241 if (n.f2.present()) {
242 current_expression = new ExpressionBuilder();
244 current_expression.commit(n.f3.endLine);
246 if (n.f4.present()) {
247 current_expression = new ExpressionBuilder();
249 current_expression.commit(n.f5.endLine);
251 if (n.f6.present()) {
252 current_expression = new ExpressionBuilder();
254 current_expression.commit(n.f7.endLine);
257 current_expression = null;
259 scope_end_line = old_scope;
262 public void visit(JumpStatement n) {
265 NodeSequence ns = (NodeSequence) n.f0.choice;
266 assert current_expression == null;
268 current_expression = new ExpressionBuilder();
269 ns.elementAt(1).accept(this);
270 LineNumberInfo lin = LineNumberInfo.get(n);
271 current_expression.commit(lin.lineEnd);
272 current_expression = null;
276 public void visit(Expression n) {
277 ExpressionBuilder old = current_expression;
278 current_expression = new ExpressionBuilder();
280 for (int i = 0; i < n.f1.size(); i++) {
281 NodeSequence ns = (NodeSequence) n.f1.elementAt(i);
282 current_expression = new ExpressionBuilder();
283 ns.elementAt(1).accept(this);
285 old.push(current_expression.expression);
286 current_expression = old;
289 public void visit(AssignmentExpression n) {
290 boolean old_mode = skip_mode;
292 ExpressionBuilder old = current_expression;
293 current_expression = new ExpressionBuilder();
296 old.push(current_expression.expression);
297 LineNumberInfo lin = LineNumberInfo.get(n);
298 old.commit(lin.lineEnd);
300 current_expression = old;
301 skip_mode = old_mode;
304 public void visit(AssignmentOperator n) {
310 public void visit(ConditionalExpression n) {
311 ExpressionBuilder old = current_expression;
312 current_expression = new ExpressionBuilder();
314 old.push(current_expression.expression);
315 if (n.f1.present()) {
316 NodeSequence ns = (NodeSequence) n.f1.node;
317 current_expression = new ExpressionBuilder();
318 ns.elementAt(1).accept(this);
320 old.push(current_expression.expression);
321 current_expression = new ExpressionBuilder();
322 ns.elementAt(3).accept(this);
324 old.push(current_expression.expression);
325 LineNumberInfo lin = LineNumberInfo.get(n);
326 old.commit(lin.lineEnd);
328 current_expression = old;
331 public void visit(ConstantExpression n) {
335 public void visit(LogicalORExpression n) {
336 assert skip_mode == false;
337 ExpressionBuilder old = current_expression;
338 current_expression = new ExpressionBuilder();
340 if (n.f1.present()) {
342 NodeSequence ns = (NodeSequence) n.f1.node;
343 ns.nodes.get(0).accept(this);
345 ns.nodes.get(1).accept(this);
347 old.push(current_expression.expression);
348 current_expression = old;
351 public void visit(LogicalANDExpression n) {
352 assert skip_mode == false;
353 ExpressionBuilder old = current_expression;
354 current_expression = new ExpressionBuilder();
356 if (n.f1.present()) {
358 NodeSequence ns = (NodeSequence) n.f1.node;
359 ns.nodes.get(0).accept(this);
361 ns.nodes.get(1).accept(this);
363 old.push(current_expression.expression);
364 current_expression = old;
367 public void visit(InclusiveORExpression n) {
368 assert skip_mode == false;
369 ExpressionBuilder old = current_expression;
370 current_expression = new ExpressionBuilder();
372 if (n.f1.present()) {
374 NodeSequence ns = (NodeSequence) n.f1.node;
375 ns.nodes.get(0).accept(this);
377 ns.nodes.get(1).accept(this);
379 old.push(current_expression.expression);
380 current_expression = old;
383 public void visit(ExclusiveORExpression n) {
384 assert skip_mode == false;
385 ExpressionBuilder old = current_expression;
386 current_expression = new ExpressionBuilder();
388 if (n.f1.present()) {
390 NodeSequence ns = (NodeSequence) n.f1.node;
391 ns.nodes.get(0).accept(this);
393 ns.nodes.get(1).accept(this);
395 old.push(current_expression.expression);
396 current_expression = old;
399 public void visit(ANDExpression n) {
400 assert skip_mode == false;
401 ExpressionBuilder old = current_expression;
402 current_expression = new ExpressionBuilder();
404 if (n.f1.present()) {
406 NodeSequence ns = (NodeSequence) n.f1.node;
407 ns.nodes.get(0).accept(this);
409 ns.nodes.get(1).accept(this);
411 old.push(current_expression.expression);
412 current_expression = old;
415 // Safey: this function was fixed to commit the right hand side, the
416 // other similar functions still need to be updated accordingly...
417 public void visit(EqualityExpression n) {
418 assert skip_mode == false;
419 ExpressionBuilder old = current_expression;
420 current_expression = new ExpressionBuilder();
422 if (n.f1.present()) {
423 LineNumberInfo lin = LineNumberInfo.get(n);
424 current_expression.commit(lin.lineEnd);
426 NodeSequence ns = (NodeSequence) n.f1.node;
427 ns.nodes.get(0).accept(this);
429 old.push(current_expression.expression);
430 current_expression = new ExpressionBuilder();
431 ns.nodes.get(1).accept(this);
432 current_expression.commit(lin.lineEnd);
434 old.push(current_expression.expression);
435 current_expression = old;
438 public void visit(RelationalExpression n) {
439 assert skip_mode == false;
440 ExpressionBuilder old = current_expression;
441 current_expression = new ExpressionBuilder();
443 if (n.f1.present()) {
445 NodeSequence ns = (NodeSequence) n.f1.node;
446 ns.nodes.get(0).accept(this);
448 ns.nodes.get(1).accept(this);
450 old.push(current_expression.expression);
451 current_expression = old;
454 public void visit(ShiftExpression n) {
455 assert skip_mode == false;
456 ExpressionBuilder old = current_expression;
457 current_expression = new ExpressionBuilder();
459 if (n.f1.present()) {
461 NodeSequence ns = (NodeSequence) n.f1.node;
462 ns.nodes.get(0).accept(this);
464 ns.nodes.get(1).accept(this);
466 old.push(current_expression.expression);
467 current_expression = old;
470 public void visit(AdditiveExpression n) {
471 assert skip_mode == false;
472 ExpressionBuilder old = current_expression;
473 current_expression = new ExpressionBuilder();
475 if (n.f1.present()) {
477 NodeSequence ns = (NodeSequence) n.f1.node;
478 ns.nodes.get(0).accept(this);
480 ns.nodes.get(1).accept(this);
482 old.push(current_expression.expression);
483 current_expression = old;
486 public void visit(MultiplicativeExpression n) {
487 assert skip_mode == false;
488 ExpressionBuilder old = current_expression;
489 current_expression = new ExpressionBuilder();
491 if (n.f1.present()) {
493 NodeSequence ns = (NodeSequence) n.f1.node;
494 ns.nodes.get(0).accept(this);
496 ns.nodes.get(1).accept(this);
498 old.push(current_expression.expression);
499 current_expression = old;
502 public void visit(CastExpression n) {
503 if (n.f0.which == 1) {
507 NodeSequence ns = (NodeSequence) n.f0.choice;
508 ns.nodes.get(3).accept(this);
511 public void visit(UnaryExpression n) {
512 if ((n.f0.which == 1) || (n.f0.which == 2)) {
513 NodeSequence ns = (NodeSequence) n.f0.choice;
514 ns.nodes.get(1).accept(this);
520 public void visit(UnaryOperator n) {
526 public void visit(PostfixExpression n) {
528 for (int i = 0; i < n.f1.size(); i++) {
529 NodeChoice nc = (NodeChoice) n.f1.elementAt(i);
533 ExpressionBuilder old = current_expression;
534 current_expression = new ExpressionBuilder();
535 NodeSequence ns = (NodeSequence) nc.choice;
536 ns.elementAt(1).accept(this);
537 LineNumberInfo lin = LineNumberInfo.get(n);
538 current_expression.commit(lin.colEnd);
540 old.push(current_expression.expression);
542 current_expression = old;
546 ExpressionBuilder old = current_expression;
547 current_expression = new ExpressionBuilder();
548 NodeSequence ns = (NodeSequence) nc.choice;
549 ns.elementAt(1).accept(this);
551 old.push(current_expression.expression);
553 current_expression = old;
559 ExpressionBuilder old = current_expression;
560 LineNumberInfo lin = LineNumberInfo.get(n);
561 old.commit(lin.lineEnd);
562 current_expression = new ExpressionBuilder();
563 NodeSequence ns = (NodeSequence) nc.choice;
564 ns.elementAt(1).accept(this);
569 old.push(current_expression.expression);
570 current_expression = old;
578 throw new Error("Oops!");
583 public void visit(PrimaryExpression n) {
584 if (n.f0.which == 2) {
585 ExpressionBuilder old = current_expression;
586 current_expression = new ExpressionBuilder();
587 NodeSequence ns = (NodeSequence) n.f0.choice;
588 ns.elementAt(1).accept(this);
590 old.push(current_expression.expression);
592 LineNumberInfo lin = LineNumberInfo.get(n);
593 old.commit(lin.lineEnd);
594 current_expression = old;
599 public void visit(ArgumentExpressionList n) {
600 ExpressionBuilder old = current_expression;
601 current_expression = new ExpressionBuilder();
603 old.push(current_expression.expression);
604 for (int i = 0; i < n.f1.size(); i++) {
605 NodeSequence ns = (NodeSequence) n.f1.elementAt(i);
606 current_expression = new ExpressionBuilder();
607 ns.elementAt(1).accept(this);
609 old.push(current_expression.expression);
611 current_expression = old;