From: adam Date: Sun, 2 Jul 2006 03:21:22 +0000 (-0400) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~245 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=74e53cbf7227f5958ff7495abe31cb0462d62c4e checkpoint darcs-hash:20060702032122-5007d-1d4f1aa29f0fbec2bb61ae0970f45d3ebf17691b.gz --- diff --git a/src/edu/berkeley/sbp/Repeat.java b/src/edu/berkeley/sbp/Repeat.java index b7e7e39..89199c5 100644 --- a/src/edu/berkeley/sbp/Repeat.java +++ b/src/edu/berkeley/sbp/Repeat.java @@ -16,10 +16,15 @@ class Repeat extends Union { this(e, zeroOkay, manyOkay, separator, false, tag); } protected Repeat(final Element e, boolean zeroOkay, boolean manyOkay, final Element separator, boolean maximal, Object tag) { super(e+(!manyOkay ? "?" : (zeroOkay ? (maximal ? "**" : "*") : (maximal ? "++" : "+")))+(separator==null?"":("/"+separator)), true); - if (zeroOkay) { + if (zeroOkay && !manyOkay) { add(new Sequence.Constant.Empty()); - if (manyOkay) add(new Sequence.Singleton(Sequence.many1(e, separator))); - else add(new Sequence.Singleton(e)); + add(new Sequence.Singleton(e)); + return; + } + if (zeroOkay) { + add(new Sequence.RewritingSequence(tag, new Element[] { }, null)); + // FUGLY + add(new Sequence.Singleton(Sequence.many1(e, separator, tag))); } else { add(new Sequence.RewritingSequence(tag, new Element[] { e }, null)); if (separator==null) diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index 9c205d8..f163d93 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -30,9 +30,11 @@ public class Demo { Union meta = mgf.get("s").build(bc); System.err.println("parsing " + s[1]); - res = new CharParser(meta).parse(new FileInputStream(s[1])).expand1(); + Tree t = new CharParser(meta).parse(new FileInputStream(s[1])).expand1(); - System.out.println(res); + System.out.println(t.toPrettyString()); + Reducer red = (Reducer)t.head(); + System.out.println(red.reduce(t)); } public static class ReflectiveMeta extends MetaGrammar.Meta { @@ -66,6 +68,26 @@ public class Demo { if (match((nonterminal)con.getAnnotation(nonterminal.class), c, s)) return true; return false; } + public Object repeatTag() { + return new Reducer() { + public String toString() { return "[**]"; } + public Object reduce(Tree t) { + Object[] ret = new Object[t.numChildren()]; + for(int i=0; i name.lastIndexOf('.')) { len--; ofs++; } + */ String[] names = new String[len]; arg[] argtags = new arg[len]; for(int i=0; i") Seq arrow(Seq s, Element e) { return null; } + public static class El { } + public static /*abstract*/ @nonterminal("Sequence") class Seq extends El { } + public static @tag("&") Seq and(Sequence s, El[] elements) { return new Seq(); } + public static @tag("&~") Seq andnot(Sequence s, El[] elements) { return new Seq(); } + public static @tag Seq ps(El[] elements) { return new Seq(); } + public static @tag Seq psx(Seq s) { return s; } + public static @tag("::") Seq tag(String tagname, Seq seq) { return new Seq(); } + public static @tag(":") void colon(String s, El e) { } + public static @tag(")") void close(String foo) { } + public static @tag("/") Seq slash(Seq s, El e) { return new Seq(); } + public static @tag("->") Seq arrow(Seq s, El e) { return new Seq(); } - public @tag("nonTerminal") class NonTerminalReference { public @arg String nonTerminal; } - public @tag("literal") class StringLiteral { public @arg String string; } - public @tag("()") class Epsilon { } - public @tag("{") class Tree { @arg Seq body; } - public @tag("[") class CharClass { public CharClass(Range[] ranges) { } } + public static @tag("nonTerminal") class NonTerminalReference extends El { public @arg String nonTerminal; } + public static @tag("literal") class StringLiteral extends El { public @arg String string; } + public static @tag("()") class Epsilon extends El { } + public static @tag("{") class Tree extends El { public @arg Seq body; } + public static class CharClass extends El { public @tag("[") CharClass(Range[] ranges) { } } - public @tag("++") void plusmax(El e) { } - public @tag("+") void plus(El e) { } - public @tag("++/") void plusmaxfollow(El e, El sep) { } - public @tag("+/") void plusfollow(El e, El sep) { } - public @tag("**") void starmax(El e) { } - public @tag("*") void star(El e) { } - public @tag("**/") void starmaxfollow(El e, El sep) { } - public @tag("*/") void starfollow(El e, El sep) { } - public @tag("!") void bang(El e) { } - public @tag("?") void question(El e) { } - public @tag("^") void caret(String s) { } - public @tag("~") void tilde(El e) { } - public @tag("^^") void doublecaret(El e) { } - public @tag("(") void subexpression(Seq[][] rhs) { } + public static @tag("++") void plusmax(El e) { } + public static @tag("+") void plus(El e) { } + public static @tag("++/") void plusmaxfollow(El e, El sep) { } + public static @tag("+/") void plusfollow(El e, El sep) { } + public static @tag("**") void starmax(El e) { } + public static @tag("*") void star(El e) { } + public static @tag("**/") void starmaxfollow(El e, El sep) { } + public static @tag("*/") void starfollow(El e, El sep) { } + public static @tag("!") void bang(El e) { } + public static @tag("?") void question(El e) { } + public static @tag("^") void caret(String s) { } + public static @tag("~") void tilde(El e) { } + public static @tag("^^") void doublecaret(El e) { } + public static @tag("(") void subexpression(Seq[][] rhs) { } - public @nonterminal("Word") String word(String s) { return null; } - public @nonterminal("Quoted") String quoted(String s) { return null; } - public @nonterminal("escaped") String c(char c) { return null; } - public @tag("\"\"") String emptystring() { return null; } - public @tag("\r") String lf() { return null; } - public @tag("\n") String cr() { return null; } + public static @nonterminal("Word") String word(String s) { return null; } + public static @nonterminal("Quoted") String quoted(String s) { return null; } + public static @nonterminal("escaped") String c(char c) { return null; } + public static @tag("\"\"") String emptystring() { return null; } + public static @tag("\r") String lf() { return null; } + public static @tag("\n") String cr() { return null; } } } diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 3420ad5..a284938 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -7,8 +7,6 @@ import java.io.*; public class MetaGrammar extends StringWalker { - public static Object repeatTag = null; - public static Union make() throws Exception { return make(MetaGrammarTree.meta, "s"); } public static Union make(Tree tree, String nt) throws Exception { Meta.MetaGrammarFile mgf = new Meta().new MetaGrammarFile(tree); @@ -51,6 +49,7 @@ public class MetaGrammar extends StringWalker { } public static class Meta { + public Object repeatTag() { return null; } public Sequence resolveTag(String s, String nonTerminalName, Element[] els, Object[] labels, boolean [] drops) { return Sequence.rewritingSequence(s, els, labels, drops); } @@ -208,7 +207,7 @@ public class MetaGrammar extends StringWalker { } Sequence ret = null; if (dropAll) ret = Sequence.drop(els, false); - else if (unwrap) ret = Sequence.unwrap(els, /*repeatTag FIXME*/null, drops); + else if (unwrap) ret = Sequence.unwrap(els, repeatTag(), drops); else if (tag!=null) { ret = resolveTag(tag, bc.currentNonTerminal==null ? null : bc.currentNonTerminal.name, els, labels, drops); } else { @@ -307,11 +306,11 @@ public class MetaGrammar extends StringWalker { public Element build(BuildContext bc) { return !maximal ? (separator==null - ? Sequence.repeat(element.build(bc), zero, many, null, null) - : Sequence.repeat(element.build(bc), zero, many, separator.build(bc), null)) + ? Sequence.repeat(element.build(bc), zero, many, null, repeatTag()) + : Sequence.repeat(element.build(bc), zero, many, separator.build(bc), repeatTag())) : (separator==null - ? Sequence.repeatMaximal(infer(element.build(bc)), zero, many, null) - : Sequence.repeatMaximal(element.build(bc), zero, many, infer(separator.build(bc)), null)); + ? Sequence.repeatMaximal(infer(element.build(bc)), zero, many, repeatTag()) + : Sequence.repeatMaximal(element.build(bc), zero, many, infer(separator.build(bc)), repeatTag())); } public MetaRepeat(MetaClause element, boolean maximal, MetaClause separator, boolean zero, boolean many) { this.separator = separator; diff --git a/src/edu/berkeley/sbp/util/Reflection.java b/src/edu/berkeley/sbp/util/Reflection.java index 42267ce..fd43a45 100644 --- a/src/edu/berkeley/sbp/util/Reflection.java +++ b/src/edu/berkeley/sbp/util/Reflection.java @@ -51,6 +51,31 @@ public final class Reflection { return (Object[])Array.newInstance(c, i); } + public static String indent(String s, int indent) { + if (s.indexOf('\n')==-1) return s; + StringBuffer ret = new StringBuffer(); + for(int i=0; i