+ public static class Constant extends ElementNode {
+ Element constant;
+ public Constant(Element constant) { this.constant = constant; }
+ public Element build(Context cx, NonTerminalNode cnt) { return constant; }
+ }
+ public abstract static class PostProcess extends ElementNode {
+ ElementNode e;
+ public PostProcess(ElementNode e) { this.e = e; }
+ public Element build(Context cx, NonTerminalNode cnt) { return postProcess(e.build(cx, cnt)); }
+ public abstract Element postProcess(Element e);
+ }
+ public static abstract class ElementNode {
+ public String getLabel() { return null; }
+ public String getOwnerTag() { return null; }
+ public boolean drop() { return false; }
+ public abstract Element build(Context cx, NonTerminalNode cnt);
+ }
+
+ public static class Drop extends ElementNode {
+ public ElementNode e;
+ public Drop(ElementNode e) { this.e = e; }
+ public String getLabel() { return null; }
+ public boolean drop() { return true; }
+ public String getOwnerTag() { return e.getOwnerTag(); }
+ public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); }
+ }
+
+ public static class Label extends ElementNode {
+ public String label;
+ public ElementNode e;
+ public Label(String label, ElementNode e) { this.e = e; this.label = label; }
+ public String getLabel() { return label; }
+ public String getOwnerTag() { return e.getOwnerTag(); }
+ public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); }
+ }