X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;fp=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;h=835d79e4bc45461984e2d023258338aeb5e4f9a9;hp=3dd08792a0f3f8c6c7b3ce93ea6277525fb2669b;hb=23091054a6842031d168c2628216c2310149cc5d;hpb=82f9b8d4a2fadb14cb004e5cc9f14944458f2e6c diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index 3dd0879..835d79e 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -64,6 +64,13 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public abstract static class UnionNode extends ElementNode { public Seq[][] sequences; + public Atom toAtom(Context cx) { + Atom ret = null; + for(Seq[] ss : sequences) + for(Seq s : ss) + ret = ret==null ? s.toAtom(cx) : infer(ret.union(s.toAtom(cx))); + return ret; + } public void build(Context cx, Union u, NonTerminalNode cnt) { HashSet bad2 = new HashSet(); for(int i=0; i") Seq arrow(Seq s, ElementNode e) { return s.follow(e); } - public static @bind.as("::") Seq tag(String tagname, Seq s) { return s.tag(tagname); } - public static @bind.as("/") Seq slash(Seq s, ElementNode e) { return s.separate(e); } + public static @bind.as("&") Seq and2(Seq s, Seq a) { return s.and(a); } + public static @bind.as("&~") Seq andnot2(Seq s, Seq a) { return s.andnot(a); } + public static @bind.as("->") Seq arrow(Seq s, ElementNode e) { return s.follow(e); } + public static @bind.as("::") Seq tag(String tagname, Seq s) { return s.tag(tagname); } + public static @bind.as("/") Seq slash(Seq s, ElementNode e) { return s.separate(e); } public static Seq seq(ElementNode[] elements) { return new Seq(elements); } public static @bind.as("Elements") Seq seq2(ElementNode[] elements) { return new Seq(elements); } @@ -276,6 +290,9 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public @bind.as("NonTerminalReference") NonTerminalReferenceNode(String nonTerminal) { this.nonTerminal = prefix + nonTerminal; } + public Atom toAtom(Context cx) { + return cx.grammar.get(nonTerminal).toAtom(cx); + } public Element build(Context cx, NonTerminalNode cnt) { if (!this.nonTerminal.startsWith(prefix)) nonTerminal = prefix + nonTerminal; Element ret = cx.get(nonTerminal); @@ -285,13 +302,29 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { } public static class Literal extends Constant { - public @bind Literal(@bind.arg String string) { super(CharAtom.string(string)); } + private String string; + public @bind Literal(@bind.arg String string) { + super(CharAtom.string(string)); + this.string = string; + } public boolean drop() { return true; } + public Atom toAtom(Context cx) { + if (string.length()!=1) return super.toAtom(cx); + edu.berkeley.sbp.util.Range.Set set = new edu.berkeley.sbp.util.Range.Set(); + set.add(string.charAt(0), string.charAt(0)); + return CharAtom.set(set); + } } public static class CharClass extends ElementNode { Range[] ranges; public @bind.as("[") CharClass(Range[] ranges) { this.ranges = ranges; } + public Atom toAtom(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); + return CharAtom.set(set); + } public Element build(Context cx, NonTerminalNode cnt) { edu.berkeley.sbp.util.Range.Set set = new edu.berkeley.sbp.util.Range.Set(); for(Range r : ranges) @@ -322,12 +355,16 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { 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 Atom toAtom(Context cx) { + if (sep != null) return super.toAtom(cx); + return e.toAtom(cx); + } public Element build(Context cx, NonTerminalNode cnt) { return (!max) ? Sequence.repeat(e.build(cx, null), zero, many, sep==null ? null : sep.build(cx, null), cx.rm.repeatTag()) : sep==null - ? Sequence.repeatMaximal(infer(e.build(cx, null)), zero, many, cx.rm.repeatTag()) - : Sequence.repeatMaximal(e.build(cx, null), zero, many, infer(sep.build(cx, null)), cx.rm.repeatTag()); + ? Sequence.repeatMaximal(e.toAtom(cx), zero, many, cx.rm.repeatTag()) + : Sequence.repeatMaximal(e.build(cx, null), zero, many, sep.toAtom(cx), cx.rm.repeatTag()); } } @@ -362,9 +399,12 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { } public static @bind.as("~") ElementNode tilde(final ElementNode e) { - return new PostProcess(e) { - public Element postProcess(Element e) { - return infer((Topology)Atom.toAtom(e).complement().minus(CharAtom.braces)); + return new ElementNodeWrapper(e) { + public Atom toAtom(Context cx) { + return infer((Topology)e.toAtom(cx).complement().minus(CharAtom.braces)); + } + public Element build(Context cx, NonTerminalNode cnt) { + return infer((Topology)e.toAtom(cx).complement().minus(CharAtom.braces)); } }; } public static @bind.as("Word") String word(String s) { return s; } @@ -374,7 +414,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public static @bind.as("\n") String retur() { return "\n"; } public static @bind.as("\r") String lf() { return "\r"; } - static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } + //static Atom infer(Element e) { return infer((Topology)Atom.toAtom(e)); } static Atom infer(Topology t) { return new CharAtom(new CharTopology(t)); } public static class Context { @@ -425,6 +465,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public String getLabel() { return null; } public String getOwnerTag() { return null; } public boolean drop() { return false; } + public Atom toAtom(Context cx) { throw new Error("can't convert a " + this.getClass().getName() + " to an atom"); } public abstract Element build(Context cx, NonTerminalNode cnt); } @@ -434,6 +475,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public String getLabel() { return _e.getLabel(); } public String getOwnerTag() { return _e.getOwnerTag(); } public boolean drop() { return _e.drop(); } + public Atom toAtom(Context cx) { return _e.toAtom(cx); } public Element build(Context cx, NonTerminalNode cnt) { return _e.build(cx, cnt); } } @@ -441,10 +483,13 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { Element constant; public Constant(Element constant) { this.constant = constant; } public Element build(Context cx, NonTerminalNode cnt) { return constant; } + public Atom toAtom(Context cx) { + if (constant instanceof Atom) return ((Atom)constant); + return super.toAtom(cx); + } } public abstract static class PostProcess extends ElementNodeWrapper { - ElementNode e; 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); @@ -460,4 +505,11 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public Label(String label, ElementNode e) { super(e); this.label = label; } public String getLabel() { return label; } } + + static class Invert extends Atom { + private final Atom a; + public Invert(Atom a) { this.a = a; } + public Topology top() { return a.complement(); } + public String toString() { return "~"+a; } + } }