// Path: src/stone/ClosureParser.java
// public class ClosureParser extends FuncParser {
//     public ClosureParser() {
//         primary.insertChoice(rule(Fun.class)
//                                  .sep("fun").ast(paramList).ast(block));
//     }
// }
// 
// 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/chap6/BasicInterpreter.java
// public class BasicInterpreter {
//     public static void main(String[] args) throws ParseException {
//         run(new BasicParser(), new BasicEnv());
//     }
//     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)) {
//                 Object r = ((BasicEvaluator.ASTreeEx)t).eval(env);
//                 System.out.println("=> " + r);
//             }
//         }
//     }
// }
// 
// Path: src/chap7/NestedEnv.java
// public class NestedEnv implements Environment {
//     protected HashMap<String,Object> values;
//     protected Environment outer;
//     public NestedEnv() { this(null); }
//     public NestedEnv(Environment e) {
//         values = new HashMap<String,Object>();
//         outer = e;
//     }
//     public void setOuter(Environment e) { outer = e; }
//     public Object get(String name) {
//         Object v = values.get(name);
//         if (v == null && outer != null)
//             return outer.get(name);
//         else
//             return v;
//     }
//     public void putNew(String name, Object value) { values.put(name, value); }
//     public void put(String name, Object value) {
//         Environment e = where(name);
//         if (e == null)
//             e = this;
//         ((EnvEx)e).putNew(name, value);
//     }
//     public Environment where(String name) {
//         if (values.get(name) != null)
//             return this;
//         else if (outer == null)
//             return null;
//         else
//             return ((EnvEx)outer).where(name);
//     }
// }


import stone.ClosureParser;
import stone.ParseException;
import chap6.BasicInterpreter;
import chap7.NestedEnv;
package chap8;

public class NativeInterpreter extends BasicInterpreter {
    public static void main(String[] args) throws ParseException {
        run(new ClosureParser(),
// Path: src/stone/ClosureParser.java
// public class ClosureParser extends FuncParser {
//     public ClosureParser() {
//         primary.insertChoice(rule(Fun.class)
//                                  .sep("fun").ast(paramList).ast(block));
//     }
// }
// 
// 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/chap6/BasicInterpreter.java
// public class BasicInterpreter {
//     public static void main(String[] args) throws ParseException {
//         run(new BasicParser(), new BasicEnv());
//     }
//     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)) {
//                 Object r = ((BasicEvaluator.ASTreeEx)t).eval(env);
//                 System.out.println("=> " + r);
//             }
//         }
//     }
// }
// 
// Path: src/chap7/NestedEnv.java
// public class NestedEnv implements Environment {
//     protected HashMap<String,Object> values;
//     protected Environment outer;
//     public NestedEnv() { this(null); }
//     public NestedEnv(Environment e) {
//         values = new HashMap<String,Object>();
//         outer = e;
//     }
//     public void setOuter(Environment e) { outer = e; }
//     public Object get(String name) {
//         Object v = values.get(name);
//         if (v == null && outer != null)
//             return outer.get(name);
//         else
//             return v;
//     }
//     public void putNew(String name, Object value) { values.put(name, value); }
//     public void put(String name, Object value) {
//         Environment e = where(name);
//         if (e == null)
//             e = this;
//         ((EnvEx)e).putNew(name, value);
//     }
//     public Environment where(String name) {
//         if (values.get(name) != null)
//             return this;
//         else if (outer == null)
//             return null;
//         else
//             return ((EnvEx)outer).where(name);
//     }
// }


// Path: src/chap8/NativeInterpreter.java
import stone.ClosureParser;
import stone.ParseException;
import chap6.BasicInterpreter;
import chap7.NestedEnv;

package chap8;

public class NativeInterpreter extends BasicInterpreter {
    public static void main(String[] args) throws ParseException {
        run(new ClosureParser(),
            new Natives().environment(new NestedEnv()));