X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FGrammarAST.java;fp=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FGrammarAST.java;h=997d0b6230b1f06fc05ec4fd5742c86aaa3aef10;hp=ca236e979d199ca3633c09f0a29cecf0b051f712;hb=61a0c83fd40b98292b2dfe1eaba237eb804b2cb4;hpb=78a166e98747ddeb79310ccba340f292fa8a6dca diff --git a/src/edu/berkeley/sbp/meta/GrammarAST.java b/src/edu/berkeley/sbp/meta/GrammarAST.java index ca236e9..997d0b6 100644 --- a/src/edu/berkeley/sbp/meta/GrammarAST.java +++ b/src/edu/berkeley/sbp/meta/GrammarAST.java @@ -100,25 +100,28 @@ public class GrammarAST { return ret; } if (head.equals("Quoted")) return stringifyChildren(t); - if (head.equals("Literal")) return new LiteralNode((String)walk(t.child(0))); - if (head.equals("->")) return arrow((Seq)walk(t.child(0)), (ElementNode)walk(t.child(1))); - if (head.equals("DropNT")) return new NonTerminalNode((String)walk(t.child(0)), (Seq[][])walkChildren(t.child(1)), false, null, true); - if (head.equals("=") && t.size()==2) return new NonTerminalNode((String)walk(t.child(0)), (Seq[][])walk(t.child(1)), true, null, false); - if (head.equals("=")) return new NonTerminalNode((String)walk(t.child(0)), (Seq[][])walk(t.child(2)), true, (String)walk(t.child(1)), false); - if (head.equals("&")) return and2((Seq)walk(t.child(0)), (Seq)walk(t.child(1))); - if (head.equals("&~")) return andnot2((Seq)walk(t.child(0)), (Seq)walk(t.child(1))); - if (head.equals("/")) return ((Seq)walk(t.child(0))).separate((ElementNode)walk(t.child(1))); - if (head.equals("()")) return epsilon; - if (head.equals("[")) return new AtomNode((AtomNodeRange[])Reflection.rebuild(walkChildren(t), AtomNodeRange[].class)); - if (head.equals("\\{")) return new DropNode(new AtomNode(new AtomNodeRange(CharAtom.left, CharAtom.left))); - if (head.equals("\\}")) return new DropNode(new AtomNode(new AtomNodeRange(CharAtom.right, CharAtom.right))); - if (head.equals("~")) return new TildeNode((ElementNode)walk(t.child(0))); - if (head.equals("~~")) { - Seq seq = new Seq(star(new TildeNode(new AtomNode()))); - return seq.andnot((Seq)walk(t.child(0))); - } - if (head.equals("Range") && t.size()==1) return new AtomNodeRange(unescape(t).charAt(0)); - if (head.equals("Range")) return new AtomNodeRange(unescape(t).charAt(0), unescape(t).charAt(1)); + if (head.equals("Literal")) return new LiteralNode(walkString(t.child(0))); + if (head.equals("->")) return walkSeq(t.child(0)).follow(walkElement(t.child(1))); + if (head.equals("DropNT")) return new NonTerminalNode(walkString(t.child(0)), (Seq[][])walkChildren(t.child(1)), false, null, true); + if (head.equals("=")) return new NonTerminalNode(walkString(t.child(0)), (Seq[][])walk(t.child(2)), + true, t.size()==2 ? null : walkString(t.child(1)), false); + if (head.equals("&")) return and2(walkSeq(t.child(0)), walkSeq(t.child(1))); + if (head.equals("&~")) return andnot2(walkSeq(t.child(0)), walkSeq(t.child(1))); + if (head.equals("/")) return (walkSeq(t.child(0))).separate(walkElement(t.child(1))); + if (head.equals("()")) return new LiteralNode(""); + if (head.equals("[")) return new AtomNode((char[][])Reflection.rebuild(walkChildren(t), char[][].class)); + if (head.equals("\\{")) return new DropNode(new AtomNode(new char[] { CharAtom.left, CharAtom.left })); + if (head.equals("\\}")) return new DropNode(new AtomNode(new char[] { CharAtom.right, CharAtom.right })); + if (head.equals(">>")) return new DropNode(new AtomNode(new char[] { CharAtom.left, CharAtom.left })); + if (head.equals("<<")) return new DropNode(new AtomNode(new char[] { CharAtom.right, CharAtom.right })); + if (head.equals("~")) return new TildeNode(walkElement(t.child(0))); + if (head.equals("~~")) return new Seq(new RepeatNode(new TildeNode(new AtomNode()), null, true, true, false)).andnot(walkSeq(t.child(0))); + if (head.equals("Range") && t.size()==2 && ">".equals(t.child(0).head())) + return new char[] { CharAtom.left, CharAtom.left }; + if (head.equals("Range") && t.size()==2 && "<".equals(t.child(0).head())) + return new char[] { CharAtom.right, CharAtom.right }; + if (head.equals("Range") && t.size()==1) return new char[] { unescape(t).charAt(0), unescape(t).charAt(0) }; + if (head.equals("Range")) return new char[] { unescape(t).charAt(0), unescape(t).charAt(1) }; if (head.equals("\"\"")) return ""; if (head.equals("\n")) return "\n"; if (head.equals("\r")) return "\r";