/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.codehaus.groovy.antlr; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileReader; import org.codehaus.groovy.antlr.parser.GroovyLexer; import org.codehaus.groovy.antlr.parser.GroovyRecognizer; import antlr.ASTFactory; import antlr.CommonAST; import antlr.Token; import antlr.collections.AST; import antlr.debug.misc.ASTFrame; class Main { static boolean whitespaceIncluded = false; static boolean showTree = false; //static boolean xml = false; static boolean verbose = false; public static void main(String[] args) { // Use a try/catch block for parser exceptions try { // if we have at least one command-line argument if (args.length > 0 ) { System.err.println("Parsing..."); // for each directory/file specified on the command line for(int i=0; i< args.length;i++) { if ( args[i].equals("-showtree") ) { showTree = true; } //else if ( args[i].equals("-xml") ) { // xml = true; //} else if ( args[i].equals("-verbose") ) { verbose = true; } else if ( args[i].equals("-trace") ) { GroovyRecognizer.tracing = true; GroovyLexer.tracing = true; } else if ( args[i].equals("-traceParser") ) { GroovyRecognizer.tracing = true; } else if ( args[i].equals("-traceLexer") ) { GroovyLexer.tracing = true; } else if ( args[i].equals("-whitespaceIncluded") ) { whitespaceIncluded = true; } else { doFile(new File(args[i])); // parse it } } } else System.err.println("Usage: java -jar groovyc.jar [-showtree] [-verbose] [-trace{,Lexer,Parser}]"+ "<directory or file name>"); } catch(Exception e) { System.err.println("exception: "+e); e.printStackTrace(System.err); // so we can get stack trace } } // This method decides what action to take based on the type of // file we are looking at public static void doFile(File f) throws Exception { // If this is a directory, walk each file/dir in that directory if (f.isDirectory()) { String files[] = f.list(); for(int i=0; i < files.length; i++) doFile(new File(f, files[i])); } // otherwise, if this is a groovy file, parse it! else if (f.getName().endsWith(".groovy")) { System.err.println(" --- "+f.getAbsolutePath()); // parseFile(f.getName(), new FileInputStream(f)); SourceBuffer sourceBuffer = new SourceBuffer(); UnicodeEscapingReader unicodeReader = new UnicodeEscapingReader(new FileReader(f),sourceBuffer); GroovyLexer lexer = new GroovyLexer(unicodeReader); unicodeReader.setLexer(lexer); parseFile(f.getName(),lexer,sourceBuffer); } } // Here's where we do the real work... public static void parseFile(String f, GroovyLexer l, SourceBuffer sourceBuffer) throws Exception { try { // Create a parser that reads from the scanner GroovyRecognizer parser = GroovyRecognizer.make(l); parser.setSourceBuffer(sourceBuffer); parser.setFilename(f); if (whitespaceIncluded) { GroovyLexer lexer = parser.getLexer(); lexer.setWhitespaceIncluded(true); while (true) { Token t = lexer.nextToken(); System.out.println(t); if (t == null || t.getType() == Token.EOF_TYPE) break; } return; } // start parsing at the compilationUnit rule parser.compilationUnit(); System.out.println("parseFile "+f+" => "+parser.getAST()); // do something with the tree doTreeAction(f, parser.getAST(), parser.getTokenNames()); } catch (Exception e) { System.err.println("parser exception: "+e); e.printStackTrace(); // so we can get stack trace } } public static void doTreeAction(String f, AST t, String[] tokenNames) { if ( t==null ) return; if ( showTree ) { CommonAST.setVerboseStringConversion(true, tokenNames); ASTFactory factory = new ASTFactory(); AST r = factory.create(0,"AST ROOT"); r.setFirstChild(t); final ASTFrame frame = new ASTFrame("Groovy AST", r); frame.setVisible(true); frame.addWindowListener( new WindowAdapter() { public void windowClosing (WindowEvent e) { frame.setVisible(false); // hide the Frame frame.dispose(); System.exit(0); } } ); if (verbose) System.out.println(t.toStringList()); } /*if ( xml ) { ((CommonAST)t).setVerboseStringConversion(true, tokenNames); ASTFactory factory = new ASTFactory(); AST r = factory.create(0,"AST ROOT"); r.setFirstChild(t); XStream xstream = new XStream(); xstream.alias("ast", CommonAST.class); try { xstream.toXML(r,new FileWriter(f + ".xml")); System.out.println("Written AST to " + f + ".xml"); } catch (Exception e) { System.out.println("couldn't write to " + f + ".xml"); e.printStackTrace(); } //if (verbose) System.out.println(t.toStringList()); }*/ /*@todo GroovyTreeParser tparse = new GroovyTreeParser(); try { tparse.compilationUnit(t); if (verbose) System.out.println("successful walk of result AST for "+f); } catch (RecognitionException e) { System.err.println(e.getMessage()); e.printStackTrace(); } @todo*/ } }