// Path: src/stone/StoneException.java
// public class StoneException extends RuntimeException {
//     public StoneException(String m) { super(m); }
//     public StoneException(String m, ASTree t) {
//         super(m + " " + t.location());
//     }
// }
// 
// Path: src/chap11/Symbols.java
// public class Symbols {
//     public static class Location {
//         public int nest, index;
//         public Location(int nest, int index) {
//             this.nest = nest;
//             this.index = index;
//         }
//     }
//     protected Symbols outer;
//     protected HashMap<String,Integer> table;
//     public Symbols() { this(null); }
//     public Symbols(Symbols outer) {
//         this.outer = outer;
//         this.table = new HashMap<String,Integer>();
//     }
//     public int size() { return table.size(); }
//     public void append(Symbols s) { table.putAll(s.table); }
//     public Integer find(String key) { return table.get(key); }
//     public Location get(String key) { return get(key, 0); }
//     public Location get(String key, int nest) {
//         Integer index = table.get(key);
//         if (index == null)
//             if (outer == null)
//                 return null;
//             else
//                 return outer.get(key, nest + 1);
//         else
//             return new Location(nest, index.intValue());
//     }
//     public int putNew(String key) {
//         Integer i = find(key);
//         if (i == null)
//             return add(key);
//         else
//             return i;
//     }
//     public Location put(String key) {
//         Location loc = get(key, 0);
//         if (loc == null)
//             return new Location(0, add(key));
//         else
//             return loc;
//     }
//     protected int add(String key) {
//         int i = table.size();
//         table.put(key, i);
//         return i;
//     }
// }


import stone.StoneException;
import chap11.Symbols;
package chap12;

public class SymbolThis extends Symbols {
    public static final String NAME = "this";
    public SymbolThis(Symbols outer) {
        super(outer);
        add(NAME);
    }
    @Override public int putNew(String key) {
// Path: src/stone/StoneException.java
// public class StoneException extends RuntimeException {
//     public StoneException(String m) { super(m); }
//     public StoneException(String m, ASTree t) {
//         super(m + " " + t.location());
//     }
// }
// 
// Path: src/chap11/Symbols.java
// public class Symbols {
//     public static class Location {
//         public int nest, index;
//         public Location(int nest, int index) {
//             this.nest = nest;
//             this.index = index;
//         }
//     }
//     protected Symbols outer;
//     protected HashMap<String,Integer> table;
//     public Symbols() { this(null); }
//     public Symbols(Symbols outer) {
//         this.outer = outer;
//         this.table = new HashMap<String,Integer>();
//     }
//     public int size() { return table.size(); }
//     public void append(Symbols s) { table.putAll(s.table); }
//     public Integer find(String key) { return table.get(key); }
//     public Location get(String key) { return get(key, 0); }
//     public Location get(String key, int nest) {
//         Integer index = table.get(key);
//         if (index == null)
//             if (outer == null)
//                 return null;
//             else
//                 return outer.get(key, nest + 1);
//         else
//             return new Location(nest, index.intValue());
//     }
//     public int putNew(String key) {
//         Integer i = find(key);
//         if (i == null)
//             return add(key);
//         else
//             return i;
//     }
//     public Location put(String key) {
//         Location loc = get(key, 0);
//         if (loc == null)
//             return new Location(0, add(key));
//         else
//             return loc;
//     }
//     protected int add(String key) {
//         int i = table.size();
//         table.put(key, i);
//         return i;
//     }
// }


// Path: src/chap12/SymbolThis.java
import stone.StoneException;
import chap11.Symbols;

package chap12;

public class SymbolThis extends Symbols {
    public static final String NAME = "this";
    public SymbolThis(Symbols outer) {
        super(outer);
        add(NAME);
    }
    @Override public int putNew(String key) {
        throw new StoneException("fatal");