// Path: src/main/java/litil/TypeScope.java
// public class TypeScope {
// 
//     private final Map<String, Type> scope;
//     private final TypeScope parent;
// 
//     private TypeScope(TypeScope parent, Map<String, Type> scope) {
//         this.parent = parent;
//         this.scope = scope;
//     }
// 
//     public TypeScope(TypeScope parent) {
//         this(parent, new HashMap<String, Type>());
//     }
// 
//     public TypeScope() {
//         this(null, new HashMap<String, Type>());
//     }
// 
//     public void define(String name, Type type) {
//         scope.put(name, type);
//     }
// 
//     public Type get(String name) {
//         Type res = scope.get(name);
//         if (res == null && parent != null) {
//             res = parent.get(name);
//         }
//         return res;
//     }
// 
//     public TypeScope child() {
//         return new TypeScope(this);
//     }
// 
//     @Override
//     public String toString() {
//         return scope + (parent == null ? "-|" : "->" + parent);
//     }
// }
// 
// Path: src/main/java/litil/Utils.java
// public class Utils {
//     public static String tab(int depth) {
//         return ntimes(depth, "\t");
//     }
// 
//     public static String ntimes(int count, String s) {
//         StringBuilder res = new StringBuilder("");
//         for (int i = 0; i < count; i++) {
//             res.append(s);
//         }
// 
//         return res.toString();
//     }
// 
//     public static PrintStream indenting(String pkg) {
//         return new PrintStream(System.out) {
//             @Override
//             public void println(String s) {
//                 super.println(s);
//             }
//         };
//     }
// }


import litil.TypeScope;
import litil.Utils;
import java.util.List;
import java.util.Map;

    public static final class EAccessor extends Expr {
        public final Expr obj;
        public final String field;

        public EAccessor(Expr obj, String field) {
            this.obj = obj;
            this.field = field;
        }

        @Override
        public String repr(int indent) {
            return Utils.tab(indent) + obj.repr(0) + "." + field;
        }

        @Override
        public String toString() {
            return repr(0);
        }
    }

    public static final class ENum extends Expr {
        public final long value;

        public ENum(long value) {
            this.value = value;
        }

        @Override
        public String repr(int indent) {
// Path: src/main/java/litil/TypeScope.java
// public class TypeScope {
// 
//     private final Map<String, Type> scope;
//     private final TypeScope parent;
// 
//     private TypeScope(TypeScope parent, Map<String, Type> scope) {
//         this.parent = parent;
//         this.scope = scope;
//     }
// 
//     public TypeScope(TypeScope parent) {
//         this(parent, new HashMap<String, Type>());
//     }
// 
//     public TypeScope() {
//         this(null, new HashMap<String, Type>());
//     }
// 
//     public void define(String name, Type type) {
//         scope.put(name, type);
//     }
// 
//     public Type get(String name) {
//         Type res = scope.get(name);
//         if (res == null && parent != null) {
//             res = parent.get(name);
//         }
//         return res;
//     }
// 
//     public TypeScope child() {
//         return new TypeScope(this);
//     }
// 
//     @Override
//     public String toString() {
//         return scope + (parent == null ? "-|" : "->" + parent);
//     }
// }
// 
// Path: src/main/java/litil/Utils.java
// public class Utils {
//     public static String tab(int depth) {
//         return ntimes(depth, "\t");
//     }
// 
//     public static String ntimes(int count, String s) {
//         StringBuilder res = new StringBuilder("");
//         for (int i = 0; i < count; i++) {
//             res.append(s);
//         }
// 
//         return res.toString();
//     }
// 
//     public static PrintStream indenting(String pkg) {
//         return new PrintStream(System.out) {
//             @Override
//             public void println(String s) {
//                 super.println(s);
//             }
//         };
//     }
// }


// Path: src/main/java/litil/ast/Expr.java
import litil.TypeScope;
import litil.Utils;
import java.util.List;
import java.util.Map;


    public static final class EAccessor extends Expr {
        public final Expr obj;
        public final String field;

        public EAccessor(Expr obj, String field) {
            this.obj = obj;
            this.field = field;
        }

        @Override
        public String repr(int indent) {
            return Utils.tab(indent) + obj.repr(0) + "." + field;
        }

        @Override
        public String toString() {
            return repr(0);
        }
    }

    public static final class ENum extends Expr {
        public final long value;

        public ENum(long value) {
            this.value = value;
        }

        @Override
        public String repr(int indent) {
            return Utils.tab(indent) + value;