X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;h=3dd08792a0f3f8c6c7b3ce93ea6277525fb2669b;hp=ecde37241de91b71b6b0bd80c64bc3fba955a1eb;hb=189d68c64f7aaec90b7cdef0fb2c358fe4f0dd21;hpb=b1a5513197f7c776706fd5b5618574906f72b707 diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index ecde372..3dd0879 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -10,13 +10,15 @@ import java.lang.reflect.*; import java.io.*; /** The java classes typically used to represent a parsed grammar AST; each inner class is a type of AST node. */ -public class MetaGrammarBindings { +public class MetaGrammarBindings extends AnnotationGrammarBindings { + + public MetaGrammarBindings() { super(MetaGrammarBindings.class); } // FIXME ugly ugly ugly scary dangerous public static String prefix = ""; /** A grammar (a set of nonterminals) */ - public static class GrammarNode extends HashMap implements NonTerminalSource { + public static class GrammarNode extends HashMap { public NonTerminalNode[] getNonTerminals() { return (NonTerminalNode[])values().toArray(new NonTerminalNode[0]); } @@ -28,9 +30,7 @@ public class MetaGrammarBindings { this.put(nt.name, nt); } } - public @bind.as("Grammar") GrammarNode(Object[] nt) { - add(nt); - } + public @bind.as("Grammar") GrammarNode(Object[] nt) { add(nt); } private void add(Object[] obs) { for(Object o : obs) { if (o==null) continue; @@ -41,7 +41,7 @@ public class MetaGrammarBindings { throw new RuntimeException("duplicate definition of nonterminal \""+nt.name+"\""); this.put(nt.name, nt); } - else if (o instanceof NonTerminalSource) add(((NonTerminalSource)o).getNonTerminals()); + else if (o instanceof GrammarNode) add(((GrammarNode)o).getNonTerminals()); } } public String toString() { @@ -89,11 +89,10 @@ public class MetaGrammarBindings { if (as==null) as = ""; else if ("".equals(as)) { } else as = as +"."; - - System.err.println("#import " + fileName + " as " + as); + try { Tree t = new CharParser(MetaGrammar.newInstance()).parse(new FileInputStream("tests/"+fileName)).expand1(); - Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); + TreeFunctor red = (TreeFunctor)t.head(); String oldprefix = prefix; prefix = as; GrammarNode gn = (GrammarNode)red.invoke(t); @@ -105,22 +104,19 @@ public class MetaGrammarBindings { } } - public static interface NonTerminalSource { - public NonTerminalNode[] getNonTerminals(); - } - - public static class NonTerminalNode extends UnionNode implements NonTerminalSource { + public static class NonTerminalNode extends UnionNode { public boolean rep; public String name = null; public String sep = null; public NonTerminalNode[] getNonTerminals() { return new NonTerminalNode[] { this }; } - public @bind.as("NonTerminal") NonTerminalNode(@bind.arg String name, @bind.arg Seq[][] sequences) { this(name, sequences, false); } + public @bind.as("NonTerminal") NonTerminalNode(@bind.arg String name, @bind.arg Seq[][] sequences) { + this(name, sequences, false); } public NonTerminalNode(String name, Seq[][] sequences, boolean rep) { this(name, sequences, rep, null); } public NonTerminalNode(String name, Seq[][] sequences, boolean rep, String sep) { this.name = prefix + name; this.sequences = sequences; this.rep = rep; - this.sep = prefix + sep; + this.sep = sep==null?null:(prefix + sep); } public Element build(Context cx, NonTerminalNode cnt) { return cx.get(name); } public void build(Context cx, Union u, NonTerminalNode cnt) { @@ -129,7 +125,10 @@ public class MetaGrammarBindings { Union urep = new Union(); urep.add(Sequence.empty); - urep.add(Sequence.singleton(new Element[] { cx.get(sep), u }, 1)); + if (sep != null) + urep.add(Sequence.singleton(new Element[] { cx.get(sep), u }, 1)); + else + urep.add(Sequence.singleton(new Element[] { u }, 0)); for(int i=0; i)Atom.toAtom(e).complement().minus(CharRange.braces)); + return infer((Topology)Atom.toAtom(e).complement().minus(CharAtom.braces)); } }; } public static @bind.as("Word") String word(String s) { return s; } @@ -372,7 +375,7 @@ public class MetaGrammarBindings { public static @bind.as("\r") String lf() { return "\r"; } static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } - static Atom infer(Topology t) { return new CharRange(new CharTopology(t)); } + static Atom infer(Topology t) { return new CharAtom(new CharTopology(t)); } public static class Context { public HashMap map = new HashMap(); @@ -394,7 +397,7 @@ public class MetaGrammarBindings { } public Context(Tree t, Grammar.Bindings rm) { this.rm = rm; - Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); + TreeFunctor red = (TreeFunctor)t.head(); this.grammar = (GrammarNode)red.invoke(t); } public Union peek(String name) { return map.get(name); } @@ -406,7 +409,6 @@ public class MetaGrammarBindings { map.put(name, ret); NonTerminalNode nt = grammar.get(name); if (nt==null) { - //System.err.println("*** warning could not find " + name); throw new Error("warning could not find " + name); } else { String old = cnt; @@ -419,39 +421,43 @@ public class MetaGrammarBindings { } + public static abstract class ElementNode { + public String getLabel() { return null; } + public String getOwnerTag() { return null; } + public boolean drop() { return false; } + public abstract Element build(Context cx, NonTerminalNode cnt); + } + + public static abstract class ElementNodeWrapper extends ElementNode { + protected ElementNode _e; + public ElementNodeWrapper(ElementNode e) { this._e = e; } + public String getLabel() { return _e.getLabel(); } + public String getOwnerTag() { return _e.getOwnerTag(); } + public boolean drop() { return _e.drop(); } + public Element build(Context cx, NonTerminalNode cnt) { return _e.build(cx, cnt); } + } + public static class Constant extends ElementNode { Element constant; public Constant(Element constant) { this.constant = constant; } public Element build(Context cx, NonTerminalNode cnt) { return constant; } } - public abstract static class PostProcess extends ElementNode { + + public abstract static class PostProcess extends ElementNodeWrapper { ElementNode e; - public PostProcess(ElementNode e) { this.e = e; } - public Element build(Context cx, NonTerminalNode cnt) { return postProcess(e.build(cx, cnt)); } + public PostProcess(ElementNode e) { super(e); } + public Element build(Context cx, NonTerminalNode cnt) { return postProcess(_e.build(cx, cnt)); } public abstract Element postProcess(Element e); } - public static abstract class ElementNode { - public String getLabel() { return null; } - public String getOwnerTag() { return null; } - public boolean drop() { return false; } - public abstract Element build(Context cx, NonTerminalNode cnt); - } - public static class Drop extends ElementNode { - public ElementNode e; - public Drop(ElementNode e) { this.e = e; } - public String getLabel() { return null; } + public static class Drop extends ElementNodeWrapper { + public Drop(ElementNode e) { super(e); } public boolean drop() { return true; } - public String getOwnerTag() { return e.getOwnerTag(); } - public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); } } - public static class Label extends ElementNode { + public static class Label extends ElementNodeWrapper { public String label; - public ElementNode e; - public Label(String label, ElementNode e) { this.e = e; this.label = label; } + public Label(String label, ElementNode e) { super(e); this.label = label; } public String getLabel() { return label; } - public String getOwnerTag() { return e.getOwnerTag(); } - public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); } } }