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;
return nonTerminal("braced"+(anon++),
new PreSequence[][] {
new PreSequence[] {
- new PreSequence(CharToken.leftBrace),
+ new PreSequence(leftBrace()),
p,
- new PreSequence(CharToken.rightBrace)
+ new PreSequence(rightBrace())
}
},
false,
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>();
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;