X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;h=8b4ee2e80459cd504b74a399eed9b4be39e87e00;hb=9773bb358e8010b24cc487f7cae19edcf8aea5d0;hp=bddccf57b30a0ea594f04cac3aadae979dd1aefc;hpb=bc2858abab718e5c3d0cf07c4f18f353f57832e6;p=sbp.git diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index bddccf5..8b4ee2e 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -12,6 +12,9 @@ import java.io.*; /** The java classes typically used to represent a parsed grammar AST; each inner class is a type of AST node. */ public class MetaGrammarBindings { + // FIXME ugly ugly ugly scary dangerous + public static String prefix = ""; + /** A grammar (a set of nonterminals) */ public static class GrammarNode extends HashMap implements NonTerminalSource { public NonTerminalNode[] getNonTerminals() { @@ -82,12 +85,20 @@ public class MetaGrammarBindings { } } - public static @bind.as("#import") GrammarNode poundimport(String fileName) { - System.err.println("#import " + fileName); + public static @bind.as("#import") GrammarNode poundimport(String fileName, String as) { + if (as==null) as = ""; + else if ("".equals(as)) { } + else as = as +"."; + + System.err.println("#import " + fileName + " as " + as); try { - Tree t = new CharParser(MetaGrammar.make()).parse(new FileInputStream(fileName)).expand1(); + Tree t = new CharParser(MetaGrammar.make()).parse(new FileInputStream("tests/"+fileName)).expand1(); Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); - return (MetaGrammarBindings.GrammarNode)red.invoke(t); + String oldprefix = prefix; + prefix = as; + GrammarNode gn = (GrammarNode)red.invoke(t); + prefix = oldprefix; + return gn; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); @@ -106,10 +117,10 @@ public class MetaGrammarBindings { 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 = name; + this.name = prefix + name; this.sequences = sequences; this.rep = rep; - this.sep = sep; + this.sep = prefix + sep; } public Element build(Context cx, NonTerminalNode cnt) { return cx.get(name); } public void build(Context cx, Union u, NonTerminalNode cnt) { @@ -206,14 +217,14 @@ public class MetaGrammarBindings { } public Seq(ElementNode e) { this(new ElementNode[] { e }); } public Seq(ElementNode[] elements) { this.elements = elements; } - public Seq tag(String tag) { this.tag = tag; return this; } + public Seq tag(String tag) { this.tag = prefix+tag; return this; } public Seq follow(ElementNode follow) { this.follow = follow; return this; } public Seq dup() { Seq ret = new Seq(elements); ret.and.addAll(and); ret.not.addAll(not); ret.follow = follow; - ret.tag = tag; + ret.tag = prefix+tag; return ret; } public Seq and(Seq s) { and.add(s); s.lame = true; return this; } @@ -238,7 +249,7 @@ public class MetaGrammarBindings { } public Sequence build0(Context cx, boolean lame, NonTerminalNode cnt) { boolean dropAll = lame; - if (tag!=null && "()".equals(tag)) dropAll = true; + if (tag!=null && tag.endsWith("()")) dropAll = true; boolean[] drops = new boolean[elements.length]; Element[] els = new Element[elements.length]; for(int i=0; i