public class MetaGrammarBindings {
/** 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 static class GrammarNode extends HashMap<String,NonTerminalNode> {
+ public @bind.as("Grammar") GrammarNode(NonTerminalNode[] nonterminals) {
+ for(NonTerminalNode nt : nonterminals) this.put(nt.name, nt); }
public String toString() {
String ret = "[ ";
- for(NonTerminal nt : values()) ret += nt + ", ";
+ for(NonTerminalNode nt : values()) ret += nt + ", ";
return ret + " ]";
}
}
}
}
- public static class NonTerminal extends UnionNode {
+ public static class NonTerminalNode extends UnionNode {
public boolean rep;
public String name = null;
public String sep = null;
- public @bind NonTerminal(@bind.arg String name, @bind.arg Seq[][] sequences) { this(name, sequences, false); }
- public NonTerminal(String name, Seq[][] sequences, boolean rep) { this(name, sequences, rep, null); }
- public NonTerminal(String name, Seq[][] sequences, boolean rep, String sep) {
+ 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.sequences = sequences;
this.rep = rep;
}
}
}
- public static @bind.as("=") NonTerminal go(@bind.arg String name, @bind.arg Seq[][] sequences) { return new NonTerminal(name, sequences, true); }
- public static @bind.as("=") NonTerminal go(@bind.arg String name, @bind.arg String sep, @bind.arg Seq[][] sequences) {
- return new NonTerminal(name, sequences, true, sep);
+ public static @bind.as("=") NonTerminalNode go(@bind.arg String name, @bind.arg Seq[][] sequences) { return new NonTerminalNode(name, sequences, true); }
+ public static @bind.as("=") NonTerminalNode go(@bind.arg String name, @bind.arg String sep, @bind.arg Seq[][] sequences) {
+ return new NonTerminalNode(name, sequences, true, sep);
}
public static class AnonUnionNode extends UnionNode {
public static @bind.as(")") void close(String foo) { throw new Error("not supported"); }
public static @bind.as("()") ElementNode epsilon() { return new Constant(Union.epsilon); }
- public static @bind class NonTerminalReference extends ElementNode {
+ public static @bind.as("NonTerminalReference") class NonTerminalReferenceNode extends ElementNode {
public @bind.arg String nonTerminal;
public Element build(MetaGrammar.Context cx) { return cx.get(nonTerminal); }
}
public static @bind.as("^^") void doublecaret(final ElementNode e) { throw new Error("not implemented"); }
- //public static @bind.as("(") ElementNode subexpression(Seq[][] rhs) { return new NonTerminal(rhs); }
+ //public static @bind.as("(") ElementNode subexpression(Seq[][] rhs) { return new NonTerminalNode(rhs); }
public static @bind.as("Word") String word(String s) { return s; }
public static @bind.as("Quoted") String quoted(String s) { return s; }