/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 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.*; import java.util.LinkedList; @SuppressWarnings({"rawtypes", "unchecked"}) public class GenTokens extends DepthFirstAdapter { private MacroExpander macros; private ResolveIds ids; private File pkgDir; private String pkgName; // final GenTokens instance = this; String text; public GenTokens(ResolveIds ids) { this.ids = ids; try { macros = new MacroExpander( new InputStreamReader( getClass().getResourceAsStream("tokens.txt"))); } catch (IOException e) { throw new RuntimeException("unable to open tokens.txt."); } pkgDir = new File(ids.pkgDir, "node"); pkgName = ids.pkgName.equals("") ? "node" : ids.pkgName + ".node"; if (!pkgDir.exists()) { if (!pkgDir.mkdir()) { throw new RuntimeException("Unable to create " + pkgDir.getAbsolutePath()); } } } @Override public void inATokenDef(ATokenDef node) { String name = (String) ids.names.get(node); BufferedWriter file; try { file = new BufferedWriter( new FileWriter( new File(pkgDir, name + ".java"))); } catch (IOException e) { throw new RuntimeException("Unable to create " + new File(pkgDir, name + ".java").getAbsolutePath()); } text = null; ARegExp regExp = (ARegExp) node.getRegExp(); LinkedList concats = regExp.getConcats(); if (concats.size() == 1) { AConcat concat = (AConcat) concats.getFirst(); LinkedList unExps = concat.getUnExps(); if (unExps.size() == 1) { AUnExp unExp = (AUnExp) unExps.getFirst(); PBasic basic = unExp.getBasic(); if ((basic instanceof AStringBasic) && (unExp.getUnOp() == null)) { text = ((AStringBasic) basic).getString().getText(); text = text.substring(1, text.length() - 1); } else if ((basic instanceof ACharBasic) && (unExp.getUnOp() == null)) { PChar pChar = ((ACharBasic) basic).getChar(); if (pChar instanceof ACharChar) { text = ((ACharChar) pChar).getChar().getText(); text = text.substring(1, text.length() - 1); } } } } try { if (text == null) { ids.fixedTokens.put(node, new Boolean(false)); macros.apply(file, "VariableTextToken", new String[]{pkgName, ids.pkgName.equals("") ? "analysis" : ids.pkgName + ".analysis", name}); } else { ids.fixedTokens.put(node, new Boolean(true)); macros.apply(file, "FixedTextToken", new String[]{pkgName, ids.pkgName.equals("") ? "analysis" : ids.pkgName + ".analysis", name, processText(text)}); ids.errorNames.put(node, "'" + text + "'"); } } catch (IOException e) { throw new RuntimeException("An error occured while writing to " + new File(pkgDir, name + ".java").getAbsolutePath()); } try { file.close(); } catch (IOException e) { } } private String processText(String s) { StringBuffer result = new StringBuffer(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); switch (c) { case '\b': { result.append("\\t"); break; } case '\t': { result.append("\\t"); break; } case '\n': { result.append("\\n"); break; } case '\f': { result.append("\\f"); break; } case '\r': { result.append("\\r"); break; } case '\"': { result.append("\\\""); break; } case '\'': { result.append("\\\'"); break; } case '\\': { result.append("\\\\"); break; } default: { result.append(c); } } } return result.toString(); } }