package scm; import java.io.*; import java.util.*; import jas.RuntimeConstants; class driver implements RuntimeConstants { static Hashtable syms; public static void main(String argv[]) throws Exception { String infileName, outfileName; StreamTokenizer inp; if (argv.length == 0) inp = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); //inp = new StreamTokenizer(System.in); else inp = new StreamTokenizer(new BufferedReader(new InputStreamReader (new BufferedInputStream (new FileInputStream(argv[0]))))); //inp = // new StreamTokenizer // (new BufferedInputStream // (new FileInputStream(argv[0]))); inp.resetSyntax(); inp.wordChars('a', 'z'); inp.wordChars('A', 'Z'); inp.wordChars('!', '!'); inp.wordChars('?', '?'); inp.wordChars('_', '_'); inp.wordChars(128 + 32, 255); inp.whitespaceChars(0, ' '); inp.quoteChar('"'); inp.commentChar(';'); inp.parseNumbers(); inp.eolIsSignificant(false); Env global = new Env(); global.definevar(Symbol.intern("define"), new Define()); global.definevar(Symbol.intern("set!"), new Setvar()); global.definevar(Symbol.intern("lambda"), new Lambda()); global.definevar(Symbol.intern("quote"), new Quote()); global.definevar(Symbol.intern("car"), new Car()); global.definevar(Symbol.intern("cdr"), new Cdr()); global.definevar(Symbol.intern("cons"), new Cons()); global.definevar(Symbol.intern("cond"), new Cond()); global.definevar(Symbol.intern("num?"), new NumP()); global.definevar(Symbol.intern("string?"), new StringP()); global.definevar(Symbol.intern("progn"), new Progn()); global.definevar(Symbol.intern("mapcar"), new Mapcar()); global.definevar(Symbol.intern("+"), new Plus()); global.definevar(Symbol.intern("-"), new Minus()); global.definevar(Symbol.intern("*"), new Mult()); global.definevar(Symbol.intern("/"), new Div()); global.definevar(Symbol.intern("|"), new Or()); global.definevar(Symbol.intern("<"), new LessP()); global.definevar(Symbol.intern(">"), new MoreP()); global.definevar(Symbol.intern("eq?"), new EqP()); // Include jas stuff now. // load in constants global.definevar(Symbol.intern("acc-public"), new Selfrep(ACC_PUBLIC)); global.definevar(Symbol.intern("acc-private"), new Selfrep(ACC_PRIVATE)); global.definevar(Symbol.intern("acc-protected"), new Selfrep(ACC_PROTECTED)); global.definevar(Symbol.intern("acc-static"), new Selfrep(ACC_STATIC)); global.definevar(Symbol.intern("acc-final"), new Selfrep(ACC_FINAL)); global.definevar(Symbol.intern("acc-synchronized"), new Selfrep(ACC_SYNCHRONIZED)); global.definevar(Symbol.intern("acc-volatile"), new Selfrep(ACC_VOLATILE)); global.definevar(Symbol.intern("acc-transient"), new Selfrep(ACC_TRANSIENT)); global.definevar(Symbol.intern("acc-native"), new Selfrep(ACC_NATIVE)); global.definevar(Symbol.intern("acc-interface"), new Selfrep(ACC_INTERFACE)); global.definevar(Symbol.intern("acc-abstract"), new Selfrep(ACC_ABSTRACT)); global.definevar(Symbol.intern("acc-strictfp"), new Selfrep(ACC_STRICTFP)); // Pull in auto generated stuff AutoInit.fillit(global); // now add in procedures for opcodes int opc_cnt = opcNames.length; for (int i=0; i<opc_cnt; i++) { switch(i) { default: global.definevar(Symbol.intern(opcNames[i]), new InsnProcedure(i)); case opc_iinc: case opc_multianewarray: case opc_tableswitch: case opc_invokeinterface: // special instructions break; } } // enter repl do { inp.nextToken(); Obj c = readinp(inp); if (c != null) { c = c.eval(global); } // uncomment this if you want to // see the results of the eval // if (c == null) System.out.println("nil"); // else System.out.println(c.toString()); } while (inp.ttype != inp.TT_EOF); } static Obj readinp(StreamTokenizer inp) throws IOException { switch (inp.ttype) { case '(': return readparen(inp); case ')': throw new SchemeError("Unexpected close paren"); default: return readtok(inp); } } static Cell readparen(StreamTokenizer inp) throws IOException { inp.nextToken(); if (inp.ttype == ')') return (null); return(new Cell(readinp(inp), readparen(inp))); } static Obj readtok(StreamTokenizer inp) { Obj ret; if (inp.ttype == inp.TT_NUMBER) return new Selfrep(inp.nval); else if (inp.ttype == inp.TT_WORD) return Symbol.intern(inp.sval); else if (inp.ttype == inp.TT_EOF) return null; switch (inp.ttype) { case '"': ret = new Selfrep(inp.sval); break; case '+': case '-': case '*': case '/': case '|': case '<': case '>': ret = Symbol.intern(String.valueOf((char)(inp.ttype))); break; default: throw new SchemeError("Unexpected parse error"); } return ret; } }