// Path: src/stone/FuncParser.java
// public class FuncParser extends BasicParser {
//     Parser param = rule().identifier(reserved);
//     Parser params = rule(ParameterList.class)
//                         .ast(param).repeat(rule().sep(",").ast(param));
//     Parser paramList = rule().sep("(").maybe(params).sep(")");
//     Parser def = rule(DefStmnt.class)
//                      .sep("def").identifier(reserved).ast(paramList).ast(block);
//     Parser args = rule(Arguments.class)
//                       .ast(expr).repeat(rule().sep(",").ast(expr));
//     Parser postfix = rule().sep("(").maybe(args).sep(")");
// 
//     public FuncParser() {
//         reserved.add(")");
//         primary.repeat(postfix);
//         simple.option(args);
//         program.insertChoice(def);
//     }
// }
// 
// 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);
//             }
//         }
//     }
// }


import stone.FuncParser;
import stone.ParseException;
import chap6.BasicInterpreter;
package chap7;

public class FuncInterpreter extends BasicInterpreter {
    public static void main(String[] args) throws ParseException {
// Path: src/stone/FuncParser.java
// public class FuncParser extends BasicParser {
//     Parser param = rule().identifier(reserved);
//     Parser params = rule(ParameterList.class)
//                         .ast(param).repeat(rule().sep(",").ast(param));
//     Parser paramList = rule().sep("(").maybe(params).sep(")");
//     Parser def = rule(DefStmnt.class)
//                      .sep("def").identifier(reserved).ast(paramList).ast(block);
//     Parser args = rule(Arguments.class)
//                       .ast(expr).repeat(rule().sep(",").ast(expr));
//     Parser postfix = rule().sep("(").maybe(args).sep(")");
// 
//     public FuncParser() {
//         reserved.add(")");
//         primary.repeat(postfix);
//         simple.option(args);
//         program.insertChoice(def);
//     }
// }
// 
// 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/FuncInterpreter.java
import stone.FuncParser;
import stone.ParseException;
import chap6.BasicInterpreter;

package chap7;

public class FuncInterpreter extends BasicInterpreter {
    public static void main(String[] args) throws ParseException {
        run(new FuncParser(), new NestedEnv());