public class MetaGrammar extends StringWalker {
- boolean forceDrop = false;
-
public static class Hack<T extends Input> extends Atom<T> {
private final Atom<T> a;
static final Topology leftright = CharRange.rightBrace.union(CharRange.leftBrace);
else if (")".equals(head)) return SELF;
else if ("psx".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence();
else if ("nonTerminal".equals(head)) return getNonTerminal(string(tree.child(0)));
- else if ("::=".equals(head)) {
- forceDrop = false;
- return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false);
- }
- else if ("!::=".equals(head)) {
- forceDrop = true;
- Object ret = nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, true);
- forceDrop = false;
- return ret;
- }
+ else if ("::=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false);
else if ("(".equals(head)) return buildUnion((Sequence[][])walk(tree, 0));
else if ("literal".equals(head)) { Element ret = string(string(tree.child(0))); dropAll.add(ret); return ret; }
else if ("-".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,1).toString().charAt(0));
else if ("range".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,0).toString().charAt(0));
else if ("gram".equals(head)) return walk(tree, 0);
- else if ("=>".equals(head)) {
- PreSequence p = (PreSequence)walk(tree, 0);
- p.tag = string(tree.child(1));
- return p.buildSequence(null, false, "()".equals(p.tag));
- }
+ else if ("=>".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence(null, false, string(tree.child(1)));
else if ("[]".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.unwrap = true; return p; }
else if ("psy".equals(head)) return (PreSequence)walk(tree, 0);
else if ("->".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.noFollow = (Element)walk(tree, 1); return p; }
}
public Union buildUnion() { return buildUnion("???"); }
public boolean unwrap = false;
- public Sequence buildSequence() { return buildSequence(null, false, forceDrop); }
+ public Sequence buildSequence() { return buildSequence(null, false, false); }
public Sequence buildSequence(Union u) { return buildSequence(u, false, false); }
+ public Sequence buildSequence(Union u, boolean lame, String tag) {
+ this.tag = tag;
+ return buildSequence(u, lame, "()".equals(tag));
+ }
public Sequence buildSequence(Union u, boolean lame, boolean dropAll) {
if (u!=null) {
for(Sequence s : and) u.add(s);