From: adam Date: Fri, 14 Jul 2006 03:11:33 +0000 (-0400) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~142 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=5fdbef59b07d4769f79337e77d1ee6c1d5762f52 checkpoint darcs-hash:20060714031133-5007d-563e59f5b3100c26db3a7c9170d070dcd190d8c8.gz --- diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index 667b6a6..b381360 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -18,7 +18,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public static String prefix = ""; /** A grammar (a set of nonterminals) */ - public static class GrammarNode extends HashMap implements NonTerminalSource { + public static class GrammarNode extends HashMap { public NonTerminalNode[] getNonTerminals() { return (NonTerminalNode[])values().toArray(new NonTerminalNode[0]); } @@ -30,9 +30,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { this.put(nt.name, nt); } } - public @bind.as("Grammar") GrammarNode(Object[] nt) { - add(nt); - } + public @bind.as("Grammar") GrammarNode(Object[] nt) { add(nt); } private void add(Object[] obs) { for(Object o : obs) { if (o==null) continue; @@ -43,7 +41,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { throw new RuntimeException("duplicate definition of nonterminal \""+nt.name+"\""); this.put(nt.name, nt); } - else if (o instanceof NonTerminalSource) add(((NonTerminalSource)o).getNonTerminals()); + else if (o instanceof GrammarNode) add(((GrammarNode)o).getNonTerminals()); } } public String toString() { @@ -91,8 +89,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { if (as==null) as = ""; else if ("".equals(as)) { } else as = as +"."; - - System.err.println("#import " + fileName + " as " + as); + try { Tree t = new CharParser(MetaGrammar.newInstance()).parse(new FileInputStream("tests/"+fileName)).expand1(); Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); @@ -107,16 +104,13 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { } } - public static interface NonTerminalSource { - public NonTerminalNode[] getNonTerminals(); - } - - public static class NonTerminalNode extends UnionNode implements NonTerminalSource { + public static class NonTerminalNode extends UnionNode { public boolean rep; public String name = null; public String sep = null; public NonTerminalNode[] getNonTerminals() { return new NonTerminalNode[] { this }; } - public @bind.as("NonTerminal") NonTerminalNode(@bind.arg String name, @bind.arg Seq[][] sequences) { this(name, sequences, false); } + public @bind.as("NonTerminal") NonTerminalNode(@bind.arg String name, @bind.arg Seq[][] sequences) { + this(name, sequences, false); } public NonTerminalNode(String name, Seq[][] sequences, boolean rep) { this(name, sequences, rep, null); } public NonTerminalNode(String name, Seq[][] sequences, boolean rep, String sep) { this.name = prefix + name; @@ -355,9 +349,10 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { public static @bind.as("^") ElementNode caret(final String s) { final String thePrefix = prefix; - return new Drop(new Constant(CharRange.string(s)) { + return new Constant(CharRange.string(s)) { public String getOwnerTag() { return thePrefix+s; } - }); + public boolean drop() { return true; } + }; } public static @bind.as("~") ElementNode tilde(final ElementNode e) { @@ -421,39 +416,43 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { } + public static abstract class ElementNode { + public String getLabel() { return null; } + public String getOwnerTag() { return null; } + public boolean drop() { return false; } + public abstract Element build(Context cx, NonTerminalNode cnt); + } + + public static abstract class ElementNodeWrapper extends ElementNode { + protected ElementNode _e; + public ElementNodeWrapper(ElementNode e) { this._e = e; } + public String getLabel() { return _e.getLabel(); } + public String getOwnerTag() { return _e.getOwnerTag(); } + public boolean drop() { return _e.drop(); } + public Element build(Context cx, NonTerminalNode cnt) { return _e.build(cx, cnt); } + } + public static class Constant extends ElementNode { Element constant; public Constant(Element constant) { this.constant = constant; } public Element build(Context cx, NonTerminalNode cnt) { return constant; } } - public abstract static class PostProcess extends ElementNode { + + public abstract static class PostProcess extends ElementNodeWrapper { ElementNode e; - public PostProcess(ElementNode e) { this.e = e; } - public Element build(Context cx, NonTerminalNode cnt) { return postProcess(e.build(cx, cnt)); } + public PostProcess(ElementNode e) { super(e); } + public Element build(Context cx, NonTerminalNode cnt) { return postProcess(_e.build(cx, cnt)); } public abstract Element postProcess(Element e); } - public static abstract class ElementNode { - public String getLabel() { return null; } - public String getOwnerTag() { return null; } - public boolean drop() { return false; } - public abstract Element build(Context cx, NonTerminalNode cnt); - } - public static class Drop extends ElementNode { - public ElementNode e; - public Drop(ElementNode e) { this.e = e; } - public String getLabel() { return null; } + public static class Drop extends ElementNodeWrapper { + public Drop(ElementNode e) { super(e); } public boolean drop() { return true; } - public String getOwnerTag() { return e.getOwnerTag(); } - public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); } } - public static class Label extends ElementNode { + public static class Label extends ElementNodeWrapper { public String label; - public ElementNode e; - public Label(String label, ElementNode e) { this.e = e; this.label = label; } + public Label(String label, ElementNode e) { super(e); this.label = label; } public String getLabel() { return label; } - public String getOwnerTag() { return e.getOwnerTag(); } - public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); } } } diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index e8d38ee..b118bbf 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -30,7 +30,6 @@ public class Demo { public static @bind.as("/") class Divide extends BinOp { } public static @bind.as("+") class Add extends BinOp { } public static @bind.as("-") class Subtract extends BinOp { } - }