X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=889e2bc5974f51576df007120bbdb86edecd5a48;hp=d385a5515e3294f6344cae6527c61a3859e89bfa;hb=695b95cf0b6140177098a5a2d7117aec4017e470;hpb=2724e3d1df836f6ce40bc4227f1509e777de2e48 diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index d385a55..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; @@ -86,9 +93,9 @@ public class MetaGrammar extends ReflectiveWalker { return nonTerminal("braced"+(anon++), new PreSequence[][] { new PreSequence[] { - new PreSequence(CharToken.leftBrace), + new PreSequence(leftBrace()), p, - new PreSequence(CharToken.rightBrace) + new PreSequence(rightBrace()) } }, false, @@ -121,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); } @@ -132,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(); @@ -176,7 +183,7 @@ 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] = o.length>1; } + 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;