X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=889e2bc5974f51576df007120bbdb86edecd5a48;hp=687d2d8706f976a2b3657466bdcb6395e408f932;hb=80602d89ede55b9ca1669b6222a1bf80fc0c41d2;hpb=8ad399319f15cd179fa05a5052314a8f1d7df271 diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 687d2d8..889e2bc 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -31,9 +31,16 @@ public class MetaGrammar extends ReflectiveWalker { private HashMap nt; private int anon = 0; private String startSymbol; + private boolean strings; - public MetaGrammar() { this("s"); } - public MetaGrammar(String s) { done(s); } + private Element set(Range.Set r) { if (strings) throw new Error(); return CharToken.set(r); } + private Element string(String s) { return strings ? StringToken.string(s) : CharToken.string(s); } + private Atom leftBrace() { return strings ? StringToken.leftBrace : CharToken.leftBrace; } + private Atom rightBrace() { return strings ? StringToken.rightBrace : CharToken.rightBrace; } + + public MetaGrammar() { this("s", false); } + public MetaGrammar(String s) { this(s, false); } + public MetaGrammar(String s, boolean strings) { this.strings = strings; done(s); } public Union done() { return done("s"); } public Union done(String str) { Union ret = g; @@ -55,7 +62,7 @@ public class MetaGrammar extends ReflectiveWalker { public Element _rightparen_(Object e) { return SELF; } public Element _bang_(Element r) { return r; } public Object _caret_(String s) { return new MyLift(s); } - public Object _leftparen__rightparen_() { return epsilon; } + public Object _leftparen__rightparen_(Object o) { return epsilon; } public Union nonTerminal(String s) { return nonTerminal(s, null, false, false); } public Union _colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminal(s, p, false, false); } public Union _bang__colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminal(s, p, false, true); } @@ -82,13 +89,24 @@ public class MetaGrammar extends ReflectiveWalker { } public Object _backslash__leftbrace_(String s) { return SELF; } - public Object _leftbrace_(String s) { return SELF; } - public Object _plus_(final Element r) { return Repeat.many1(r); } + public Object _leftbrace_(PreSequence p) { + return nonTerminal("braced"+(anon++), + new PreSequence[][] { + new PreSequence[] { + new PreSequence(leftBrace()), + p, + new PreSequence(rightBrace()) + } + }, + false, + false); + } - public PreSequence rewrite(Object[] o) { return new PreSequence(o, null); } - public PreSequence _equals__greater_(Object[] o, String s) { return new PreSequence(o, s); } + public Object _plus_(final Element r) { return Repeat.many1(r); } + public PreSequence rewrite(Object[] o) { return new PreSequence(o, null); } + public PreSequence _equals__greater_(Object[] o, String s) { return new PreSequence(o, s); } public PreSequence seq(Object[] o, Object sep, String tag) { return new PreSequence(sep==null ? o : _slash_(o, sep), tag); } - public Object[] seq(Object[] o) { return o; } + public Object[] seq(Object[] o) { return o; } public Object[] _slash_(Object[] o, Object sep) { if (o.length <= 1) return o; Object[] ret = new Object[o.length * 2 - 1]; @@ -110,7 +128,7 @@ public class MetaGrammar extends ReflectiveWalker { public MetaGrammar grammar(Object o, Union[] u, Object x) { return this; } public char _backslash_n() { return '\n'; } public char _backslash_r() { return '\r'; } - public Object literal(String s) { return new MyDrop(CharToken.string(s)); } + public Object literal(String s) { return new MyDrop(string(s)); } public Range _minus_(char a, char b) { return new Range(a, b); } public Range range(char a) { return new Range(a, a); } public Element _leftbracket_ (Range[] rr) { return ranges(true, rr); } @@ -121,19 +139,19 @@ public class MetaGrammar extends ReflectiveWalker { for(Range r : rr) if (positive) ret.add(r); else ret.remove(r); - return CharToken.set(ret); + return set(ret); } - public static class MyLift { + public class MyLift { public final String s; public MyLift(String s) { this.s = s; } } - public static class MyDrop { + public class MyDrop { public final Object o; public MyDrop(Object o) { this.o = o; } } - public static class PreSequence { + public class PreSequence { public PreSequence not(Sequence s) { not.add(s); return this; } public PreSequence and(Sequence s) { and.add(s); return this; } public final HashSet and = new HashSet(); @@ -141,6 +159,8 @@ public class MetaGrammar extends ReflectiveWalker { public /*final*/ String tag; public final Object[] o; + public PreSequence(Object o) { this(new Object[] { o }, null); } + public PreSequence(Object[] o) { this(o, null); } public PreSequence(Object[] o, String tag) { this.o = o; this.tag = tag; } boolean[] drops = null; public Union buildUnion() { @@ -154,6 +174,7 @@ public class MetaGrammar extends ReflectiveWalker { for(Sequence s : not) u.add(s); HashSet set = new HashSet(); Element[] o2 = o==null ? new Element[0] : new Element[o.length]; + int nonDrop = 0; if (o != null) { drops = new boolean[o.length]; int j = 0; @@ -162,10 +183,11 @@ public class MetaGrammar extends ReflectiveWalker { if (oi instanceof MyDrop) { oi = ((MyDrop)oi).o; drops[j] = true; } if (oi==SELF) o2[j] = u.new Subset("(("+u+"))", set); - else if (oi instanceof MyLift) { o2[j] = CharToken.string(tag = ((MyLift)oi).s); drops[j] = true; } + else if (oi instanceof MyLift) { o2[j] = string(tag = ((MyLift)oi).s); drops[j] = o.length>1; } else o2[j] = (Element)oi; if (MetaGrammar.dropAll.contains(o2[j])) drops[j] = true; + nonDrop += drops[j] ? 0 : 1; o2[j] = o2[j]; j++; }