KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > scm > driver


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 JavaDoc argv[])
11     throws Exception JavaDoc
12   {
13     String JavaDoc infileName, outfileName;
14     StreamTokenizer inp;
15
16     if (argv.length == 0)
17         inp = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
18       //inp = new StreamTokenizer(System.in);
19
else
20       inp =
21         new StreamTokenizer(new BufferedReader(new InputStreamReader
22         (new BufferedInputStream
23          (new FileInputStream(argv[0])))));
24       //inp =
25
// new StreamTokenizer
26
// (new BufferedInputStream
27
// (new FileInputStream(argv[0])));
28

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                                 // Include jas stuff now.
67

68                                 // load in constants
69

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                                 // Pull in auto generated stuff
96
AutoInit.fillit(global);
97
98                                 // now add in procedures for opcodes
99
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                                 // special instructions
112
break;
113           }
114       }
115
116                                 // enter repl
117
do
118       {
119         inp.nextToken();
120         Obj c = readinp(inp);
121         if (c != null) { c = c.eval(global); }
122         // uncomment this if you want to
123
// see the results of the eval
124
// if (c == null) System.out.println("nil");
125
// else System.out.println(c.toString());
126
}
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