From 013262fd96a3dfc4c2cd7a0ba320dd7981ce678c Mon Sep 17 00:00:00 2001 From: adam Date: Sun, 27 May 2007 19:27:30 -0400 Subject: [PATCH] GrammarAST: remove BracedNode, refactor, remove getOwnerTag() darcs-hash:20070527232730-5007d-275023fb0288c1072a36486d8e10c85b1cc18236.gz --- src/edu/berkeley/sbp/meta/GrammarAST.java | 73 ++++++++++------------------- 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/src/edu/berkeley/sbp/meta/GrammarAST.java b/src/edu/berkeley/sbp/meta/GrammarAST.java index 87f7789..05c7b39 100644 --- a/src/edu/berkeley/sbp/meta/GrammarAST.java +++ b/src/edu/berkeley/sbp/meta/GrammarAST.java @@ -17,6 +17,14 @@ import java.io.*; public class GrammarAST { /** + * Returns a Union representing the metagrammar (meta.g); the Tree produced by + * parsing with this Union should be provided to buildFromAST + */ + public static Union getMetaGrammar() { + return MetaGrammar.newInstance(); + } + + /** * Create a grammar from a parse tree and binding resolver * * @param t a tree produced by parsing a grammar using the metagrammar @@ -27,10 +35,6 @@ public class GrammarAST { return new GrammarAST(includes, "").buildGrammar(grammarAST, startingNonterminal); } - public static Union getMetaGrammar() { - return MetaGrammar.newInstance(); - } - private static Object illegalTag = ""; // this is the tag that should never appear in the non-dropped output FIXME // Instance ////////////////////////////////////////////////////////////////////////////// @@ -88,7 +92,6 @@ public class GrammarAST { if (head.equals("Elements")) return new Seq((ElementNode[])Reflection.rebuild(walkChildren(t), ElementNode[].class)); if (head.equals("NonTerminalReference")) return new ReferenceNode(stringifyChildren(t.child(0))); if (head.equals(")")) return new ReferenceNode(stringifyChildren(t.child(0)), true); - if (head.equals("{")) return new BracedNode(walkSeq(t.child(0))); if (head.equals("::")) return walkSeq(t.child(1)).tag(walkString(t.child(0))); if (head.equals("...")) return new DropNode(new RepeatNode(new TildeNode(new AtomNode()), null, true, true, false)); @@ -111,8 +114,8 @@ public class GrammarAST { if (head.equals("DropNT")) return new NonTerminalNode(walkString(t.child(0)), (Seq[][])walkChildren(t.child(1)), false, null, true); if (head.equals("=")) return new NonTerminalNode(walkString(t.child(0)), (Seq[][])walk(t.child(2)), true, t.size()==2 ? null : walkString(t.child(1)), false); - if (head.equals("&")) return and2(walkSeq(t.child(0)), walkSeq(t.child(1))); - if (head.equals("&~")) return andnot2(walkSeq(t.child(0)), walkSeq(t.child(1))); + if (head.equals("&")) return walkSeq(t.child(0)).and(walkSeq(t.child(1))); + if (head.equals("&~")) return walkSeq(t.child(0)).andnot(walkSeq(t.child(1))); if (head.equals("/")) return (walkSeq(t.child(0))).separate(walkElement(t.child(1))); if (head.equals("()")) return new LiteralNode(""); if (head.equals("[")) return new AtomNode((char[][])Reflection.rebuild(walkChildren(t), char[][].class)); @@ -204,6 +207,15 @@ public class GrammarAST { } } + private abstract class ElementNode { + public boolean lifted = false; + public Seq ownerSeq = null; + public ElementNode lifted() { this.lifted = true; return this; } + public boolean drop(Context cx) { return false; } + public Atom toAtom(Context cx) { throw new Error("can't convert a " + this.getClass().getName() + " to an atom: " + this); } + public abstract Element build(Context cx, NonTerminalNode cnt, boolean dropall); + } + private class UnionNode extends ElementNode { public Seq[][] sequences; public String sep = null; @@ -331,8 +343,8 @@ public class GrammarAST { } public Seq tag(String tag) { this.tag = tag; return this; } public Seq follow(ElementNode follow) { this.follow = follow; return this; } - public Seq and(Seq s) { and.add(s); return this; } - public Seq andnot(Seq s) { not.add(s); return this; } + public Seq and(Seq s) { and.add(s); s.alwaysDrop = true; return this; } + public Seq andnot(Seq s) { not.add(s); s.alwaysDrop = true; return this; } public Seq separate(ElementNode sep) { ElementNode[] elements = new ElementNode[this.elements.length * 2 - 1]; for(int i=0; i