public abstract class Atom<T> extends Element implements Topology<T> {
protected abstract Topology<T> top();
- public abstract String toString();
+ public abstract String toString();
public StringBuffer toString(StringBuffer sb) { sb.append(this); return sb; }
// Topology Thunks //////////////////////////////////////////////////////////////////////////////
public int hashCode() { return top().hashCode(); }
public boolean equals(Object o) { return o != null && o instanceof Atom && ((Atom)o).top().equals(top()); }
- // Subclasses //////////////////////////////////////////////////////////////////////////////
-
-
+ /** if all expressions matching <tt>e</tt> are exactly one token
+ * long, <b>attempt to</b> return an Atom representing that token
+ * (undecidable in general; only works in trivial cases)
+ */
public static Topology toAtom(Element e) {
if (e instanceof Atom) return (Atom)e;
if (e instanceof Sequence) return ((Sequence)e).toAtom();
public interface Input<Token> {
/** returns the token just beyond the current location and advances beyond it */
- public Token next(int numstates, int resets, int waits) throws IOException;
+ public Token next() throws IOException;
/** returns the location the input stream is currently at */
public Location getLocation();
public Forest<Result> parse(Input<Tok> input) throws IOException, ParseFailed {
GSS gss = new GSS();
Input.Location loc = input.getLocation();
- GSS.Phase current = gss.new Phase<Tok>(null, this, null, input.next(1, 0, 0), loc, null);
+ GSS.Phase current = gss.new Phase<Tok>(null, this, null, input.next(), loc, null);
current.newNode(null, Forest.leaf(null, null, null), pt.start, true);
int count = 1;
for(;;) {
loc = input.getLocation();
current.reduce();
Forest forest = current.token==null ? null : shiftToken((Tok)current.token, loc);
- GSS.Phase next = gss.new Phase<Tok>(current, this, current, input.next(count, gss.resets, gss.waits), loc, forest);
+ GSS.Phase next = gss.new Phase<Tok>(current, this, current, input.next(), loc, forest);
count = next.size();
if (current.isDone()) return (Forest<Result>)gss.finalResult;
current = next;
+
// DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "=", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })}),
new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "psx", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "ps", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "!", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "nonTerminal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }),
+
boolean indenting = true;
int indentation = 0;
private ArrayList<Integer> istack = new ArrayList<Integer>();
- public Character next(int numstates, int resets, int waits) throws IOException {
- Character ret = nextc(numstates, resets);
+ public Character next() throws IOException {
+ Character ret = nextc();
if (ret==null) return null;
else if (ret==left) System.out.print("\033[31m{\033[0m");
else if (ret==right) System.out.print("\033[31m}\033[0m");
}
Character waitingBrace = null;
- public Character nextc(int numstates, int resets) throws IOException {
+ public Character nextc() throws IOException {
char c;
if (waitingBrace != null) {
Character ret = waitingBrace;
}
if (indenting) {
if (c==' ') { indentation++; return done(c); }
- if (c=='\n') { indentation = 0; if (blank) return nextc(numstates, resets); blank = true; waiting = true; waitingChar='\n'; return '\n'; }
+ if (c=='\n') { indentation = 0; if (blank) return nextc(); blank = true; waiting = true; waitingChar='\n'; return '\n'; }
int last = istack.size()==0 ? -1 : istack.get(istack.size()-1);
if (indentation==last) {
if (blank) {