/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This file is part of SableCC. * * See the file "LICENSE" for copyright information and the * * terms and conditions for copying, distribution and * * modification of SableCC. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ package org.sablecc.sablecc; import org.sablecc.sablecc.analysis.*; import org.sablecc.sablecc.node.*; import java.io.*; public class GenUtils extends DepthFirstAdapter { private MacroExpander macros; private ResolveAstIds ast_ids; private File pkgDir; private String pkgName; private String mainProduction; public GenUtils(ResolveAstIds ast_ids) { this.ast_ids = ast_ids; try { macros = new MacroExpander( new InputStreamReader( getClass().getResourceAsStream("utils.txt"))); } catch (IOException e) { throw new RuntimeException("unable to open utils.txt."); } pkgDir = new File(ast_ids.astIds.pkgDir, "node"); pkgName = ast_ids.astIds.pkgName.equals("") ? "node" : ast_ids.astIds.pkgName + ".node"; if (!pkgDir.exists()) { if (!pkgDir.mkdir()) { throw new RuntimeException("Unable to create " + pkgDir.getAbsolutePath()); } } } /* public void caseAGrammar(AGrammar node) { AAstProd []temp = (AAstProd[])node.getAst().toArray(new AAstProd[0]); for(int i=0; i<temp.length; i++) { temp[i].apply(this); } } */ @Override public void caseAAstProd(AAstProd node) { if (mainProduction == null) { mainProduction = (String) ast_ids.ast_names.get(node); } } @Override public void outStart(Start node) { if (mainProduction != null) { createStart(); } createEOF(); createInvalidToken(); createNode(); createToken(); create("Switch"); create("Switchable"); } public void createStart() { BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, "Start.java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, "Start.java").getAbsolutePath()); } try { macros.apply(file, "Start", new String[]{pkgName, ast_ids.astIds.pkgName.equals("") ? "analysis" : ast_ids.astIds.pkgName + ".analysis", mainProduction, GenAlts.nodeName(mainProduction)}); } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, "Start.java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } public void createEOF() { BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, "EOF.java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, "EOF.java").getAbsolutePath()); } try { macros.apply(file, "EOF", new String[]{pkgName, ast_ids.astIds.pkgName.equals("") ? "analysis" : ast_ids.astIds.pkgName + ".analysis"}); } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, "EOF.java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } public void createInvalidToken() { BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, "InvalidToken.java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, "InvalidToken.java").getAbsolutePath()); } try { macros.apply(file, "InvalidToken", new String[]{pkgName, ast_ids.astIds.pkgName.equals("") ? "analysis" : ast_ids.astIds.pkgName + ".analysis"}); } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, "InvalidToken.java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } public void createNode() { BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, "Node.java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, "Node.java").getAbsolutePath()); } try { macros.apply(file, "Node", new String[]{pkgName, ast_ids.astIds.pkgName.equals("") ? "analysis" : ast_ids.astIds.pkgName + ".analysis"}); } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, "Node.java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } public void createToken() { BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, "Token.java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, "Token.java").getAbsolutePath()); } try { macros.apply(file, "Token", new String[]{pkgName}); } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, "Token.java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } public void create(String cls) { BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, cls + ".java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, cls + ".java").getAbsolutePath()); } try { macros.apply(file, cls, new String[]{pkgName}); } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, cls + ".java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } }