- public Object walk(Tree<String> tree) {
- String head = tree.head();
- if (tree.numChildren()==0) return super.walk(tree);
- if ("\\n".equals(head)) return new Character('\n');
- else if ("\\r".equals(head)) return new Character('\r');
- else if ("grammar".equals(head)) { for(Tree<String> t : tree.children()) walk(t); return this; }
- else if ("*".equals(head)) return Sequence.many0((Element)walk(tree.child(0)), repeatTag());
- else if ("+".equals(head)) return Sequence.many1((Element)walk(tree.child(0)), repeatTag());
- else if ("+/".equals(head)) return Sequence.many1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag());
- else if ("*/".equals(head)) return Sequence.many0((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag());
- else if ("++/".equals(head)) return Sequence.maximal1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag());
- else if ("**".equals(head)) return Sequence.maximal0((Element)walk(tree.child(0)), repeatTag());
- else if ("++".equals(head)) return Sequence.maximal1((Element)walk(tree.child(0)), repeatTag());
- else if ("?".equals(head)) return Sequence.maybe((Element)walk(tree.child(0)), repeatTag());
- else if ("!".equals(head)) { Element e = (Element)walk(tree.child(0)); dropAll.add(e); return e; }
- else if ("&".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true));
- else if ("and".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true));
- else if ("&~".equals(head)) return ((Sequence)walk(tree,0)).not(sequence(walk(tree, 1), true));
- else if ("epsilon".equals(head)) return Union.epsilon;
- else if ("()".equals(head)) return Union.epsilon;
- else if (")".equals(head)) return SELF;
- else if ("caret".equals(head) || "^".equals(head)) {
- String s = string(tree.child(0));
- Element ret = CharRange.string(s, false);
- carets.put(ret, s);
- dropAll.add(ret);
- return ret;
- /*
- } else if ("^^".equals(head)) {
- return new Keep(walk(tree,0));
- */
- } else if ("psx".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence();
- else if ("nonTerminal".equals(head)) return getNonTerminal(string(tree.child(0)));
- else if ("::=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])Reflection.lub(walk(tree, 1)), false, false);
- else if ("=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])Reflection.lub(walk(tree, 1)), false, false);
- else if ("(".equals(head)) return buildUnion((Sequence[][])Reflection.lub(walk(tree, 0)));
- else if ("literal".equals(head)) { Element ret = string(string(tree.child(0))); dropAll.add(ret); return ret; }
- else if ("-".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,1).toString().charAt(0));
- else if ("range".equals(head)) return new Range(walk(tree, 0).toString().charAt(0), walk(tree,0).toString().charAt(0));
- else if ("gram".equals(head)) return walk(tree, 0);
- else if ("psy".equals(head)) return (PreSequence)walk(tree, 0);
- else if ("->".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.noFollow = (Element)walk(tree, 1); return p; }
- else if ("/".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1));
- else if (" /".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1));
- else if ("~".equals(head)) return new Hack(new Invert(new Infer((Element)walk(tree, 0))));
- else if ("ps".equals(head)) return new PreSequence((Object[])walk(tree,0), null);
- else if (":".equals(head)) {
- String s = string(tree.child(0));
- return new Keep(s,walk(tree,1));
- } else if ("::".equals(head)) {
- PreSequence p = (PreSequence)walk(tree, 1);
- String s = string(tree.child(0));
- if (s.equals("[]")) p.unwrap = true;
- else p.tag = convertLabel(s);
- return p;