From bc2858abab718e5c3d0cf07c4f18f353f57832e6 Mon Sep 17 00:00:00 2001 From: adam Date: Thu, 13 Jul 2006 06:04:58 -0400 Subject: [PATCH] checkpoint darcs-hash:20060713100458-5007d-aaed953c38abcac4290bbdaf3206065230075b78.gz --- .../sbp/meta/AnnotationGrammarBindingResolver.java | 1 + src/edu/berkeley/sbp/meta/MetaGrammarBindings.java | 41 +++++++++++++++++--- src/edu/berkeley/sbp/misc/RegressionTests.java | 4 +- src/edu/berkeley/sbp/util/Reflection.java | 1 + tests/testcase.g | 2 +- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java index 381fafc..3aa832a 100644 --- a/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java +++ b/src/edu/berkeley/sbp/meta/AnnotationGrammarBindingResolver.java @@ -59,6 +59,7 @@ public class AnnotationGrammarBindingResolver extends GrammarBindingResolver { // helper private static void add(Class cl, ArrayList alc, ArrayList alm) { + if (cl==null) return; for(Method m : cl.getDeclaredMethods()) alm.add(m); for(Class c : cl.getDeclaredClasses()) { diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index d33758c..bddccf5 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -13,8 +13,11 @@ import java.io.*; public class MetaGrammarBindings { /** A grammar (a set of nonterminals) */ - public static class GrammarNode extends HashMap { - public @bind.as("Grammar") GrammarNode(NonTerminalNode[] nonterminals) { + public static class GrammarNode extends HashMap implements NonTerminalSource { + public NonTerminalNode[] getNonTerminals() { + return (NonTerminalNode[])values().toArray(new NonTerminalNode[0]); + } + public GrammarNode(NonTerminalNode[] nonterminals) { for(NonTerminalNode nt : nonterminals) { if (nt==null) continue; if (this.get(nt.name)!=null) @@ -22,6 +25,22 @@ public class MetaGrammarBindings { this.put(nt.name, nt); } } + public @bind.as("Grammar") GrammarNode(Object[] nt) { + add(nt); + } + private void add(Object[] obs) { + for(Object o : obs) { + if (o==null) continue; + else if (o instanceof Object[]) add((Object[])o); + else if (o instanceof NonTerminalNode) { + NonTerminalNode nt = (NonTerminalNode)o; + if (this.get(nt.name)!=null) + throw new RuntimeException("duplicate definition of nonterminal \""+nt.name+"\""); + this.put(nt.name, nt); + } + else if (o instanceof NonTerminalSource) add(((NonTerminalSource)o).getNonTerminals()); + } + } public String toString() { String ret = "[ "; for(NonTerminalNode nt : values()) ret += nt + ", "; @@ -63,15 +82,27 @@ public class MetaGrammarBindings { } } - public static @bind.as("#import") NonTerminalNode poundimport(String fileName) { + public static @bind.as("#import") GrammarNode poundimport(String fileName) { System.err.println("#import " + fileName); - return null; + try { + Tree t = new CharParser(MetaGrammar.make()).parse(new FileInputStream(fileName)).expand1(); + Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); + return (MetaGrammarBindings.GrammarNode)red.invoke(t); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public static interface NonTerminalSource { + public NonTerminalNode[] getNonTerminals(); } - public static class NonTerminalNode extends UnionNode { + public static class NonTerminalNode extends UnionNode implements NonTerminalSource { 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 NonTerminalNode(String name, Seq[][] sequences, boolean rep) { this(name, sequences, rep, null); } public NonTerminalNode(String name, Seq[][] sequences, boolean rep, String sep) { diff --git a/src/edu/berkeley/sbp/misc/RegressionTests.java b/src/edu/berkeley/sbp/misc/RegressionTests.java index e4aa179..302e5a2 100644 --- a/src/edu/berkeley/sbp/misc/RegressionTests.java +++ b/src/edu/berkeley/sbp/misc/RegressionTests.java @@ -37,8 +37,8 @@ public class RegressionTests { Union meta = MetaGrammar.make(res, "s"); System.err.println("parsing " + s[1]); - SequenceInputStream sis = new SequenceInputStream(new FileInputStream(s[0]), new FileInputStream(s[1])); - res = new CharParser(meta).parse(sis).expand1(); + //SequenceInputStream sis = new SequenceInputStream(new FileInputStream(s[0]), new FileInputStream(s[1])); + res = new CharParser(meta).parse(new FileInputStream(s[1])).expand1(); Union testcasegrammar = MetaGrammar.make(res, "ts", new TestCaseMaker()); if (testcasegrammar==null) return; diff --git a/src/edu/berkeley/sbp/util/Reflection.java b/src/edu/berkeley/sbp/util/Reflection.java index a7c2539..cb45e8f 100644 --- a/src/edu/berkeley/sbp/util/Reflection.java +++ b/src/edu/berkeley/sbp/util/Reflection.java @@ -233,6 +233,7 @@ public final class Reflection { } public static Object rethrow(Exception e, String message) { + e.printStackTrace(); StackTraceElement[] st = e.getStackTrace(); RuntimeException re = new RuntimeException(e.getMessage() + "\n " + message); re.setStackTrace(st); diff --git a/tests/testcase.g b/tests/testcase.g index cec736c..5212e91 100644 --- a/tests/testcase.g +++ b/tests/testcase.g @@ -1,4 +1,4 @@ -#import meta.g +#import tests/meta.g ts = ts:: ws! tests ws! tests = test */ ws -- 1.7.10.4