X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmeta%2FMetaGrammarBindings.java;h=f32ea7ab5bd4a33607524fa5b31d86b895550439;hb=afcdc8ab8e5f02d99da3fd79e9c1b0be3f0f7aaa;hp=f780e80744ca456c972bd417b56199bddb8f2681;hpb=bc986bc0c8201f3fd02fefd6e9bb9a8f4decac34;p=sbp.git diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index f780e80..f32ea7a 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -11,21 +11,18 @@ import java.io.*; /** The java classes typically used to represent a parsed grammar AST */ public class MetaGrammarBindings { - public static class Grammar { - public NonTerminal get(String s) { - for(NonTerminal nt : nonterminals) - if (nt.name.equals(s)) return nt; - return null; - } - public NonTerminal[] nonterminals; - public Grammar() { } - public @bind Grammar(NonTerminal[] nonterminals) { this.nonterminals = nonterminals; } + + /** A grammar (a set of nonterminals) */ + public static class Grammar extends HashMap { + public @bind Grammar(NonTerminal[] nonterminals) { + for(NonTerminal nt : nonterminals) this.put(nt.name, nt); } public String toString() { String ret = "[ "; - for(NonTerminal nt : nonterminals) ret += nt + ", "; + for(NonTerminal nt : values()) ret += nt + ", "; return ret + " ]"; } } + public abstract static class Un extends El { public Seq[][] sequences; public void build(MetaGrammar.Context cx, Union u) { @@ -48,6 +45,7 @@ public class MetaGrammarBindings { } } } + public static class NonTerminal extends Un { public String name = null; public @bind NonTerminal(@bind.arg String name, @@ -69,10 +67,9 @@ public class MetaGrammarBindings { } } - //public static @bind.as void range(char c) { } public static class Range { - public @bind.as("range") Range(char only) { first = only; last = only; } - public @bind.as("-") Range(char first, char last) { this.first = first; this.last = last; } + public @bind Range(char only) { first = only; last = only; } + public @bind Range(char first, char last) { this.first = first; this.last = last; } public char first; public char last; } @@ -187,7 +184,7 @@ public class MetaGrammarBindings { public static @bind.as(")") void close(String foo) { throw new Error("not supported"); } public static @bind.as("()") El epsilon() { return new Constant(Union.epsilon); } - public static @bind.as("nonTerminal") class NonTerminalReference extends El { + public static @bind class NonTerminalReference extends El { public @bind.arg String nonTerminal; public Element build(MetaGrammar.Context cx) { return cx.get(nonTerminal);