// Path: src/stone/ClassParser.java
// public class ClassParser extends ClosureParser {
//     Parser member = rule().or(def, simple);
//     Parser class_body = rule(ClassBody.class).sep("{").option(member)
//                             .repeat(rule().sep(";", Token.EOL).option(member))
//                             .sep("}");
//     Parser defclass = rule(ClassStmnt.class).sep("class").identifier(reserved)
//                           .option(rule().sep("extends").identifier(reserved))
//                           .ast(class_body);
//     public ClassParser() {
//         postfix.insertChoice(rule(Dot.class).sep(".").identifier(reserved));
//         program.insertChoice(defclass);
//     }
// }
// 
// Path: src/stone/ParseException.java
// public class ParseException extends Exception {
//     public ParseException(Token t) {
//         this("", t);
//     }
//     public ParseException(String msg, Token t) {
//         super("syntax error around " + location(t) + ". " + msg);
//     }
//     private static String location(Token t) {
//         if (t == Token.EOF)
//             return "the last line";
//         else
//             return "\"" + t.getText() + "\" at line " + t.getLineNumber();
//     }
//     public ParseException(IOException e) {
//         super(e);
//     }
//     public ParseException(String msg) {
//         super(msg);
//     }
// }
// 
// Path: src/chap11/EnvOptInterpreter.java
// public class EnvOptInterpreter {
//     public static void main(String[] args) throws ParseException {
//         run(new ClosureParser(),
//             new Natives().environment(new ResizableArrayEnv()));
//     }
//     public static void run(BasicParser bp, Environment env)
//         throws ParseException
//     {
//         Lexer lexer = new Lexer(new CodeDialog());
//         while (lexer.peek(0) != Token.EOF) {
//             ASTree t = bp.parse(lexer);
//             if (!(t instanceof NullStmnt)) {
//                 ((EnvOptimizer.ASTreeOptEx)t).lookup(
//                         ((EnvOptimizer.EnvEx2)env).symbols());
//                 Object r = ((BasicEvaluator.ASTreeEx)t).eval(env);
//                 System.out.println("=> " + r);
//             }
//         }
//     }
// }
// 
// Path: src/chap11/ResizableArrayEnv.java
// public class ResizableArrayEnv extends ArrayEnv {
//     protected Symbols names;
//     public ResizableArrayEnv() {
//         super(10, null);
//         names = new Symbols();
//     }
//     @Override public Symbols symbols() { return names; }
//     @Override public Object get(String name) {
//         Integer i = names.find(name);
//         if (i == null)
//             if (outer == null)
//                 return null;
//             else
//                 return outer.get(name);
//         else
//             return values[i];
//     }
//     @Override public void put(String name, Object value) {
//         Environment e = where(name);
//         if (e == null)
//             e = this;
//         ((EnvEx2)e).putNew(name, value);
//     }
//     @Override public void putNew(String name, Object value) {
//         assign(names.putNew(name), value);
//     }
//     @Override public Environment where(String name) {
//         if (names.find(name) != null)
//             return this;
//         else if (outer == null)
//             return null;
//         else
//             return ((EnvEx2)outer).where(name);
//     }
//     @Override public void put(int nest, int index, Object value) {
//         if (nest == 0)
//             assign(index, value);
//         else
//             super.put(nest, index, value);
//     }
//     protected void assign(int index, Object value) {
//         if (index >= values.length) {
//             int newLen = values.length * 2;
//             if (index >= newLen)
//                 newLen = index + 1;
//             values = Arrays.copyOf(values, newLen);
//         }
//         values[index] = value;
//     }
// }
// 
// Path: src/chap8/Natives.java
// public class Natives {
//     public Environment environment(Environment env) {
//         appendNatives(env);
//         return env;
//     }
//     protected void appendNatives(Environment env) {
//         append(env, "print", Natives.class, "print", Object.class);
//         append(env, "read", Natives.class, "read");
//         append(env, "length", Natives.class, "length", String.class);
//         append(env, "toInt", Natives.class, "toInt", Object.class);
//         append(env, "currentTime", Natives.class, "currentTime");
//     }
//     protected void append(Environment env, String name, Class<?> clazz,
//                           String methodName, Class<?> ... params) {
//         Method m;
//         try {
//             m = clazz.getMethod(methodName, params);
//         } catch (Exception e) {
//             throw new StoneException("cannot find a native function: "
//                                      + methodName);
//         }
//         env.put(name, new NativeFunction(methodName, m));
//     }
// 
//     // native methods
//     public static int print(Object obj) {
//         System.out.println(obj.toString());
//         return 0;
//     }
//     public static String read() {
//         return JOptionPane.showInputDialog(null);
//     }
//     public static int length(String s) { return s.length(); }
//     public static int toInt(Object value) {
//         if (value instanceof String)
//             return Integer.parseInt((String)value);
//         else if (value instanceof Integer)
//             return ((Integer)value).intValue();
//         else
//             throw new NumberFormatException(value.toString());
//     }
//     private static long startTime = System.currentTimeMillis();
//     public static int currentTime() {
//         return (int)(System.currentTimeMillis() - startTime);
//     }
// }


import stone.ClassParser;
import stone.ParseException;
import chap11.EnvOptInterpreter;
import chap11.ResizableArrayEnv;
import chap8.Natives;
package chap12;

