System.out.println(t.toPrettyString());
}
+ public static class ReflectiveMetaPlain extends ReflectiveMeta {
+ public Object repeatTag() { return null; }
+ public Sequence tryResolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) {
+ return null; }
+ public Sequence resolveTag(String tag, String nonTerminalName, Element[] els, Object[] labels, boolean[] drops) {
+ return Sequence.rewritingSequence(tag, els, labels, drops);
+ }
+ }
+
public static class ReflectiveMeta extends MetaGrammar.Meta {
private final Class _cl;
private final Class[] _inner;
MG.Seq.class,
MG.NonTerminalReference.class,
MG.StringLiteral.class,
- MG.Tree.class,
+ MG.XTree.class,
MG.CharClass.class
});
}
*/
@Retention(RetentionPolicy.RUNTIME) public static @interface nonterminal { String value() default ""; }
+ @Retention(RetentionPolicy.RUNTIME) public static @interface raw { }
+
/**
* Constructors, classes, and methods with this attribute will
* match every tree tagged with "value()" that is arg-compatible.
return Sequence.rewritingSequence(new TargetReducer(p), p.elements, p.labels, p.drops);
}
public abstract Object plant(Object[] fields, int[] map);
+ public boolean isRaw() { return false; }
+ public Object invokeRaw(Tree t) { return null; }
public class TargetReducer implements Reducer {
private Production p;
private int[] map;
}
public String toString() { return "reducer-"+Target.this; }
public Object reduce(Tree t) {
+ if (isRaw()) return invokeRaw(t);
Object[] objects = new Object[t.numChildren()];
for(int i=0; i<t.numChildren(); i++) {
Tree tc = t.child(i);
int[] ret = buildSequence(p, names, argtags);
return ret;
}
+ public boolean isRaw() { return _method.isAnnotationPresent(raw.class); }
+ public Object invokeRaw(Tree t) {
+ try {
+ return _method.invoke(null, new Object[] { t });
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
public Object plant(Object[] fields, int[] map) {
try {
Class[] argTypes = _method.getParameterTypes();
if (c == char.class) {
return o.toString().charAt(0);
}
+
+ if (o.getClass().isArray() &&
+ o.getClass().getComponentType().isArray() &&
+ o.getClass().getComponentType().getComponentType() == String.class &&
+ c.isArray() &&
+ c.getComponentType() == String.class) {
+ String[] ret = new String[((Object[])o).length];
+ for(int i=0; i<ret.length; i++) {
+ StringBuffer sb = new StringBuffer();
+ for(Object ob : (Object[])(((Object[])o)[i]))
+ sb.append(ob);
+ ret[i] = sb.toString();
+ }
+ return ret;
+ }
+
if (c.isArray() && (c.getComponentType().isInstance(o))) {
Object[] ret = (Object[])Array.newInstance(c.getComponentType(), 1);
ret[0] = o;
return ret;
}
+
if (o.getClass().isArray() && c.isArray()) {
boolean ok = true;
for(int i=0; i<((Object[])o).length; i++) {
return o;
}
- public static Union make(Tree t, String s) {
- ReflectiveMeta rm = new ReflectiveMeta();
+ public static Union cached = null;
+ public static Union make() {
+ if (cached != null) return cached;
+ try {
+ ReflectiveMeta m = new ReflectiveMeta();
+ Tree<String> res = new CharParser(MetaGrammar.make()).parse(new FileInputStream("tests/meta.g")).expand1();
+ MetaGrammar.Meta.MetaGrammarFile mgf = m.new MetaGrammarFile(res);
+ MetaGrammar.BuildContext bc = new MetaGrammar.BuildContext(mgf);
+ Union meta = mgf.get("s").build(bc);
+ Tree t = new CharParser(meta).parse(new FileInputStream("tests/meta.g")).expand1();
+ return cached = make(t, "s");
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ public static Union make(Tree t, String s) { return make(t, s, new ReflectiveMeta()); }
+ public static Union make(Tree t, String s, ReflectiveMeta rm) {
Reducer red = (Reducer)t.head();
MG.Grammar g = (MG.Grammar)red.reduce(t);
Context cx = new Context(g,rm);
Union u = null;
for(MG.NonTerminal nt : g.nonterminals) {
+ System.out.println(nt.name);
Union el = (Union)cx.get(nt.name);
StringBuffer st = new StringBuffer();
el.toString(st);
return cx.get(nonTerminal);
}
}
+
public static class StringLiteral extends Constant {
public @tag("literal") StringLiteral(String string) { super(CharRange.string(string)); }
public boolean drop() { return true; }
}
+
public static class CharClass extends El {
Range[] ranges;
public @tag("[") CharClass(Range[] ranges) { this.ranges = ranges; }
}
}
- public static @tag("{") class Tree extends El {
+ public static @tag("{") class XTree extends El {
public @arg Seq body;
public Element build(Context cx) {
throw new Error();