package ppg.spec; import java.util.*; import ppg.*; import ppg.code.*; import ppg.parse.*; public abstract class Spec implements Unparse { protected String packageName; protected Vector imports, symbols, prec; protected InitCode initCode; protected ActionCode actionCode; protected ParserCode parserCode; protected ScanCode scanCode; protected PPGSpec child; public Spec () { initCode = null; actionCode = null; parserCode = null; scanCode = null; child = null; } public void setPkgName (String pkgName) { if (pkgName != null) packageName = pkgName; } public void replaceCode (Vector codeParts) { if (codeParts == null) return; Code code=null; for (int i=0; i < codeParts.size(); i++) { try { code = (Code) codeParts.elementAt(i); if (code instanceof ActionCode && code != null) { actionCode = (ActionCode) code.clone(); } else if (code instanceof InitCode && code != null) { initCode = (InitCode) code.clone(); } else if (code instanceof ParserCode && code != null) { parserCode = (ParserCode) code.clone(); } else { // must be ScanCode if (code != null) scanCode = (ScanCode) code.clone(); } } catch (Exception e) { System.err.println(PPG.HEADER+" Spec::replaceCode(): not a code segment "+ "found in code Vector: "+ ((code == null) ? "null" : code.toString())); System.exit(1); } } } public void addImports (Vector imp) { if (imp == null) return; for (int i=0; i < imp.size(); i++) { imports.addElement(imp.elementAt(i)); } } public void setChild (PPGSpec childSpec) { child = childSpec; } // default action is to do nothing: as CUP does public void parseChain(String basePath) {} /** * Combine the chain of inheritance into one CUP spec */ public abstract CUPSpec coalesce() throws PPGError; }