1 package scm; 2 3 import java.io.*; 4 import java.util.*; 5 import jas.RuntimeConstants; 6 7 class driver implements RuntimeConstants 8 { 9 static Hashtable syms; 10 public static void main(String argv[]) 11 throws Exception 12 { 13 String infileName, outfileName; 14 StreamTokenizer inp; 15 16 if (argv.length == 0) 17 inp = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 18 else 20 inp = 21 new StreamTokenizer(new BufferedReader(new InputStreamReader 22 (new BufferedInputStream 23 (new FileInputStream(argv[0]))))); 24 29 inp.resetSyntax(); 30 inp.wordChars('a', 'z'); 31 inp.wordChars('A', 'Z'); 32 inp.wordChars('!', '!'); 33 inp.wordChars('?', '?'); 34 inp.wordChars('_', '_'); 35 inp.wordChars(128 + 32, 255); 36 inp.whitespaceChars(0, ' '); 37 inp.quoteChar('"'); 38 inp.commentChar(';'); 39 inp.parseNumbers(); 40 inp.eolIsSignificant(false); 41 42 Env global = new Env(); 43 44 global.definevar(Symbol.intern("define"), new Define()); 45 global.definevar(Symbol.intern("set!"), new Setvar()); 46 global.definevar(Symbol.intern("lambda"), new Lambda()); 47 global.definevar(Symbol.intern("quote"), new Quote()); 48 global.definevar(Symbol.intern("car"), new Car()); 49 global.definevar(Symbol.intern("cdr"), new Cdr()); 50 global.definevar(Symbol.intern("cons"), new Cons()); 51 global.definevar(Symbol.intern("cond"), new Cond()); 52 global.definevar(Symbol.intern("num?"), new NumP()); 53 global.definevar(Symbol.intern("string?"), new StringP()); 54 global.definevar(Symbol.intern("progn"), new Progn()); 55 global.definevar(Symbol.intern("mapcar"), new Mapcar()); 56 global.definevar(Symbol.intern("+"), new Plus()); 57 global.definevar(Symbol.intern("-"), new Minus()); 58 global.definevar(Symbol.intern("*"), new Mult()); 59 global.definevar(Symbol.intern("/"), new Div()); 60 global.definevar(Symbol.intern("|"), new Or()); 61 global.definevar(Symbol.intern("<"), new LessP()); 62 global.definevar(Symbol.intern(">"), new MoreP()); 63 global.definevar(Symbol.intern("eq?"), new EqP()); 64 65 66 68 70 global.definevar(Symbol.intern("acc-public"), 71 new Selfrep(ACC_PUBLIC)); 72 global.definevar(Symbol.intern("acc-private"), 73 new Selfrep(ACC_PRIVATE)); 74 global.definevar(Symbol.intern("acc-protected"), 75 new Selfrep(ACC_PROTECTED)); 76 global.definevar(Symbol.intern("acc-static"), 77 new Selfrep(ACC_STATIC)); 78 global.definevar(Symbol.intern("acc-final"), 79 new Selfrep(ACC_FINAL)); 80 global.definevar(Symbol.intern("acc-synchronized"), 81 new Selfrep(ACC_SYNCHRONIZED)); 82 global.definevar(Symbol.intern("acc-volatile"), 83 new Selfrep(ACC_VOLATILE)); 84 global.definevar(Symbol.intern("acc-transient"), 85 new Selfrep(ACC_TRANSIENT)); 86 global.definevar(Symbol.intern("acc-native"), 87 new Selfrep(ACC_NATIVE)); 88 global.definevar(Symbol.intern("acc-interface"), 89 new Selfrep(ACC_INTERFACE)); 90 global.definevar(Symbol.intern("acc-abstract"), 91 new Selfrep(ACC_ABSTRACT)); 92 global.definevar(Symbol.intern("acc-strictfp"), 93 new Selfrep(ACC_STRICTFP)); 94 95 AutoInit.fillit(global); 97 98 int opc_cnt = opcNames.length; 100 for (int i=0; i<opc_cnt; i++) 101 { 102 switch(i) 103 { 104 default: 105 global.definevar(Symbol.intern(opcNames[i]), 106 new InsnProcedure(i)); 107 case opc_iinc: 108 case opc_multianewarray: 109 case opc_tableswitch: 110 case opc_invokeinterface: 111 break; 113 } 114 } 115 116 do 118 { 119 inp.nextToken(); 120 Obj c = readinp(inp); 121 if (c != null) { c = c.eval(global); } 122 } 127 while (inp.ttype != inp.TT_EOF); 128 } 129 130 static Obj readinp(StreamTokenizer inp) 131 throws IOException 132 { 133 switch (inp.ttype) 134 { 135 case '(': 136 return readparen(inp); 137 case ')': 138 throw new SchemeError("Unexpected close paren"); 139 default: 140 return readtok(inp); 141 } 142 } 143 144 static Cell readparen(StreamTokenizer inp) 145 throws IOException 146 { 147 inp.nextToken(); 148 if (inp.ttype == ')') return (null); 149 150 return(new Cell(readinp(inp), readparen(inp))); 151 } 152 153 static Obj readtok(StreamTokenizer inp) 154 { 155 Obj ret; 156 if (inp.ttype == inp.TT_NUMBER) 157 return new Selfrep(inp.nval); 158 else if (inp.ttype == inp.TT_WORD) 159 return Symbol.intern(inp.sval); 160 else if (inp.ttype == inp.TT_EOF) 161 return null; 162 163 switch (inp.ttype) 164 { 165 case '"': 166 ret = new Selfrep(inp.sval); break; 167 case '+': 168 case '-': 169 case '*': 170 case '/': 171 case '|': 172 case '<': 173 case '>': 174 ret = Symbol.intern(String.valueOf((char)(inp.ttype))); 175 break; 176 default: 177 throw new SchemeError("Unexpected parse error"); 178 } 179 return ret; 180 } 181 } 182 | Popular Tags |