public class MetaGrammar extends StringWalker {
- boolean forceDrop = false;
-
public static class Hack<T extends Input> extends Atom<T> {
private final Atom<T> a;
static final Topology leftright = CharRange.rightBrace.union(CharRange.leftBrace);
else if (")".equals(head)) return SELF;
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)) {
- forceDrop = false;
- return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false);
- }
- else if ("!::=".equals(head)) {
- forceDrop = true;
- Object ret = nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, true);
- forceDrop = false;
- return ret;
- }
+ else if ("::=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false);
else if ("(".equals(head)) return buildUnion((Sequence[][])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 ("=>".equals(head)) {
- PreSequence p = (PreSequence)walk(tree, 0);
- p.tag = string(tree.child(1));
- return p.buildSequence(null, false, "()".equals(p.tag));
- }
+ else if ("=>".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence(null, false, string(tree.child(1)));
else if ("[]".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.unwrap = true; return p; }
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; }
}
public Union buildUnion() { return buildUnion("???"); }
public boolean unwrap = false;
- public Sequence buildSequence() { return buildSequence(null, false, forceDrop); }
+ public Sequence buildSequence() { return buildSequence(null, false, false); }
public Sequence buildSequence(Union u) { return buildSequence(u, false, false); }
+ public Sequence buildSequence(Union u, boolean lame, String tag) {
+ this.tag = tag;
+ return buildSequence(u, lame, "()".equals(tag));
+ }
public Sequence buildSequence(Union u, boolean lame, boolean dropAll) {
if (u!=null) {
for(Sequence s : and) u.add(s);
Grammar ::= NonTerminal +/ ws => "grammar"
NonTerminal ::= word ^"::=" RHS /ws
-w ::= " " | "\n" | "\r"
-ws ::= w** => ()
- | w** "//" ~[\n]* "\n" ws => ()
-wp ::= w++
-
-RHS ::= (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)?
-psy ::= ps
- | ps !wp ^"/" !ws e
-psx ::= psy => "psy"
- | psy ^"->" e /ws
-Sequence ::= Quoted => "qprod"
- > psx => "psx"
- | psx "=>" ^"[]" /ws
- | psx ^"=>" ("()"|word|Quoted) /ws
-
-ec ::= ~[\-\]\\]
- | escaped
-
-Range ::= ec => "range"
- | ec ^"-" ec
-
-e ::= word => "nonTerminal"
- | Quoted => "literal"
- | ^"()"
- | ^"{" Sequence "}" /ws
- | ^"[" Range* "]"
-
- | e ^"++" /ws -> ~[/]
- | e ^"+" /ws -> ~[+]
- | e ^"++/" e /ws
- | e ^"+/" e /ws
- | e ^"**" /ws -> ~[/]
- | e ^"*" /ws -> ~[*]
- | e ^"**/" e /ws
- | e ^"*/" e /ws
- | ^"!" e /ws
- | e ^"?" /ws
-
- | "(" word ^")" /ws
- > ^"(" RHS ")" /ws
- | ^"~" e
+RHS ::= (Conjuncts +/ (!ws "|" !ws)) +/ (!ws ">" !ws)
+
+Conjuncts ::= Sequence
+ | Sequence ^"&" Elements /ws
+ | Sequence ^"&~" Elements /ws
+Elements ::= e*/ws
+
+ps ::= Elements => "ps"
+ | (e+/ws !ws)? ^"^" Quoted (!ws e+/ws)?
+psy ::= ps
+ | ps !wp ^"/" !ws e
+psx ::= psy => "psy"
+ | psy ^"->" e /ws
+Sequence ::= Quoted => "qprod"
+ > psx => "psx"
+ | psx "=>" ^"[]" /ws
+ | psx ^"=>" ("()"|word|Quoted) /ws
+
+ec ::= ~[\-\]\\]
+ | escaped
+
+Range ::= ec => "range"
+ | ec ^"-" ec
+
+e ::= word => "nonTerminal"
+ | Quoted => "literal"
+ | ^"()"
+ | ^"{" Sequence "}" /ws
+ | ^"[" Range* "]"
+
+ | e ^"++" /ws -> ~[/]
+ | e ^"+" /ws -> ~[+]
+ | e ^"++/" e /ws
+ | e ^"+/" e /ws
+ | e ^"**" /ws -> ~[/]
+ | e ^"*" /ws -> ~[*]
+ | e ^"**/" e /ws
+ | e ^"*/" e /ws
+ | ^"!" e /ws
+ | e ^"?" /ws
+
+ | "(" word ^")" /ws
+ > ^"(" RHS ")" /ws
+ | ^"~" e
word ::= [a-zA-Z0-9_]++
Quoted ::= "\"" ((~[\"\\] | escaped)+) "\""
| "\\" ~[nr]
+w ::= " " | "\n" | "\r"
+ws ::= w** => ()
+ | w** "//" ~[\n]* "\n" ws => ()
+wp ::= w++