From babae49de7b777a5847f277bb74c88e77c67568a Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 8 Jul 2006 00:48:46 -0400 Subject: [PATCH] checkpoint darcs-hash:20060708044846-5007d-d4ecd062cb56794d8959d48619996ab2ff2f4a8f.gz --- src/edu/berkeley/sbp/meta/MetaGrammar.java | 60 +------------ src/edu/berkeley/sbp/meta/MetaGrammarBindings.java | 94 ++++++++++++++++---- 2 files changed, 77 insertions(+), 77 deletions(-) diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java index 37edd7b..a1e37bf 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammar.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java @@ -172,8 +172,7 @@ public class MetaGrammar { public void toJava(StringBuffer sb) { sb.append("new MetaGrammar.TargetReducer(new int[] {"); - for(int i=0; i red = (Tree.TreeFunctor)t.head(); MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t.children()); - Context cx = new Context(g,rm); - Union u = null; - for(MetaGrammarBindings.NonTerminalNode nt : g.values()) { - Union el = (Union)cx.get(nt.name); - StringBuffer st = new StringBuffer(); - el.toString(st); - if (nt.name.equals(s)) u = el; - } - return u; + return g.build(s, rm); } - public static class Context { - public HashMap map = new HashMap(); - public MetaGrammarBindings.GrammarNode grammar; - public String cnt = null; - public GrammarBindingResolver rm; - public Context(MetaGrammarBindings.GrammarNode g, GrammarBindingResolver rm) { - this.grammar = g; - this.rm = rm; - } - public Union build() { - Union ret = null; - for(MetaGrammarBindings.NonTerminalNode nt : grammar.values()) { - Union u = get(nt.name); - if ("s".equals(nt.name)) - ret = u; - } - return ret; - } - public Context(Tree t, GrammarBindingResolver rm) { - this.rm = rm; - Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); - this.grammar = (MetaGrammarBindings.GrammarNode)red.invoke(t.children()); - } - public Union peek(String name) { return map.get(name); } - public void put(String name, Union u) { map.put(name, u); } - public Union get(String name) { - Union ret = map.get(name); - if (ret != null) return ret; - ret = new Union(name); - map.put(name, ret); - MetaGrammarBindings.NonTerminalNode nt = grammar.get(name); - if (nt==null) { - System.err.println("*** warning could not find " + name); - } else { - String old = cnt; - cnt = name; - nt.build(this, ret); - cnt = old; - } - return ret; - } - - } - /*private*/ static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } - /*private*/ static Atom infer(Topology t) { return new CharRange(new CharTopology(t)); } } diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index 37635a5..dc35dfc 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -21,11 +21,22 @@ public class MetaGrammarBindings { for(NonTerminalNode nt : values()) ret += nt + ", "; return ret + " ]"; } + public Union build(String s, GrammarBindingResolver rm) { + Context cx = new Context(this,rm); + Union u = null; + for(MetaGrammarBindings.NonTerminalNode nt : values()) { + Union el = (Union)cx.get(nt.name); + StringBuffer st = new StringBuffer(); + el.toString(st); + if (nt.name.equals(s)) u = el; + } + return u; + } } public abstract static class UnionNode extends ElementNode { public Seq[][] sequences; - public void build(MetaGrammar.Context cx, Union u) { + public void build(Context cx, Union u) { HashSet bad2 = new HashSet(); for(int i=0; i bad2 = new HashSet(); @@ -99,7 +110,7 @@ public class MetaGrammarBindings { public @bind.as("(") AnonUnionNode(Seq[][] sequences) { this.sequences = sequences; } - public Element build(MetaGrammar.Context cx) { + public Element build(Context cx) { Union ret = new Union(); build(cx, ret); return ret; @@ -112,28 +123,32 @@ public class MetaGrammarBindings { public char first; public char last; } + public static abstract class ElementNode { public String getLabel() { return null; } public String getOwnerTag() { return null; } public boolean drop() { return false; } - public abstract Element build(MetaGrammar.Context cx); + public abstract Element build(Context cx); } + public static class Drop extends ElementNode { public ElementNode e; public Drop(ElementNode e) { this.e = e; } public String getLabel() { return null; } public boolean drop() { return true; } public String getOwnerTag() { return e.getOwnerTag(); } - public Element build(MetaGrammar.Context cx) { return e.build(cx); } + public Element build(Context cx) { return e.build(cx); } } + public static class Label extends ElementNode { public String label; public ElementNode e; public Label(String label, ElementNode e) { this.e = e; this.label = label; } public String getLabel() { return label; } public String getOwnerTag() { return e.getOwnerTag(); } - public Element build(MetaGrammar.Context cx) { return e.build(cx); } + public Element build(Context cx) { return e.build(cx); } } + public static /*abstract*/ class Seq { HashSet and = new HashSet(); HashSet not = new HashSet(); @@ -171,7 +186,7 @@ public class MetaGrammarBindings { this.elements = elements; return this; } - public Sequence build(MetaGrammar.Context cx, Union u, boolean lame) { + public Sequence build(Context cx, Union u, boolean lame) { Sequence ret = build0(cx, lame || this.lame); for(Seq s : and) { Sequence dork = s.build(cx, u, true); ret = ret.and(dork); } for(Seq s : not) { Sequence dork = s.build(cx, u, true); ret = ret.not(dork); } @@ -179,7 +194,7 @@ public class MetaGrammarBindings { ret.lame = lame; return ret; } - public Sequence build0(MetaGrammar.Context cx, boolean lame) { + public Sequence build0(Context cx, boolean lame) { boolean dropAll = lame; if (tag!=null && "()".equals(tag)) dropAll = true; Object[] labels = new Object[elements.length]; @@ -227,7 +242,7 @@ public class MetaGrammarBindings { public static @bind.as("NonTerminalReference") class NonTerminalReferenceNode extends ElementNode { public @bind.arg String nonTerminal; - public Element build(MetaGrammar.Context cx) { return cx.get(nonTerminal); } + public Element build(Context cx) { return cx.get(nonTerminal); } } public static class Literal extends Constant { @@ -238,7 +253,7 @@ public class MetaGrammarBindings { public static class CharClass extends ElementNode { Range[] ranges; public @bind.as("[") CharClass(Range[] ranges) { this.ranges = ranges; } - public Element build(MetaGrammar.Context cx) { + public Element build(Context cx) { edu.berkeley.sbp.util.Range.Set set = new edu.berkeley.sbp.util.Range.Set(); for(Range r : ranges) set.add(r.first, r.last); @@ -248,7 +263,7 @@ public class MetaGrammarBindings { public static @bind.as("{") class XTree extends ElementNode { public @bind.arg Seq body; - public Element build(MetaGrammar.Context cx) { + public Element build(Context cx) { Union u = new Union(); Sequence s = body.build(cx, u, false); Union u2 = new Union(); @@ -268,7 +283,7 @@ public class MetaGrammarBindings { public boolean zero, many, max; public Rep(ElementNode e, ElementNode sep, boolean zero, boolean many, boolean max) { this.e = e; this.sep = sep; this.zero = zero; this.many = many; this.max = max;} - public Element build(MetaGrammar.Context cx) { + public Element build(Context cx) { return (!max) ? Sequence.repeat(e.build(cx), zero, many, sep==null ? null : sep.build(cx), cx.rm.repeatTag()) : sep==null @@ -279,12 +294,12 @@ public class MetaGrammarBindings { public static class Constant extends ElementNode { Element constant; public Constant(Element constant) { this.constant = constant; } - public Element build(MetaGrammar.Context cx) { return constant; } + public Element build(Context cx) { return constant; } } public abstract static class PostProcess extends ElementNode { ElementNode e; public PostProcess(ElementNode e) { this.e = e; } - public Element build(MetaGrammar.Context cx) { return postProcess(e.build(cx)); } + public Element build(Context cx) { return postProcess(e.build(cx)); } public abstract Element postProcess(Element e); } @@ -313,10 +328,6 @@ public class MetaGrammarBindings { return infer((Topology)Atom.toAtom(e).complement()); } }; } - public static @bind.as("^^") void doublecaret(final ElementNode e) { throw new Error("not implemented"); } - - //public static @bind.as("(") ElementNode subexpression(Seq[][] rhs) { return new NonTerminalNode(rhs); } - public static @bind.as("Word") String word(String s) { return s; } public static @bind.as("Quoted") String quoted(String s) { return s; } public static @bind.as("escaped") String c(char c) { return c+""; } @@ -326,4 +337,49 @@ public class MetaGrammarBindings { static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } static Atom infer(Topology t) { return new CharRange(new CharTopology(t)); } + + public static class Context { + public HashMap map = new HashMap(); + public GrammarNode grammar; + public String cnt = null; + public GrammarBindingResolver rm; + public Context(GrammarNode g, GrammarBindingResolver rm) { + this.grammar = g; + this.rm = rm; + } + public Union build() { + Union ret = null; + for(NonTerminalNode nt : grammar.values()) { + Union u = get(nt.name); + if ("s".equals(nt.name)) + ret = u; + } + return ret; + } + public Context(Tree t, GrammarBindingResolver rm) { + this.rm = rm; + Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); + this.grammar = (GrammarNode)red.invoke(t.children()); + } + public Union peek(String name) { return map.get(name); } + public void put(String name, Union u) { map.put(name, u); } + public Union get(String name) { + Union ret = map.get(name); + if (ret != null) return ret; + ret = new Union(name); + map.put(name, ret); + NonTerminalNode nt = grammar.get(name); + if (nt==null) { + System.err.println("*** warning could not find " + name); + } else { + String old = cnt; + cnt = name; + nt.build(this, ret); + cnt = old; + } + return ret; + } + + } + } -- 1.7.10.4