From: adam Date: Fri, 20 Apr 2007 03:45:19 +0000 (-0400) Subject: added ~~ operator and tests for ~~ and ... operators X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=1d5f76f8144b739719737bfe75f321caf67cfa19;ds=sidebyside added ~~ operator and tests for ~~ and ... operators darcs-hash:20070420034519-5007d-b30401c8d091051cf3c97672186f8ac8a9e01dea.gz --- diff --git a/src/edu/berkeley/sbp/meta/GrammarBuilder.java b/src/edu/berkeley/sbp/meta/GrammarBuilder.java index f38bd8e..121f480 100644 --- a/src/edu/berkeley/sbp/meta/GrammarBuilder.java +++ b/src/edu/berkeley/sbp/meta/GrammarBuilder.java @@ -85,9 +85,8 @@ public class GrammarBuilder { public Object walk(Tree t) { String head = (String)t.head(); - if (head.indexOf('.') != 0) - while(head.indexOf('.') != -1) - head = head.substring(head.indexOf('.')+1); + while(head.indexOf('.') > 0) + head = head.substring(head.indexOf('.')+1); if (head==null) throw new RuntimeException("head is null: " + t); if (head.equals("|")) return walkChildren(t); if (head.equals("RHS")) return walkChildren(t); @@ -130,6 +129,10 @@ public class GrammarBuilder { 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("\"\"")) return ""; diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java index a10ff9d..42d84b9 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammar.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java @@ -156,6 +156,7 @@ public class MetaGrammar { + // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED new edu.berkeley.sbp.Tree(null, "Grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "NonTerminal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })}), new edu.berkeley.sbp.Tree(null, "RHS", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "|", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "NonTerminalReference", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }), @@ -695,7 +696,12 @@ new edu.berkeley.sbp.Tree(null, "Grammar", new edu.berkeley.sbp.Tree[] { new edu new edu.berkeley.sbp.Tree(null, "Literal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, ")", new edu.berkeley.sbp.Tree[] { })})})}), new edu.berkeley.sbp.Tree(null, "NonTerminalReference", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }), new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })})})}), - new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "^", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { })})}), + new edu.berkeley.sbp.Tree(null, "::", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { })}), + new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "!", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "(", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "RHS", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "|", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "->", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Literal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { })})})}), + new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Literal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { })})})})})})})})}), + new edu.berkeley.sbp.Tree(null, "NonTerminalReference", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "e", new edu.berkeley.sbp.Tree[] { })})})})}), + new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "^", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { }), + new edu.berkeley.sbp.Tree(null, "~", new edu.berkeley.sbp.Tree[] { })})}), new edu.berkeley.sbp.Tree(null, "NonTerminalReference", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "e", new edu.berkeley.sbp.Tree[] { })})})}), new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "^", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Quoted", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "\\", new edu.berkeley.sbp.Tree[] { }), new edu.berkeley.sbp.Tree(null, "{", new edu.berkeley.sbp.Tree[] { })})})}), @@ -893,3 +899,4 @@ new edu.berkeley.sbp.Tree(null, "Grammar", new edu.berkeley.sbp.Tree[] { new edu + diff --git a/tests/meta.g b/tests/meta.g index b7dc2b8..638fa71 100644 --- a/tests/meta.g +++ b/tests/meta.g @@ -26,6 +26,7 @@ PreSequence = Elements Sequence = PreSequence | Sequence ^"&" Elements /ws + | ^"~~" Elements /ws | Sequence ^"&~" Elements /ws e = e ^"!" @@ -49,7 +50,7 @@ e = e ^"!" | ^"..." | "(" Word ^")" > ^"(" RHS ")" /ws - | ^"~" e + | "~":: ("~" -> ~"~")! e | ^"\\{" | ^"\\}" diff --git a/tests/regression.tc b/tests/regression.tc index 1197903..4b1b397 100644 --- a/tests/regression.tc +++ b/tests/regression.tc @@ -395,3 +395,21 @@ testcase "question mark" { Z = Z:: "a" "b"* "a" B = "b" } + +testcase "operator: ... " { + input "aaabbbaaa abababababa"; + output "s:{C:{a a a b b b a a a} B:{a b a b a b a b a b a}}"; + s:: = A " " A + A = B > C + B:: = [ab]* &~ (... "bbb" ...) + C:: = [ab]* +} + +testcase "operator: ~~" { + input "aaabbbaaa abababababa"; + output "s:{C:{a a a b b b a a a} B:{a b a b a b a b a b a}}"; + s:: = A " " A + A = B > C + B:: = ~~(... "bbb" ...) + C:: = [ab]* +}