public class ObjOptInterpreter extends EnvOptInterpreter {
    public static void main(String[] args) throws ParseException {
// Path: src/stone/ClassParser.java
// public class ClassParser extends ClosureParser {
//     Parser member = rule().or(def, simple);
//     Parser class_body = rule(ClassBody.class).sep("{").option(member)
//                             .repeat(rule().sep(";", Token.EOL).option(member))
//                             .sep("}");
//     Parser defclass = rule(ClassStmnt.class).sep("class").identifier(reserved)
//                           .option(rule().sep("extends").identifier(reserved))
//                           .ast(class_body);
//     public ClassParser() {
//         postfix.insertChoice(rule(Dot.class).sep(".").identifier(reserved));
//         program.insertChoice(defclass);
//     }
// }
// 
// Path: src/stone/ParseException.java
// public class ParseException extends Exception {
//     public ParseException(Token t) {
//         this("", t);
//     }
//     public ParseException(String msg, Token t) {
//         super("syntax error around " + location(t) + ". " + msg);
//     }
//     private static String location(Token t) {
//         if (t == Token.EOF)
//             return "the last line";
//         else
//             return "\"" + t.getText() + "\" at line " + t.getLineNumber();
//     }
//     public ParseException(IOException e) {
//         super(e);
//     }
//     public ParseException(String msg) {
//         super(msg);
//     }
// }
// 
// Path: src/chap11/EnvOptInterpreter.java
// public class EnvOptInterpreter {
//     public static void main(String[] args) throws ParseException {
//         run(new ClosureParser(),
//             new Natives().environment(new ResizableArrayEnv()));
//     }
//     public static void run(BasicParser bp, Environment env)
//         throws ParseException
//     {
//         Lexer lexer = new Lexer(new CodeDialog());
//         while (lexer.peek(0) != Token.EOF) {
//             ASTree t = bp.parse(lexer);
//             if (!(t instanceof NullStmnt)) {
//                 ((EnvOptimizer.ASTreeOptEx)t).lookup(
//                         ((EnvOptimizer.EnvEx2)env).symbols());
//                 Object r = ((BasicEvaluator.ASTreeEx)t).eval(env);
//                 System.out.println("=> " + r);
//             }
//         }
//     }
// }
// 
// Path: src/chap11/ResizableArrayEnv.java
// public class ResizableArrayEnv extends ArrayEnv {
//     protected Symbols names;
//     public ResizableArrayEnv() {
//         super(10, null);
//         names = new Symbols();
//     }
//     @Override public Symbols symbols() { return names; }
//     @Override public Object get(String name) {
//         Integer i = names.find(name);
//         if (i == null)
//             if (outer == null)
//                 return null;
//             else
//                 return outer.get(name);
//         else
//             return values[i];
//     }
//     @Override public void put(String name, Object value) {
//         Environment e = where(name);
//         if (e == null)
//             e = this;
//         ((EnvEx2)e).putNew(name, value);
//     }
//     @Override public void putNew(String name, Object value) {
//         assign(names.putNew(name), value);
//     }
//     @Override public Environment where(String name) {
//         if (names.find(name) != null)
//             return this;
//         else if (outer == null)
//             return null;
//         else
//             return ((EnvEx2)outer).where(name);
//     }
//     @Override public void put(int nest, int index, Object value) {
//         if (nest == 0)
//             assign(index, value);
//         else
//             super.put(nest, index, value);
//     }
//     protected void assign(int index, Object value) {
//         if (index >= values.length) {
//             int newLen = values.length * 2;
//             if (index >= newLen)
//                 newLen = index + 1;
//             values = Arrays.copyOf(values, newLen);
//         }
//         values[index] = value;
//     }
// }
// 
// Path: src/chap8/Natives.java
// public class Natives {
//     public Environment environment(Environment env) {
//         appendNatives(env);
//         return env;
//     }
//     protected void appendNatives(Environment env) {
//         append(env, "print", Natives.class, "print", Object.class);
//         append(env, "read", Natives.class, "read");
//         append(env, "length", Natives.class, "length", String.class);
//         append(env, "toInt", Natives.class, "toInt", Object.class);
//         append(env, "currentTime", Natives.class, "currentTime");
//     }
//     protected void append(Environment env, String name, Class<?> clazz,
//                           String methodName, Class<?> ... params) {
//         Method m;
//         try {
//             m = clazz.getMethod(methodName, params);
//         } catch (Exception e) {
//             throw new StoneException("cannot find a native function: "
//                                      + methodName);
//         }
//         env.put(name, new NativeFunction(methodName, m));
//     }
// 
//     // native methods
//     public static int print(Object obj) {
//         System.out.println(obj.toString());
//         return 0;
//     }
//     public static String read() {
//         return JOptionPane.showInputDialog(null);
//     }
//     public static int length(String s) { return s.length(); }
//     public static int toInt(Object value) {
//         if (value instanceof String)
//             return Integer.parseInt((String)value);
//         else if (value instanceof Integer)
//             return ((Integer)value).intValue();
//         else
//             throw new NumberFormatException(value.toString());
//     }
//     private static long startTime = System.currentTimeMillis();
//     public static int currentTime() {
//         return (int)(System.currentTimeMillis() - startTime);
//     }
// }


// Path: src/chap12/ObjOptInterpreter.java
import stone.ClassParser;
import stone.ParseException;
import chap11.EnvOptInterpreter;
import chap11.ResizableArrayEnv;
import chap8.Natives;

package chap12;

public class ObjOptInterpreter extends EnvOptInterpreter {
    public static void main(String[] args) throws ParseException {
        run(new ClassParser(),