X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;h=e3299cbe0f205c5cdfba36f7fbdfe7a2b3953d80;hb=f1dba2b015c3da04fc2fab45604da2e6c9ae0a1d;hp=ca0a2ebe466219a198a7a50d70753e56cdd94b90;hpb=2ca60a30895e90a0458361974402cee001498784;p=sbp.git diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index ca0a2eb..e3299cb 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,22 +104,19 @@ 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; this.sequences = sequences; this.rep = rep; - this.sep = prefix + sep; + this.sep = sep==null?null:(prefix + sep); } public Element build(Context cx, NonTerminalNode cnt) { return cx.get(name); } public void build(Context cx, Union u, NonTerminalNode cnt) { @@ -131,7 +125,10 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings { Union urep = new Union(); urep.add(Sequence.empty); - urep.add(Sequence.singleton(new Element[] { cx.get(sep), u }, 1)); + if (sep != null) + urep.add(Sequence.singleton(new Element[] { cx.get(sep), u }, 1)); + else + urep.add(Sequence.singleton(new Element[] { u }, 0)); for(int i=0; i