/** A grammar (a set of nonterminals) */
public static class GrammarNode extends HashMap<String,NonTerminalNode> {
public @bind.as("Grammar") GrammarNode(NonTerminalNode[] nonterminals) {
- for(NonTerminalNode nt : nonterminals) this.put(nt.name, nt); }
+ for(NonTerminalNode nt : nonterminals) {
+ if (this.get(nt.name)!=null)
+ throw new RuntimeException("duplicate definition of nonterminal \""+nt.name+"\"");
+ this.put(nt.name, nt);
+ }
+ }
public String toString() {
String ret = "[ ";
for(NonTerminalNode nt : values()) ret += nt + ", ";
public static @bind.as("~") ElementNode tilde(final ElementNode e) {
return new PostProcess(e) {
public Element postProcess(Element e) {
- return infer((Topology<Character>)Atom.toAtom(e).complement());
+ return infer((Topology<Character>)Atom.toAtom(e).complement().minus(CharRange.braces));
} }; }
public static @bind.as("Word") String word(String s) { return s; }