1 19 20 package edu.umd.cs.findbugs.tools.patcomp; 21 22 import java.io.IOException ; 23 24 30 public class CodeGen implements PatternCompilerTreeConstants { 31 private CodeEmitter emitter; 32 33 public CodeGen() { 34 } 35 36 public void generate(SimpleNode root, CodeEmitter emitter) throws IOException { 37 this.emitter = emitter; 38 visit(root); 39 emitter.finish(); 40 } 41 42 private void visit(SimpleNode node) throws IOException { 43 switch (node.getId()) { 44 case JJTPRESCREEN: 45 generatePrescreen(node); 46 break; 47 default: 48 generateDefault(node); 49 break; 50 } 51 } 52 53 public void generateDefault(SimpleNode node) throws IOException { 54 57 int numChildren = node.jjtGetNumChildren(); 58 59 SimpleNode child = null; 60 Token t; 61 62 int childNum = 0; 66 while (childNum < numChildren) { 67 SimpleNode nextChild = (SimpleNode) node.jjtGetChild(childNum); 68 69 if (child == null) 70 t = node.getFirstToken(); 71 else if (child.getLastToken() != nextChild.getFirstToken()) 72 t = child.getLastToken().next; 73 else 74 t = nextChild.getFirstToken(); 75 76 while (t != nextChild.getFirstToken()) { 77 emitter.emitToken(t.image); 78 t = t.next; 79 } 80 81 child = nextChild; 82 83 visit(child); 84 85 ++childNum; 86 } 87 88 if (child == null) 90 t = node.getFirstToken(); 91 else if (child.getLastToken() != node.getLastToken()) 92 t = child.getLastToken().next; 93 else 94 t = null; 95 96 while (t != null) { 97 emitter.emitToken(t.image); 98 if (t == node.getLastToken()) 99 break; 100 t = t.next; 101 } 102 103 } 106 107 public void generatePrescreen(SimpleNode node) throws IOException { 108 System.out.println("Generating prescreen code"); 109 } 110 } 111 112 | Popular Tags |