From dd88c14e959ecbd46bc4437102f27031bc33055a Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 19 Apr 2007 23:25:12 -0400 Subject: [PATCH] support for left recursion in Repeat.java darcs-hash:20070420032512-5007d-e84093647c01a5e74d615db5fcd520ed2db1e946.gz --- src/edu/berkeley/sbp/meta/Repeat.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/edu/berkeley/sbp/meta/Repeat.java b/src/edu/berkeley/sbp/meta/Repeat.java index 25581b2..a8739d9 100644 --- a/src/edu/berkeley/sbp/meta/Repeat.java +++ b/src/edu/berkeley/sbp/meta/Repeat.java @@ -28,6 +28,11 @@ public class Repeat extends Union { ? "" : ("/"+separator)), true); + if (follow != null) { + Sequence s = Sequence.create(new Repeat(e, zeroOkay, manyOkay, separator, maximal, tag, null)).followedBy(follow); + add(s); + return; + } if (zeroOkay && !manyOkay) { // FIXME add(Sequence.create(tag, new Element[] { }, null, false).followedBy(follow)); @@ -39,10 +44,26 @@ public class Repeat extends Union { add(Sequence.create(many1(e, separator, tag)).followedBy(follow)); } else { add(Sequence.create(tag, new Element[] { e }, null, false).followedBy(follow)); + /* if (separator==null) add(Sequence.create(tag, new Element[] { e, Repeat.this }, new boolean[] { false, false }, true).followedBy(follow)); else add(Sequence.create(tag, new Element[] { e, separator, Repeat.this }, new boolean[] { false, true, false }, true).followedBy(follow)); + */ + if (separator==null) + /* + add(Sequence.create(tag, new Element[] { e, Repeat.this }, new boolean[] { false, false }, true).followedBy(follow)); + */ + add(Sequence.createLeft(tag, new Element[] { Repeat.this, e }, + new boolean[] { false, false }, true)); + else { + /* + add(Sequence.create(tag, new Element[] { e, separator, Repeat.this }, new boolean[] { false, true, false }, true).followedBy(follow)); + */ + add(Sequence.createLeft(tag, new Element[] { Repeat.this, separator, e }, + new boolean[] { false, true, false }, true)); + } + } } -- 1.7.10.4