X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=bdb80967ec27973363b4e9bc539165cbae1ca991;hp=378a53c1250cb0c57d47d2c1051694fb341675c1;hb=fa858dc4acddd3e32126ff2558e0860315a84758;hpb=944848ba21df8673ba812a764fc641d7fbaea54c diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 378a53c..bdb8096 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -7,6 +7,22 @@ import java.io.*; public class MetaGrammar extends StringWalker { + /** an atom which tracks the possible tokenset of some element, provided that element can only match single-token sequences */ + static class Infer extends Atom { + private final Element e; + public Infer(Element e) { this.e = e; } + public Topology top() { return (Topology)toAtom(e); } + public String toString() { return e.toString(); } + } + + /** an atom which tracks the inverse of some other atom */ + 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; } + } + public static class Hack extends Atom { private final Atom a; static final Topology leftright = CharRange.rightBrace.union(CharRange.leftBrace); @@ -115,14 +131,14 @@ public class MetaGrammar extends StringWalker { if ("\\n".equals(head)) return new Character('\n'); else if ("\\r".equals(head)) return new Character('\r'); else if ("grammar".equals(head)) { for(Tree t : tree.children()) walk(t); return this; } - else if ("*".equals(head)) return Repeat.many0((Element)walk(tree.child(0)), repeatTag()); - else if ("+".equals(head)) return Repeat.many1((Element)walk(tree.child(0)), repeatTag()); - else if ("+/".equals(head)) return Repeat.many1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); - else if ("*/".equals(head)) return Repeat.many0((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); - else if ("++/".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); - else if ("**".equals(head)) return Repeat.maximal0((Element)walk(tree.child(0)), repeatTag()); - else if ("++".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0)), repeatTag()); - else if ("?".equals(head)) return Repeat.maybe((Element)walk(tree.child(0)), repeatTag()); + else if ("*".equals(head)) return Sequence.many0((Element)walk(tree.child(0)), repeatTag()); + else if ("+".equals(head)) return Sequence.many1((Element)walk(tree.child(0)), repeatTag()); + else if ("+/".equals(head)) return Sequence.many1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); + else if ("*/".equals(head)) return Sequence.many0((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); + else if ("++/".equals(head)) return Sequence.maximal1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); + else if ("**".equals(head)) return Sequence.maximal0((Element)walk(tree.child(0)), repeatTag()); + else if ("++".equals(head)) return Sequence.maximal1((Element)walk(tree.child(0)), repeatTag()); + else if ("?".equals(head)) return Sequence.maybe((Element)walk(tree.child(0)), repeatTag()); else if ("!".equals(head)) { Element e = (Element)walk(tree.child(0)); dropAll.add(e); return e; } else if ("&".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true)); else if ("and".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true)); @@ -153,7 +169,7 @@ public class MetaGrammar extends StringWalker { else if ("->".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.noFollow = (Element)walk(tree, 1); return p; } else if ("/".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1)); else if (" /".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1)); - else if ("~".equals(head)) return new Hack(new Atom.Invert(new Atom.Infer((Element)walk(tree, 0)))); + else if ("~".equals(head)) return new Hack(new Invert(new Infer((Element)walk(tree, 0)))); else if ("ps".equals(head)) return new PreSequence((Object[])walk(tree,0), null); else if (":".equals(head)) { String s = string(tree.child(0)); @@ -300,7 +316,7 @@ public class MetaGrammar extends StringWalker { Element[] expansion = o2; Sequence ret = null; if (dropAll || lame) ret = Sequence.drop(expansion, lame); - else if (unwrap) ret = new Sequence.Unwrap(expansion, repeatTag(), drops); + else if (unwrap) ret = Sequence.unwrap(expansion, repeatTag(), drops); else if (keeping || tag!=null) ret = Sequence.rewritingSequence(tag, expansion, labels, drops); else { int idx = -1; @@ -314,7 +330,7 @@ public class MetaGrammar extends StringWalker { for(Sequence s : and) ret = ret.and(s); for(Sequence s : not) ret = ret.not(s); set.add(ret); - if (this.noFollow != null) ret.noFollow = new Atom.Invert(new Atom.Infer(this.noFollow)); + if (this.noFollow != null) ret.noFollow = new Invert(new Infer(this.noFollow)); return ret; } } @@ -510,6 +526,7 @@ public class MetaGrammar extends StringWalker { + // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "=", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })}), new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "psx", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "ps", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "!", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "nonTerminal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }), @@ -1170,3 +1187,4 @@ new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu +