- public static @nonterminal class NonTerminal extends El {
- public @arg("Word") String name;
- public @arg("RHS") Seq[][] sequences;
- private static int anon = 0;
- public NonTerminal() { }
- public NonTerminal(Seq[][] sequences) {
- this.name = "anon" + (anon++);
+ public abstract static class Un extends El {
+ public Seq[][] sequences;
+ public void build(Context cx, Union u) {
+ HashSet<Sequence> bad2 = new HashSet<Sequence>();
+ for(int i=0; i<sequences.length; i++) {
+ Seq[] group = sequences[i];
+ Union u2 = new Union();
+ if (sequences.length==1) u2 = u;
+ for(int j=0; j<group.length; j++) {
+ group[j].build(cx, u2, false);
+ }
+ if (sequences.length==1) break;
+ Sequence seq = Sequence.singleton(u2);
+ for(Sequence s : bad2) {
+ s.lame = true;
+ seq = seq.not(s);
+ }
+ u.add(seq);
+ bad2.add(Sequence.singleton(u2));
+ }
+ }
+ }
+ public static class NonTerminal extends Un {
+ public String name = null;
+ public @nonterminal("NonTerminal") NonTerminal(@arg("Word") String name,
+ @arg("RHS") Seq[][] sequences) {
+ this.name = name;
+ this.sequences = sequences;
+ }
+ public Element build(Context cx) { return cx.get(name); }
+ }
+
+ public static class AnonUn extends Un {
+ public @tag("(") AnonUn(Seq[][] sequences) {