$ template make_analysis() $ // Generate the analysis/Analysis.java file $ output $basedir + '/analysis/Analysis.java' /* This file was generated by SableCC (http://www.sablecc.org/). */ package @package.analysis; import @package.node.*; public interface Analysis extends Switch { Object getIn(Node node); void setIn(Node node, Object in); Object getOut(Node node); void setOut(Node node, Object out); void caseStart(Start node); $ foreach {//alt} void case@ename(@ename node); $ end $ foreach {//token} void case@ename(@ename node); $ end void caseEOF(EOF node); } $ end output $ // Generate the analysis/AnalysisAdapter.java file $ output $basedir + '/analysis/AnalysisAdapter.java' /* This file was generated by SableCC (http://www.sablecc.org/). */ package @package.analysis; import java.util.*; import @package.node.*; public class AnalysisAdapter implements Analysis { private Hashtable in; private Hashtable out; public Object getIn(Node node) { if(in == null) { return null; } return in.get(node); } public void setIn(Node node, Object in) { if(this.in == null) { this.in = new Hashtable(1); } if(in != null) { this.in.put(node, in); } else { this.in.remove(node); } } public Object getOut(Node node) { if(out == null) { return null; } return out.get(node); } public void setOut(Node node, Object out) { if(this.out == null) { this.out = new Hashtable(1); } if(out != null) { this.out.put(node, out); } else { this.out.remove(node); } } public void caseStart(Start node) { defaultCase(node); } $ foreach {//alt} public void case@ename(@ename node) { defaultCase(node); } $ end $ foreach {//token} public void case@ename(@ename node) { defaultCase(node); } $ end public void caseEOF(EOF node) { defaultCase(node); } public void defaultCase(Node node) { } } $ end output $ // Generate the analysis/DepthFirstAdapter.java file $ output $basedir + '/analysis/DepthFirstAdapter.java' /* This file was generated by SableCC (http://www.sablecc.org/). */ package @package.analysis; import java.util.*; import @package.node.*; public class DepthFirstAdapter extends AnalysisAdapter { public void inStart(Start node) { defaultIn(node); } public void outStart(Start node) { defaultOut(node); } public void defaultIn(Node node) { } public void defaultOut(Node node) { } public void caseStart(Start node) { inStart(node); node.get${/parser/productions/production/@ename}().apply(this); node.getEOF().apply(this); outStart(node); } $ foreach {//alt} public void in@ename(@ename node) { defaultIn(node); } public void out@ename(@ename node) { defaultOut(node); } public void case@ename(@ename node) { in@ename(node); $ foreach {elem} $ if @is_list { Object temp[] = node.get@ename().toArray(); for(int i = 0; i < temp.length; i++) { ((@etype) temp[i]).apply(this); } } $ else if(node.get@ename() != null) { node.get@ename().apply(this); } $ end $ end foreach out@ename(node); } $ end foreach } $ end output $ // Generate the analysis/ReverseDepthFirstAdapter.java file $ output $basedir + '/analysis/ReverseDepthFirstAdapter.java' /* This file was generated by SableCC (http://www.sablecc.org/). */ package @package.analysis; import java.util.*; import @package.node.*; public class ReverseDepthFirstAdapter extends AnalysisAdapter { public void inStart(Start node) { defaultIn(node); } public void outStart(Start node) { defaultOut(node); } public void defaultIn(Node node) { } public void defaultOut(Node node) { } public void caseStart(Start node) { inStart(node); node.getEOF().apply(this); node.get${/parser/productions/production/@ename}().apply(this); outStart(node); } $ foreach {//alt} public void in@ename(@ename node) { defaultIn(node); } public void out@ename(@ename node) { defaultOut(node); } public void case@ename(@ename node) { in@ename(node); $ reverse_foreach {elem} $ if @is_list { Object temp[] = node.get@ename().toArray(); for(int i = temp.length - 1; i >= 0; i--) { ((@etype) temp[i]).apply(this); } } $ else if(node.get@ename() != null) { node.get@ename().apply(this); } $ end if $ end reverse_foreach out@ename(node); } $ end foreach } $ end output $ end template