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.JumpStatement;
23 import org.gnunet.seaspider.parser.nodes.LogicalANDExpression;
24 import org.gnunet.seaspider.parser.nodes.LogicalORExpression;
25 import org.gnunet.seaspider.parser.nodes.MultiplicativeExpression;
26 import org.gnunet.seaspider.parser.nodes.NodeChoice;
27 import org.gnunet.seaspider.parser.nodes.NodeSequence;
28 import org.gnunet.seaspider.parser.nodes.NodeToken;
29 import org.gnunet.seaspider.parser.nodes.ParameterDeclaration;
30 import org.gnunet.seaspider.parser.nodes.PostfixExpression;
31 import org.gnunet.seaspider.parser.nodes.PrimaryExpression;
32 import org.gnunet.seaspider.parser.nodes.RelationalExpression;
33 import org.gnunet.seaspider.parser.nodes.ShiftExpression;
34 import org.gnunet.seaspider.parser.nodes.StructOrUnionSpecifier;
35 import org.gnunet.seaspider.parser.nodes.SwitchStatement;
36 import org.gnunet.seaspider.parser.nodes.TranslationUnit;
37 import org.gnunet.seaspider.parser.nodes.TypeDeclaration;
38 import org.gnunet.seaspider.parser.nodes.UnaryExpression;
39 import org.gnunet.seaspider.parser.nodes.UnaryOperator;
40 import org.gnunet.seaspider.parser.nodes.WhileStatement;
41 import org.gnunet.seaspider.parser.visitors.DepthFirstVisitor;
42 import org.grothoff.LineNumberInfo;
48 public class ExpressionExtractorVisitor extends DepthFirstVisitor {
50 class ExpressionBuilder {
51 String expression = "";
53 void push(String token) {
54 expression = expression + token;
57 void commit(int line) {
58 ExpressionDatabaseHandler.insertIntoExpressionTable(filename,
59 expression, line, scope_end_line);
64 final String filename;
66 ExpressionBuilder current_expression;
72 boolean skip_mode = true;
77 public ExpressionExtractorVisitor(String filename) {
78 this.filename = filename;
81 public void visit(TranslationUnit n) {
82 LineNumberInfo lin = LineNumberInfo.get(n);
83 scope_end_line = lin.lineEnd;
85 assert scope_end_line == lin.lineEnd;
88 public void visit(NodeToken n) {
91 current_expression.push(n.tokenImage);
94 public void visit(StructOrUnionSpecifier n) {
95 // do nothing -- skip!
98 public void visit(TypeDeclaration n) {
99 // do nothing -- skip!
102 public void visit(FunctionDeclaration n) {
105 int old_scope = scope_end_line;
106 LineNumberInfo lin = LineNumberInfo.get(n);
107 scope_end_line = lin.lineEnd;
110 assert scope_end_line == lin.lineEnd;
111 scope_end_line = old_scope;
114 public void visit(ParameterDeclaration n) {
116 assert current_expression == null;
117 current_expression = new ExpressionBuilder();
119 LineNumberInfo lin = LineNumberInfo.get(n);
120 current_expression.commit(lin.lineEnd);
121 current_expression = null;
125 public void visit(InitDeclarator n) {
127 assert current_expression == null;
128 current_expression = new ExpressionBuilder();
130 current_expression = null;
135 public void visit(ExpressionStatement n) {
138 assert current_expression == null;
140 current_expression = new ExpressionBuilder();
142 LineNumberInfo lin = LineNumberInfo.get(n);
143 current_expression.commit(lin.lineEnd);
144 current_expression = null;
148 public void visit(CompoundStatement n) {
149 int old_end = scope_end_line;
150 scope_end_line = n.f2.endLine;
152 scope_end_line = old_end;
155 public void visit(SwitchStatement n) {
156 assert current_expression == null;
158 current_expression = new ExpressionBuilder();
160 current_expression.commit(n.f0.endLine);
162 current_expression = null;
166 public void visit(IfStatement n) {
167 assert current_expression == null;
169 current_expression = new ExpressionBuilder();
171 current_expression.commit(n.f0.endLine);
173 current_expression = null;
178 public void visit(WhileStatement n) {
179 assert current_expression == null;
181 current_expression = new ExpressionBuilder();
183 current_expression.commit(n.f0.endLine);
185 current_expression = null;
189 public void visit(DoWhileStatement n) {
190 assert current_expression == null;
192 current_expression = new ExpressionBuilder();
194 current_expression.commit(n.f6.endLine);
196 current_expression = null;
200 public void visit(ForStatement n) {
201 assert current_expression == null;
203 int old_scope = scope_end_line;
204 LineNumberInfo lin = LineNumberInfo.get(n);
205 scope_end_line = lin.lineEnd;
206 if (n.f2.present()) {
207 current_expression = new ExpressionBuilder();
209 current_expression.commit(n.f3.endLine);
211 if (n.f4.present()) {
212 current_expression = new ExpressionBuilder();
214 current_expression.commit(n.f5.endLine);
216 if (n.f6.present()) {
217 current_expression = new ExpressionBuilder();
219 current_expression.commit(n.f7.endLine);
222 current_expression = null;
224 scope_end_line = old_scope;
227 public void visit(JumpStatement n) {
230 NodeSequence ns = (NodeSequence) n.f0.choice;
231 assert current_expression == null;
233 current_expression = new ExpressionBuilder();
234 ns.elementAt(1).accept(this);
235 LineNumberInfo lin = LineNumberInfo.get(n);
236 current_expression.commit(lin.lineEnd);
237 current_expression = null;
241 public void visit(Expression n) {
242 ExpressionBuilder old = current_expression;
243 current_expression = new ExpressionBuilder();
245 for (int i = 0; i < n.f1.size(); i++) {
246 NodeSequence ns = (NodeSequence) n.f1.elementAt(i);
247 current_expression = new ExpressionBuilder();
248 ns.elementAt(1).accept(this);
250 old.push(current_expression.expression);
251 current_expression = old;
254 public void visit(AssignmentExpression n) {
256 assert current_expression == null;
257 ExpressionBuilder old = current_expression;
258 current_expression = new ExpressionBuilder();
261 old.push(current_expression.expression);
262 LineNumberInfo lin = LineNumberInfo.get(n);
263 old.commit(lin.lineEnd);
265 current_expression = old;
268 public void visit(AssignmentOperator n) {
274 public void visit(ConditionalExpression n) {
275 ExpressionBuilder old = current_expression;
276 current_expression = new ExpressionBuilder();
278 old.push(current_expression.expression);
279 if (n.f1.present()) {
280 NodeSequence ns = (NodeSequence) n.f1.node;
281 current_expression = new ExpressionBuilder();
282 ns.elementAt(1).accept(this);
284 old.push(current_expression.expression);
285 current_expression = new ExpressionBuilder();
286 ns.elementAt(3).accept(this);
288 old.push(current_expression.expression);
289 LineNumberInfo lin = LineNumberInfo.get(n);
290 old.commit(lin.lineEnd);
292 current_expression = old;
295 public void visit(ConstantExpression n) {
299 public void visit(LogicalORExpression n) {
300 assert skip_mode == false;
301 ExpressionBuilder old = current_expression;
302 current_expression = new ExpressionBuilder();
304 if (n.f1.present()) {
306 NodeSequence ns = (NodeSequence) n.f1.node;
307 ns.nodes.get(0).accept(this);
309 ns.nodes.get(1).accept(this);
311 old.push(current_expression.expression);
312 current_expression = old;
315 public void visit(LogicalANDExpression n) {
316 assert skip_mode == false;
317 ExpressionBuilder old = current_expression;
318 current_expression = new ExpressionBuilder();
320 if (n.f1.present()) {
322 NodeSequence ns = (NodeSequence) n.f1.node;
323 ns.nodes.get(0).accept(this);
325 ns.nodes.get(1).accept(this);
327 old.push(current_expression.expression);
328 current_expression = old;
331 public void visit(InclusiveORExpression n) {
332 assert skip_mode == false;
333 ExpressionBuilder old = current_expression;
334 current_expression = new ExpressionBuilder();
336 if (n.f1.present()) {
338 NodeSequence ns = (NodeSequence) n.f1.node;
339 ns.nodes.get(0).accept(this);
341 ns.nodes.get(1).accept(this);
343 old.push(current_expression.expression);
344 current_expression = old;
347 public void visit(ExclusiveORExpression n) {
348 assert skip_mode == false;
349 ExpressionBuilder old = current_expression;
350 current_expression = new ExpressionBuilder();
352 if (n.f1.present()) {
354 NodeSequence ns = (NodeSequence) n.f1.node;
355 ns.nodes.get(0).accept(this);
357 ns.nodes.get(1).accept(this);
359 old.push(current_expression.expression);
360 current_expression = old;
363 public void visit(ANDExpression n) {
364 assert skip_mode == false;
365 ExpressionBuilder old = current_expression;
366 current_expression = new ExpressionBuilder();
368 if (n.f1.present()) {
370 NodeSequence ns = (NodeSequence) n.f1.node;
371 ns.nodes.get(0).accept(this);
373 ns.nodes.get(1).accept(this);
375 old.push(current_expression.expression);
376 current_expression = old;
379 // Safey: this function was fixed to commit the right hand side, the
380 // other similar functions still need to be updated accordingly...
381 public void visit(EqualityExpression n) {
382 assert skip_mode == false;
383 ExpressionBuilder old = current_expression;
384 current_expression = new ExpressionBuilder();
386 if (n.f1.present()) {
387 LineNumberInfo lin = LineNumberInfo.get(n);
388 current_expression.commit(lin.lineEnd);
390 NodeSequence ns = (NodeSequence) n.f1.node;
391 ns.nodes.get(0).accept(this);
393 old.push(current_expression.expression);
394 current_expression = new ExpressionBuilder();
395 ns.nodes.get(1).accept(this);
396 current_expression.commit(lin.lineEnd);
398 old.push(current_expression.expression);
399 current_expression = old;
402 public void visit(RelationalExpression n) {
403 assert skip_mode == false;
404 ExpressionBuilder old = current_expression;
405 current_expression = new ExpressionBuilder();
407 if (n.f1.present()) {
409 NodeSequence ns = (NodeSequence) n.f1.node;
410 ns.nodes.get(0).accept(this);
412 ns.nodes.get(1).accept(this);
414 old.push(current_expression.expression);
415 current_expression = old;
418 public void visit(ShiftExpression n) {
419 assert skip_mode == false;
420 ExpressionBuilder old = current_expression;
421 current_expression = new ExpressionBuilder();
423 if (n.f1.present()) {
425 NodeSequence ns = (NodeSequence) n.f1.node;
426 ns.nodes.get(0).accept(this);
428 ns.nodes.get(1).accept(this);
430 old.push(current_expression.expression);
431 current_expression = old;
434 public void visit(AdditiveExpression n) {
435 assert skip_mode == false;
436 ExpressionBuilder old = current_expression;
437 current_expression = new ExpressionBuilder();
439 if (n.f1.present()) {
441 NodeSequence ns = (NodeSequence) n.f1.node;
442 ns.nodes.get(0).accept(this);
444 ns.nodes.get(1).accept(this);
446 old.push(current_expression.expression);
447 current_expression = old;
450 public void visit(MultiplicativeExpression n) {
451 assert skip_mode == false;
452 ExpressionBuilder old = current_expression;
453 current_expression = new ExpressionBuilder();
455 if (n.f1.present()) {
457 NodeSequence ns = (NodeSequence) n.f1.node;
458 ns.nodes.get(0).accept(this);
460 ns.nodes.get(1).accept(this);
462 old.push(current_expression.expression);
463 current_expression = old;
466 public void visit(CastExpression n) {
467 if (n.f0.which == 1) {
471 NodeSequence ns = (NodeSequence) n.f0.choice;
472 ns.nodes.get(3).accept(this);
475 public void visit(UnaryExpression n) {
476 if ((n.f0.which == 1) || (n.f0.which == 2)) {
477 NodeSequence ns = (NodeSequence) n.f0.choice;
478 ns.nodes.get(1).accept(this);
484 public void visit(UnaryOperator n) {
490 public void visit(PostfixExpression n) {
492 for (int i = 0; i < n.f1.size(); i++) {
493 NodeChoice nc = (NodeChoice) n.f1.elementAt(i);
497 ExpressionBuilder old = current_expression;
498 current_expression = new ExpressionBuilder();
499 NodeSequence ns = (NodeSequence) nc.choice;
500 ns.elementAt(1).accept(this);
501 LineNumberInfo lin = LineNumberInfo.get(n);
502 current_expression.commit(lin.colEnd);
504 old.push(current_expression.expression);
506 current_expression = old;
510 ExpressionBuilder old = current_expression;
511 current_expression = new ExpressionBuilder();
512 NodeSequence ns = (NodeSequence) nc.choice;
513 ns.elementAt(1).accept(this);
515 old.push(current_expression.expression);
517 current_expression = old;
523 ExpressionBuilder old = current_expression;
524 LineNumberInfo lin = LineNumberInfo.get(n);
525 old.commit(lin.lineEnd);
526 current_expression = new ExpressionBuilder();
527 NodeSequence ns = (NodeSequence) nc.choice;
528 ns.elementAt(1).accept(this);
533 old.push(current_expression.expression);
534 current_expression = old;
542 throw new Error("Oops!");
547 public void visit(PrimaryExpression n) {
548 if (n.f0.which == 2) {
549 ExpressionBuilder old = current_expression;
550 current_expression = new ExpressionBuilder();
551 NodeSequence ns = (NodeSequence) n.f0.choice;
552 ns.elementAt(1).accept(this);
554 old.push(current_expression.expression);
556 LineNumberInfo lin = LineNumberInfo.get(n);
557 old.commit(lin.lineEnd);
558 current_expression = old;
563 public void visit(ArgumentExpressionList n) {
564 ExpressionBuilder old = current_expression;
565 current_expression = new ExpressionBuilder();
567 old.push(current_expression.expression);
568 for (int i = 0; i < n.f1.size(); i++) {
569 NodeSequence ns = (NodeSequence) n.f1.elementAt(i);
570 current_expression = new ExpressionBuilder();
571 ns.elementAt(1).accept(this);
573 old.push(current_expression.expression);
575 current_expression = old;