else if ("**".equals(head)) return Repeat.maximal0((Element)walk(tree.child(0)));
else if ("++".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0)));
else if ("?".equals(head)) return Repeat.maybe((Element)walk(tree.child(0)));
+ else if ("!".equals(head)) return walk(tree.child(0));
else if ("&".equals(head))
return ((Sequence)walk(tree,0)).and(new PreSequence((Element[])Reflection.lub((Object[])walk(tree, 1)), null).buildSequence(null, true, false));
else if ("&~".equals(head))
w !::= " "
| "\n"
| "\r"
-ws !::= w** | w** "//" (~[\n]*) "\n" ws
+ws !::= w** | w** "//" (~[\n]*) "\n" !ws
wp !::= w++
Grammar ::= r +/ ws => "grammar"
r ::= word ^"::=" alternatives /ws
| word ^"!::=" alternatives /ws
-alternatives ::= (Conjuncts +/ (ws "|" ws)) +/ (ws ">" ws)
+alternatives ::= (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
Conjuncts ::= Sequence
| Sequence ^"&" e*/ws /ws
| Sequence ^"&~" e*/ws /ws
ps ::= e*/ws => "ps"
- | (e+/ws ws)? "^" Quoted (ws e+/ws)? => "ps2"
+ | (e+/ws !ws)? "^" Quoted (!ws e+/ws)? => "ps2"
psy ::= ps
- | ps wp ^"/" ws e
+ | ps wp ^"/" !ws e
psx ::= psy => "psy"
// | e "<-" psy /ws => "psyl"
| psy "->" e /ws => "psyr"