- // MetaGrammar //////////////////////////////////////////////////////////////////////////////
-
- public Object _star_(Element r) { return new Rep(r, null, false, true); }
- public Union _colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminalZ(s, p); }
- public Union _bang__colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminalZ(s, p, true); }
- public Union _colon__colon__equals_(boolean q, String s, PreSequence[][] p) { return nonTerminalZ(s, p, q); }
- public Element epsilon(Object o, Object b) { return epsilon; }
- public Element _rightparen_(Object e) { return SELF; }
-
- public PreSequence _amp_(PreSequence p, Object[] o) {
- p.needs.add(new PreSequence(o, null, true));
- return p;
- }
- public PreSequence _amp__tilde_(PreSequence p, Object[] o) {
- p.hates.add(new PreSequence(o, null, true));
- return p;
- }
-
- public Element _bang_(Element r) { return r; }
- public Object care(String s) { return new MyLift(s); }
- public Object _caret_(String s) { return new MyLift(s); }
- public Object _leftparen__rightparen_() { return epsilon; }
- //public Element _backtick_(Element r) { return new Unwrap(r); }
- //public Element _hash_(Element e) { return e; }
- //public Element _hash_(Element e) { return _plus__plus_(e); }
-
- public PreSequence[] alternatives(PreSequence[] s) { return s; }
-
- public Object _leftparen_(PreSequence[][] p) { return nonTerminalZ(p); }
- public Union nonTerminalY(String s) { return nonTerminalX(s, false, false); }
- public Union nonTerminalX(String s, boolean synthetic, boolean dropAll) {
- Union n = s.equals(startSymbol) ? g : nt.get(s);
- if (n == null) nt.put(s, n = new Union(s, synthetic));
- if (dropAll) this.dropAll.add(n);
- return n;
- }
- public Union nonTerminalZ(PreSequence[][] p) { return nonTerminalX("anon"+(anon++), p, false, false); }
- public Union nonTerminalZ(String s, PreSequence[][] p) { return nonTerminalX(s, p, false, false); }
- public Union nonTerminalZ(String s, PreSequence[][] p, boolean q) { return nonTerminalX(s, p, false, q); }
- public Object _backslash__leftbrace_(String s) { return SELF; }
- public Object _leftbrace_(String s) { return SELF; }
- public Object _plus_(final Element r) { return new Rep(r, null, false, false); }
- public Object[] _slash_(Object[] o, Object sep) {
- if (o.length <= 1) return o;
- Object[] ret = new Object[o.length * 2 - 1];
- for(int i=0; i<o.length; i++) {
- Object oi = o[i];
- ret[i*2] = oi;
- if (i*2+1<ret.length) ret[i*2+1] = new MyDrop(sep);
- }
- return ret;
- }
- public Object _plus__slash_(final Element r, Object s) { return new Rep(r, (Element)s, false, false); }
- public Object _star__slash_(final Element r, Object s) { return new Rep(r, (Element)s, false, true); }
- public Object _star__star_(final Element r) { return new Rep(r, null, true, true); }
- public Object _plus__plus_(final Element r) { return new Rep(r, null, true, false); }
- public Element _question_(final Element r) { return Repeat.maybe(r); }
- public MetaGrammar gram(Object o, MetaGrammar g, Object o2) { return g; }
- public MetaGrammar grammar(Object[] o) { return this; }
- public MetaGrammar grammar(Object o, Union[] u, Object x) { return this; }
- public char _backslash_n() { return '\n'; }
- public char _backslash_r() { return '\r'; }
- //public String literal(String s) { return s; }
-
- public Object literal(String s) {
- Element e = CharToken.string(s);
- return new MyDrop(e);
- //dropAll.add(e);
- //return e;
- }
-
- public Range range(char a) { return new Range(a, a); }
- public Range _minus_(char a, char b) { return new Range(a, b); }
- public Element rangesx(Range[] rr) { return ranges("~", rr); }
- public Element ranges(Range[] rr) { return ranges(null, rr); }
- public Element _leftbracket_ (Range[] rr) { return ranges(null, rr); }
- public Element _leftbracket__tilde_(Range[] rr) { return ranges("~", rr); }
- public Element ranges(Object o, Range[] rr) {
- Range.Set ret = !"~".equals(o+"") ? new Range.Set() : new Range.Set(new Range(true, true));
- if (rr != null)
- for(Range r : rr)
- if (!"~".equals(o+"")) ret.add(r);
- else ret.remove(r);
- return CharToken.set(ret);
- }
- public Element rangex(Object o, Object[] r) {
- Range.Set ret = o==null ? new Range.Set() : new Range.Set(new Range(true, true));
- if (r != null)
- for(Object aa : r) {
- Range range =
- aa instanceof Range
- ? (Range)aa
- : aa instanceof Character
- ? new Range(((Character)aa).charValue())
- : new Range(((String)aa).charAt(0));
- if (o==null) ret.add(range);
- else ret.remove(range);
- }
- return CharToken.set(ret);
- }
-
- public String sify(Object arg) {
- if (arg==null) return "";
- if (arg instanceof String) return (String)arg;
- Object[] args = (Object[])arg;
- while(true) {
- args = Reflection.lub(args);
- if (args instanceof String[]) {
- StringBuffer ret = new StringBuffer();
- for(String s : ((String[])args)) ret.append(s);
- return ret.toString();
- }
- if (args instanceof Character[]) break;
- if (!(args instanceof Object[])) break;
- args = (Object[])args[0];
- }
- if (args instanceof Character[]) {
- char[] c = new char[args.length];
- for(int i=0; i<c.length; i++) c[i] = ((Character)args[i]).charValue();
- String s = new String(c, 0, c.length);
- return s;
- }
- return (String)args[0];
- }
-
-