private HashMap<String,Union> 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;
}
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];
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); }
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<Sequence> and = new HashSet<Sequence>();
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() {
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;