// FIXME: print the input region that was ambiguously matched
StringBuffer sb = new StringBuffer();
sb.append("unresolved ambiguity at "+ambiguity.getRegion()+"; shared subtrees are shown as \"*\" ");
+ //sb.append("\noffending text: ");
for(Tree<?> result : ht) {
sb.append("\n possibility: ");
StringBuffer sb2 = new StringBuffer();
abstract StringBuffer toString(StringBuffer sb);
/** returns the Forest resulting from matching this element against the empty string */
- Forest<?> epsilonForm() { throw new Error("element " + this + " has no epsilon form"); }
+ Forest<?> epsilonForm(Input.Region loc) { throw new Error("element " + this + " has no epsilon form"); }
}
public void expand(HashSet<Tree<NodeType>> ht) { expand(ht, new HashSet<Forest<NodeType>>(), null); }
static <NodeType> Forest<NodeType> create(Input.Region loc, NodeType head, Forest<NodeType>[] children, boolean lift) {
+ if (loc == null) throw new Error();
return new One<NodeType>(loc, head, children, lift);
}
}
if (n==null) return;
Forest[] holder = new Forest[r.pos];
- if (r.pos==0) n.finish(r, r.zero(), n.phase());
+ if (r.pos==0) n.finish(r, r.zero(n.phase().getLocation().createRegion(n.phase().getLocation())), n.phase());
else n.reduce(r, r.pos-1, n.phase(), null);
} else {
if (r.pos<=0) throw new Error("called wrong form of reduce()");
Input.Location loc = input.getLocation();
Token tok = input.next();
GSS.Phase current = gss.new Phase<Token>(null, this, null, tok, loc, input.getLocation(), null);
- current.newNode(null, Forest.create(null, null, null, false), pt.start, true);
+ current.newNode(null, Forest.create(loc.createRegion(loc), null, null, false), pt.start, true);
int count = 1;
for(int idx=0;;idx++) {
Input.Location oldloc = loc;
// DO NOT MESS WITH THE FOLLOWING LINE!!!
private Forest.Many epsilonForm = null;
- Forest epsilonForm() {
+ Forest epsilonForm(Input.Region loc) {
if (epsilonForm!=null) return epsilonForm;
epsilonForm = new Forest.Many();
- epsilonForm.merge(firstp().rewrite(null, false));
+ epsilonForm.merge(firstp().rewrite(loc, false));
return epsilonForm;
}
class Position implements IntegerMappable {
private Forest zero = null;
- public Forest zero() {
+ public Forest zero(Input.Region reg) {
if (zero != null) return zero;
if (pos > 0) throw new Error();
- return zero = rewrite(null);
+ return zero = rewrite(reg);
}
final <T> Forest<T> rewrite(Input.Region loc) { return rewrite(loc, true); }
private final <T> Forest<T> rewrite(Input.Region loc, boolean epsilonCheck) {
- if (epsilonCheck && this==firstp()) return epsilonForm();
+ if (epsilonCheck && this==firstp()) return epsilonForm(loc);
for(int i=0; i<pos; i++) if (holder[i]==null) throw new Error("realbad " + i);
for(int i=pos; i<elements.length; i++) {
- if (holder[i]==null) holder[i] = elements[i].epsilonForm();
+ if (holder[i]==null) holder[i] = elements[i].epsilonForm(loc);
if (holder[i]==null) throw new Error("bad " + i);
}
Forest<T> ret = Sequence.this.postReduce(loc, holder, this);
// Epsilon Form //////////////////////////////////////////////////////////////////////////////
// FIXME
- private Forest.Many epsilonForm = null;
- Forest epsilonForm() {
- if (epsilonForm != null) return epsilonForm;
- epsilonForm = new Forest.Many();
+ //private Forest.Many epsilonForm = null;
+ Forest epsilonForm(Input.Region loc) {
+ //if (epsilonForm != null) return epsilonForm;
+ Forest.Many epsilonForm = new Forest.Many();
for(Sequence s : this) {
// FIXME FIXME FIXME
if (new Walk.Cache().possiblyEpsilon(s))
- epsilonForm.merge(s.epsilonForm());
+ epsilonForm.merge(s.epsilonForm(loc));
}
return epsilonForm;
}
}
protected abstract int bar(int c);
+ protected abstract int bop( );
}