From: adam Date: Mon, 2 Jan 2006 02:47:50 +0000 (-0500) Subject: removed illegal use of double-star X-Git-Tag: tag_for_25-Mar~476 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=87f214f3da9f43c3ab93923313845c372f9a96be;ds=sidebyside removed illegal use of double-star darcs-hash:20060102024750-5007d-24a3c776616cb59c9a5d4188915629d261702f7d.gz --- diff --git a/src/edu/berkeley/sbp/Repeat.java b/src/edu/berkeley/sbp/Repeat.java index 35f3477..48ac386 100644 --- a/src/edu/berkeley/sbp/Repeat.java +++ b/src/edu/berkeley/sbp/Repeat.java @@ -51,8 +51,12 @@ public class Repeat extends Union { static class MaximalSequence extends Sequence.Singleton { private final Element e; - public String toString() { return e+"@";} - public MaximalSequence(Element e) { super(e, null, null); this.e = e; } + public String toString() { return e+"@"; } + public Topology noFollow() { return e.toAtom(); } + public MaximalSequence(Element e) { + super(e, null, null); + this.e = e; + } } static class Maximal extends Union { public Maximal(final Element e) { diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index 9586f72..a5149f2 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -35,8 +35,11 @@ public abstract class Sequence extends Element implements Iterable { //////////////////////////////////////////////////////////////////////////////// + public Topology noFollow() { return null; } + Topology toAtom() { - if (elements.length!=1) return null; + if (elements.length>1) throw new RuntimeException("cannot invoke toAtom() on a Sequence with " + elements.length + " elements: " + this); + if (elements.length==0) return null; return elements[0].toAtom(); } diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index 7274dae..a7a7630 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -19,10 +19,11 @@ public class Union extends Element implements Iterable { void reachable(HashSet h) { for(Sequence s : alternatives) s.reachable(h); } Topology toAtom() { - if (alternatives.size()==0) return null; + if (alternatives.size()==0) throw new RuntimeException("cannot build an Atom from a Union with no productions"); Topology ret = null; for(Sequence s : this) { Topology a = s.toAtom(); + if (a==null) continue; if (ret==null) ret = a.dup(); else ret.add(a.dup()); } diff --git a/src/edu/berkeley/sbp/Walk.java b/src/edu/berkeley/sbp/Walk.java index abbffd7..cfd9c31 100644 --- a/src/edu/berkeley/sbp/Walk.java +++ b/src/edu/berkeley/sbp/Walk.java @@ -166,7 +166,12 @@ abstract class Walk { if (e instanceof Repeat.MaximalSequence || e instanceof Repeat.Maximal) cs.remove(new Last(cs.fresh(), c).walk(e)); - + /* + if (e instanceof Sequence) { + Sequence s = (Sequence)e; + if (s.noFollow() != null) cs.remove(s.noFollow()); + } + */ if (c != null && e==me) { c.follow.put(e, cs.dup()); c.eof.put(e, eof); diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 0571a98..861b5a9 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -298,6 +298,8 @@ public class MetaGrammar extends StringWalker { + + // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }), new Tree(null, "grammar", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "s", new Tree[] { })}), @@ -318,7 +320,15 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }), new Tree(null, "m", new Tree[] { })})})})})}), new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }), new Tree(null, "s", new Tree[] { })}), - new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})}), + new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "**", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})}), + new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }), + new Tree(null, "s", new Tree[] { })})}), + new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { }), + new Tree(null, "/", new Tree[] { })})}), + new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})}), + new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}), + new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }), + new Tree(null, "s", new Tree[] { })})})})})})})}), new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }), new Tree(null, "p", new Tree[] { })}), new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "++", new Tree[] { new Tree(null, "nonTerminal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })})})})})})})})}), @@ -737,10 +747,6 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }), new Tree(null, "s", new Tree[] { })})})})})})}), new Tree(null, "!::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { })}), new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, " ", new Tree[] { })})}), - new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "/", new Tree[] { }), - new Tree(null, "/", new Tree[] { })})}), - new Tree(null, "(", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "ps", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "*", new Tree[] { new Tree(null, "[~", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "range", new Tree[] { new Tree(null, "\n", new Tree[] { })})})})})})})})})}), - new Tree(null, "literal", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})})})}), new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\n", new Tree[] { })})}), new Tree(null, "qprod", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "\r", new Tree[] { })})})})})}), new Tree(null, "::=", new Tree[] { new Tree(null, null, new Tree[] { new Tree(null, "w", new Tree[] { }), @@ -838,3 +844,5 @@ new Tree(null, "gram", new Tree[] { new Tree(null, null, new Tree[] { }), + + diff --git a/tests/meta.g b/tests/meta.g index 11fee67..ed87f5c 100644 --- a/tests/meta.g +++ b/tests/meta.g @@ -1,5 +1,5 @@ s ::= ws grammar ws => "gram" -ws !::= w** +ws !::= w** | ws "//" ([~\n]*) "\n" ws wp !::= w++ grammar ::= r +/ ws => "grammar" @@ -45,7 +45,6 @@ e ::= word => "nonTerminal" | "(" word ^")" /ws > ^"(" alternatives ")" /ws w !::= " " - | "//" ([~\n]*) "\n" | "\n" | "\r" word ::= [a-zA-Z0-9_]++