1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#set( $symbol_pound = '#' ) 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#set( $symbol_dollar = '$' ) 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#set( $symbol_escape = '\' ) 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage ${package}; 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.*; 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.runtime.tree.*; 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport org.antlr.stringtemplate.*; 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport java.io.*; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverimport ${package}.TParser.a_return; 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Test driver program for the ANTLR3 Maven Architype demo 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * @author Jim Idle (jimi@temporal-wave.com) 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Main { 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver private static boolean makeDot = false; 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver static TLexer lexer; 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Just a simple test driver for the ASP parser 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to show how to call it. 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void main(String[] args) 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the lexer, which we can keep reusing if we like 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer = new TLexer(); 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args.length > 0) 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int s = 0; 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (args[0].startsWith("-dot")) 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver makeDot = true; 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = 1; 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Recursively parse each directory, and each file on the 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // command line 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i=s; i<args.length; i++) 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parse(new File(args[i])); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Usage: java -jar ${artifactId}-${version}-jar-with-dependencies.jar <directory | filename.dmo>"); 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Exception ex) 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("ANTLR demo parser threw exception:"); 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex.printStackTrace(); 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void parse(File source) throws Exception 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Open the supplied file or directory 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // From here, any exceptions are just thrown back up the chain 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (source.isDirectory()) 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("Directory: " + source.getAbsolutePath()); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String files[] = source.list(); 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (int i=0; i<files.length; i++) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parse(new File(source, files[i])); 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Else find out if it is an ASP.Net file and parse it if it is 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // File without paths etc 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String sourceFile = source.getName(); 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (sourceFile.length() > 3) 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String suffix = sourceFile.substring(sourceFile.length()-4).toLowerCase(); 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Ensure that this is a DEMO script (or seemingly) 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (suffix.compareTo(".dmo") == 0) 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parseSource(source.getAbsolutePath()); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Exception ex) 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("ANTLR demo parser caught error on file open:"); 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex.printStackTrace(); 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public static void parseSource(String source) throws Exception 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Parse an ANTLR demo file 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // First create a file stream using the povided file/path 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // and tell the lexer that that is the character source. 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // You can also use text that you have already read of course 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // by using the string stream. 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lexer.setCharStream(new ANTLRFileStream(source, "UTF8")); 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Using the lexer as the token source, we create a token 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // stream to be consumed by the parser 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CommonTokenStream tokens = new CommonTokenStream(lexer); 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now we need an instance of our parser 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TParser parser = new TParser(tokens); 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("file: " + source); 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Provide some user feedback 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" Lexer Start"); 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver long start = System.currentTimeMillis(); 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Force token load and lex (don't do this normally, 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // it is just for timing the lexer) 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tokens.LT(1); 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver long lexerStop = System.currentTimeMillis(); 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" lexed in " + (lexerStop - start) + "ms."); 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // And now we merely invoke the start rule for the parser 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" Parser Start"); 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver long pStart = System.currentTimeMillis(); 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver a_return psrReturn = parser.a(); 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver long stop = System.currentTimeMillis(); 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" Parsed in " + (stop - pStart) + "ms."); 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If we got a valid a tree (the syntactic validity of the source code 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // was found to be solid), then let's print the tree to show we 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // did something; our testing public wants to know! 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We do something fairly cool here and generate a graphviz/dot 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // specification for the tree, which will allow the users to visualize 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // it :-) we only do that if asked via the -dot option though as not 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // all users will hsve installed the graphviz toolset from 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // http://www.graphviz.org 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Pick up the generic tree 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Tree t = (Tree)psrReturn.getTree(); 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // NOw walk it with the generic tree walker, which does nothing but 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // verify the tree really. 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver try 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parser.getNumberOfSyntaxErrors() == 0) { 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver TTree walker = new TTree(new CommonTreeNodeStream(t)); 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" AST Walk Start${symbol_escape}n"); 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pStart = System.currentTimeMillis(); 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver walker.a(); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop = System.currentTimeMillis(); 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("${symbol_escape}n AST Walked in " + (stop - pStart) + "ms."); 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch(Exception w) 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("AST walk caused exception."); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver w.printStackTrace(); 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (makeDot && tokens.size() < 4096) 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Now stringify it if you want to... 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // System.out.println(t.toStringTree()); 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Use the ANLTR built in dot generator 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver DOTTreeGenerator gen = new DOTTreeGenerator(); 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Which we can cause to generate the DOT specification 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // with the input file name suffixed with .dot. You can then use 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the graphviz tools or zgrviewer (Java) to view the graphical 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // version of the dot file. 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver source = source.substring(0, source.length()-3); 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver String outputName = source + "dot"; 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" Producing AST dot (graphviz) file"); 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // It produces a jguru string template. 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver StringTemplate st = gen.toDOT(t, new CommonTreeAdaptor()); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the output file and write the dot spec to it 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver FileWriter outputStream = new FileWriter(outputName); 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputStream.write(st.toString()); 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver outputStream.close(); 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Invoke dot to generate a .png file 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" Producing png graphic for tree"); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pStart = System.currentTimeMillis(); 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Process proc = Runtime.getRuntime().exec("dot -Tpng -o" + source + "png " + outputName); 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver proc.waitFor(); 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver stop = System.currentTimeMillis(); 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println(" PNG graphic produced in " + (stop - pStart) + "ms."); 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (FileNotFoundException ex) 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // The file we tried to parse does not exist 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("${symbol_escape}n !!The file " + source + " does not exist!!${symbol_escape}n"); 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver catch (Exception ex) 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Something went wrong in the parser, report this 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.err.println("Parser threw an exception:${symbol_escape}n${symbol_escape}n"); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ex.printStackTrace(); 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 251