// Path: src/stone/Parser.java
// public static Parser rule() { return rule(null); }
// 
// Path: src/stone/ast/ParameterList.java
// public class ParameterList extends ASTList {
//     public ParameterList(List<ASTree> c) { super(c); }
//     public String name(int i) { return ((ASTLeaf)child(i)).token().getText(); }
//     public int size() { return numChildren(); }
// }
// 
// Path: src/stone/ast/Arguments.java
// public class Arguments extends Postfix {
//     public Arguments(List<ASTree> c) { super(c); }
//     public int size() { return numChildren(); }
// }
// 
// Path: src/stone/ast/DefStmnt.java
// public class DefStmnt extends ASTList {
//     public DefStmnt(List<ASTree> c) { super(c); }
//     public String name() { return ((ASTLeaf)child(0)).token().getText(); }
//     public ParameterList parameters() { return (ParameterList)child(1); }
//     public BlockStmnt body() { return (BlockStmnt)child(2); } 
//     public String toString() {
//         return "(def " + name() + " " + parameters() + " " + body() + ")";
//     }
// }


import static stone.Parser.rule;
import stone.ast.ParameterList;
import stone.ast.Arguments;
import stone.ast.DefStmnt;
package stone;

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(")");
// Path: src/stone/Parser.java
// public static Parser rule() { return rule(null); }
// 
// Path: src/stone/ast/ParameterList.java
// public class ParameterList extends ASTList {
//     public ParameterList(List<ASTree> c) { super(c); }
//     public String name(int i) { return ((ASTLeaf)child(i)).token().getText(); }
//     public int size() { return numChildren(); }
// }
// 
// Path: src/stone/ast/Arguments.java
// public class Arguments extends Postfix {
//     public Arguments(List<ASTree> c) { super(c); }
//     public int size() { return numChildren(); }
// }
// 
// Path: src/stone/ast/DefStmnt.java
// public class DefStmnt extends ASTList {
//     public DefStmnt(List<ASTree> c) { super(c); }
//     public String name() { return ((ASTLeaf)child(0)).token().getText(); }
//     public ParameterList parameters() { return (ParameterList)child(1); }
//     public BlockStmnt body() { return (BlockStmnt)child(2); } 
//     public String toString() {
//         return "(def " + name() + " " + parameters() + " " + body() + ")";
//     }
// }


// Path: src/stone/FuncParser.java
import static stone.Parser.rule;
import stone.ast.ParameterList;
import stone.ast.Arguments;
import stone.ast.DefStmnt;

package stone;

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)