checkpoint
[sbp.git] / src / edu / berkeley / sbp / meta / MetaGrammarBindings.java
index ca3b7fe..6b12da9 100644 (file)
@@ -9,20 +9,20 @@ import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.io.*;
 
+/** The java classes typically used to represent a parsed grammar AST */
 public class MetaGrammarBindings {
-    public static @bind class Grammar {
-        public NonTerminal get(String s) {
-            for(NonTerminal nt : nonterminals)
-                if (nt.name.equals(s)) return nt;
-            return null;
-        }
-        public @bind.arg NonTerminal[] nonterminals;
+
+    /** A grammar (a set of nonterminals) */
+    public static class Grammar extends HashMap<String,NonTerminal> {
+        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) {
@@ -45,6 +45,7 @@ public class MetaGrammarBindings {
             }
         }
     }
+
     public static class NonTerminal extends Un {
         public String  name = null;
         public @bind NonTerminal(@bind.arg String name,
@@ -66,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;
     }