// This file is automatically generated by DemeterJ.

SubgraphVisitor {
  {{
    private java.util.Stack history = new java.util.Stack();
    public SubgraphVisitor(Object obj) {
      history.push(obj);
    }
  }}

  before Main {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> ClassGraph, classes, ClassDef_DList {{
    if (is_equal) {
      ClassGraph obj = (ClassGraph) history.peek();
      Object temp1 = obj.get_classes();
      if(temp1==null) { is_equal = false; return; }
      history.push(temp1);
    }
  }}
  after -> ClassGraph, classes, ClassDef_DList {{
    if (is_equal) history.pop();
  }}

  before ClassGraph {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> ClassDef, classname, ClassName {{
    if (is_equal) {
      ClassDef obj = (ClassDef) history.peek();
      Object temp2 = obj.get_classname();
      if(temp2==null) { is_equal = false; return; }
      history.push(temp2);
    }
  }}
  after -> ClassDef, classname, ClassName {{
    if (is_equal) history.pop();
  }}

  before -> ClassDef, classparts, ClassParts {{
    if (is_equal) {
      ClassDef obj = (ClassDef) history.peek();
      Object temp3 = obj.get_classparts();
      if(temp3==null) { is_equal = false; return; }
      history.push(temp3);
    }
  }}
  after -> ClassDef, classparts, ClassParts {{
    if (is_equal) history.pop();
  }}

  before ClassDef {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before ClassParts {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> ConstOrAltClass, parts, PartOrSyntax_List {{
    if (is_equal) {
      ConstOrAltClass obj = (ConstOrAltClass) history.peek();
      Object temp4 = obj.get_parts();
      if(temp4==null) { is_equal = false; return; }
      history.push(temp4);
    }
  }}
  after -> ConstOrAltClass, parts, PartOrSyntax_List {{
    if (is_equal) history.pop();
  }}

  before ConstOrAltClass {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before PartOrSyntax {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Part, partname, PartName {{
    if (is_equal) {
      Part obj = (Part) history.peek();
      Object temp5 = obj.get_partname();
      if(temp5==null) { is_equal = false; return; }
      history.push(temp5);
    }
  }}
  after -> Part, partname, PartName {{
    if (is_equal) history.pop();
  }}

  before -> Part, classspec, ClassSpec {{
    if (is_equal) {
      Part obj = (Part) history.peek();
      Object temp6 = obj.get_classspec();
      if(temp6==null) { is_equal = false; return; }
      history.push(temp6);
    }
  }}
  after -> Part, classspec, ClassSpec {{
    if (is_equal) history.pop();
  }}

  before Part {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> OptionalPart, part, Part_Sandwich {{
    if (is_equal) {
      OptionalPart obj = (OptionalPart) history.peek();
      Object temp7 = obj.get_part();
      if(temp7==null) { is_equal = false; return; }
      history.push(temp7);
    }
  }}
  after -> OptionalPart, part, Part_Sandwich {{
    if (is_equal) history.pop();
  }}

  before OptionalPart {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before ConstructionClass {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> AlternationClass, subclasses, Subclass_Barlist {{
    if (is_equal) {
      AlternationClass obj = (AlternationClass) history.peek();
      Object temp8 = obj.get_subclasses();
      if(temp8==null) { is_equal = false; return; }
      history.push(temp8);
    }
  }}
  after -> AlternationClass, subclasses, Subclass_Barlist {{
    if (is_equal) history.pop();
  }}

  before -> AlternationClass, common, Common {{
    if (is_equal) {
      AlternationClass obj = (AlternationClass) history.peek();
      Object temp9 = obj.get_common();
      if(temp9==null) { is_equal = false; return; }
      history.push(temp9);
    }
  }}
  after -> AlternationClass, common, Common {{
    if (is_equal) history.pop();
  }}

  before AlternationClass {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Subclass, classspec, ClassSpec {{
    if (is_equal) {
      Subclass obj = (Subclass) history.peek();
      Object temp10 = obj.get_classspec();
      if(temp10==null) { is_equal = false; return; }
      history.push(temp10);
    }
  }}
  after -> Subclass, classspec, ClassSpec {{
    if (is_equal) history.pop();
  }}

  before Subclass {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before Common {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> RepetitionClass, sandwiched, RepeatedPart_Sandwich {{
    if (is_equal) {
      RepetitionClass obj = (RepetitionClass) history.peek();
      Object temp11 = obj.get_sandwiched();
      if(temp11==null) { is_equal = false; return; }
      history.push(temp11);
    }
  }}
  after -> RepetitionClass, sandwiched, RepeatedPart_Sandwich {{
    if (is_equal) history.pop();
  }}

  before RepetitionClass {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> RepeatedPart, nonempty, ClassSpec {{
    if (is_equal) {
      RepeatedPart obj = (RepeatedPart) history.peek();
      Object temp12 = obj.get_nonempty();
      if(temp12==null) { is_equal = false; return; }
      history.push(temp12);
    }
  }}
  after -> RepeatedPart, nonempty, ClassSpec {{
    if (is_equal) history.pop();
  }}

  before -> RepeatedPart, repeated, ClassSpec_Sandwich {{
    if (is_equal) {
      RepeatedPart obj = (RepeatedPart) history.peek();
      Object temp13 = obj.get_repeated();
      if(temp13==null) { is_equal = false; return; }
      history.push(temp13);
    }
  }}
  after -> RepeatedPart, repeated, ClassSpec_Sandwich {{
    if (is_equal) history.pop();
  }}

  before RepeatedPart {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> ClassSpec, classname, ClassName {{
    if (is_equal) {
      ClassSpec obj = (ClassSpec) history.peek();
      Object temp14 = obj.get_classname();
      if(temp14==null) { is_equal = false; return; }
      history.push(temp14);
    }
  }}
  after -> ClassSpec, classname, ClassName {{
    if (is_equal) history.pop();
  }}

  before ClassSpec {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before Syntax {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before PlainSyntax {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp15 = host.get_string();
    Object temp16 = ((PlainSyntax) obj).get_string();
    if(temp15 == null && temp16 == null) {}
    else if(temp15 == null ||
            temp16 == null ||
            !temp15.equals(temp16)) { is_equal = false; return; }
  }}

  before DirName {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp17 = host.get_name();
    Object temp18 = ((DirName) obj).get_name();
    if(temp17 == null && temp18 == null) {}
    else if(temp17 == null ||
            temp18 == null ||
            !temp17.equals(temp18)) { is_equal = false; return; }
  }}

  before ClassName {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp19 = host.get_name();
    Object temp20 = ((ClassName) obj).get_name();
    if(temp19 == null && temp20 == null) {}
    else if(temp19 == null ||
            temp20 == null ||
            !temp19.equals(temp20)) { is_equal = false; return; }
  }}

  before PartName {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp21 = host.get_name();
    Object temp22 = ((PartName) obj).get_name();
    if(temp21 == null && temp22 == null) {}
    else if(temp21 == null ||
            temp22 == null ||
            !temp21.equals(temp22)) { is_equal = false; return; }
  }}

  before TraversalName {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp23 = host.get_name();
    Object temp24 = ((TraversalName) obj).get_name();
    if(temp23 == null && temp24 == null) {}
    else if(temp23 == null ||
            temp24 == null ||
            !temp23.equals(temp24)) { is_equal = false; return; }
  }}

  before VisitorName {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp25 = host.get_name();
    Object temp26 = ((VisitorName) obj).get_name();
    if(temp25 == null && temp26 == null) {}
    else if(temp25 == null ||
            temp26 == null ||
            !temp25.equals(temp26)) { is_equal = false; return; }
  }}

  before MethodName {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp27 = host.get_name();
    Object temp28 = ((MethodName) obj).get_name();
    if(temp27 == null && temp28 == null) {}
    else if(temp27 == null ||
            temp28 == null ||
            !temp27.equals(temp28)) { is_equal = false; return; }
  }}

  before JavaCode {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp29 = host.get_code();
    Object temp30 = ((JavaCode) obj).get_code();
    if(temp29 == null && temp30 == null) {}
    else if(temp29 == null ||
            temp30 == null ||
            !temp29.equals(temp30)) { is_equal = false; return; }
  }}

  before PrintVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_indent() == ((PrintVisitor) obj).get_indent();
    is_equal = is_equal && host.get_needSpace() == ((PrintVisitor) obj).get_needSpace();
  }}

  before CopyVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    Object temp31 = host.get_copy();
    Object temp32 = ((CopyVisitor) obj).get_copy();
    if(temp31 == null && temp32 == null) {}
    else if(temp31 == null ||
            temp32 == null ||
            !temp31.equals(temp32)) { is_equal = false; return; }
  }}

  before SubgraphVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_is_equal() == ((SubgraphVisitor) obj).get_is_equal();
  }}

  before EqualVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_is_equal() == ((EqualVisitor) obj).get_is_equal();
  }}

  before DisplayVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_indent() == ((DisplayVisitor) obj).get_indent();
  }}

  before TraceVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
    is_equal = is_equal && host.get_indent() == ((TraceVisitor) obj).get_indent();
  }}

  before UniversalVisitor {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> ClassDef_DList, first, Nonempty_ClassDef_DList {{
    if (is_equal) {
      ClassDef_DList obj = (ClassDef_DList) history.peek();
      Object temp33 = obj.get_first();
      if(temp33==null) { is_equal = false; return; }
      history.push(temp33);
    }
  }}
  after -> ClassDef_DList, first, Nonempty_ClassDef_DList {{
    if (is_equal) history.pop();
  }}

  before ClassDef_DList {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> PartOrSyntax_List, first, Nonempty_PartOrSyntax_List {{
    if (is_equal) {
      PartOrSyntax_List obj = (PartOrSyntax_List) history.peek();
      Object temp34 = obj.get_first();
      if(temp34==null) { is_equal = false; return; }
      history.push(temp34);
    }
  }}
  after -> PartOrSyntax_List, first, Nonempty_PartOrSyntax_List {{
    if (is_equal) history.pop();
  }}

  before PartOrSyntax_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Part_Sandwich, first, Syntax_List {{
    if (is_equal) {
      Part_Sandwich obj = (Part_Sandwich) history.peek();
      Object temp35 = obj.get_first();
      if(temp35==null) { is_equal = false; return; }
      history.push(temp35);
    }
  }}
  after -> Part_Sandwich, first, Syntax_List {{
    if (is_equal) history.pop();
  }}

  before -> Part_Sandwich, inner, Part {{
    if (is_equal) {
      Part_Sandwich obj = (Part_Sandwich) history.peek();
      Object temp36 = obj.get_inner();
      if(temp36==null) { is_equal = false; return; }
      history.push(temp36);
    }
  }}
  after -> Part_Sandwich, inner, Part {{
    if (is_equal) history.pop();
  }}

  before -> Part_Sandwich, second, Syntax_List {{
    if (is_equal) {
      Part_Sandwich obj = (Part_Sandwich) history.peek();
      Object temp37 = obj.get_second();
      if(temp37==null) { is_equal = false; return; }
      history.push(temp37);
    }
  }}
  after -> Part_Sandwich, second, Syntax_List {{
    if (is_equal) history.pop();
  }}

  before Part_Sandwich {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Subclass_Barlist, first, Nonempty_Subclass_Barlist {{
    if (is_equal) {
      Subclass_Barlist obj = (Subclass_Barlist) history.peek();
      Object temp38 = obj.get_first();
      if(temp38==null) { is_equal = false; return; }
      history.push(temp38);
    }
  }}
  after -> Subclass_Barlist, first, Nonempty_Subclass_Barlist {{
    if (is_equal) history.pop();
  }}

  before Subclass_Barlist {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> RepeatedPart_Sandwich, first, Syntax_List {{
    if (is_equal) {
      RepeatedPart_Sandwich obj = (RepeatedPart_Sandwich) history.peek();
      Object temp39 = obj.get_first();
      if(temp39==null) { is_equal = false; return; }
      history.push(temp39);
    }
  }}
  after -> RepeatedPart_Sandwich, first, Syntax_List {{
    if (is_equal) history.pop();
  }}

  before -> RepeatedPart_Sandwich, inner, RepeatedPart {{
    if (is_equal) {
      RepeatedPart_Sandwich obj = (RepeatedPart_Sandwich) history.peek();
      Object temp40 = obj.get_inner();
      if(temp40==null) { is_equal = false; return; }
      history.push(temp40);
    }
  }}
  after -> RepeatedPart_Sandwich, inner, RepeatedPart {{
    if (is_equal) history.pop();
  }}

  before -> RepeatedPart_Sandwich, second, Syntax_List {{
    if (is_equal) {
      RepeatedPart_Sandwich obj = (RepeatedPart_Sandwich) history.peek();
      Object temp41 = obj.get_second();
      if(temp41==null) { is_equal = false; return; }
      history.push(temp41);
    }
  }}
  after -> RepeatedPart_Sandwich, second, Syntax_List {{
    if (is_equal) history.pop();
  }}

  before RepeatedPart_Sandwich {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> ClassSpec_Sandwich, first, Syntax_List {{
    if (is_equal) {
      ClassSpec_Sandwich obj = (ClassSpec_Sandwich) history.peek();
      Object temp42 = obj.get_first();
      if(temp42==null) { is_equal = false; return; }
      history.push(temp42);
    }
  }}
  after -> ClassSpec_Sandwich, first, Syntax_List {{
    if (is_equal) history.pop();
  }}

  before -> ClassSpec_Sandwich, inner, ClassSpec {{
    if (is_equal) {
      ClassSpec_Sandwich obj = (ClassSpec_Sandwich) history.peek();
      Object temp43 = obj.get_inner();
      if(temp43==null) { is_equal = false; return; }
      history.push(temp43);
    }
  }}
  after -> ClassSpec_Sandwich, inner, ClassSpec {{
    if (is_equal) history.pop();
  }}

  before -> ClassSpec_Sandwich, second, Syntax_List {{
    if (is_equal) {
      ClassSpec_Sandwich obj = (ClassSpec_Sandwich) history.peek();
      Object temp44 = obj.get_second();
      if(temp44==null) { is_equal = false; return; }
      history.push(temp44);
    }
  }}
  after -> ClassSpec_Sandwich, second, Syntax_List {{
    if (is_equal) history.pop();
  }}

  before ClassSpec_Sandwich {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Syntax_List, first, Nonempty_Syntax_List {{
    if (is_equal) {
      Syntax_List obj = (Syntax_List) history.peek();
      Object temp45 = obj.get_first();
      if(temp45==null) { is_equal = false; return; }
      history.push(temp45);
    }
  }}
  after -> Syntax_List, first, Nonempty_Syntax_List {{
    if (is_equal) history.pop();
  }}

  before Syntax_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_ClassDef_DList, it, ClassDef {{
    if (is_equal) {
      Nonempty_ClassDef_DList obj = (Nonempty_ClassDef_DList) history.peek();
      Object temp46 = obj.get_it();
      if(temp46==null) { is_equal = false; return; }
      history.push(temp46);
    }
  }}
  after -> Nonempty_ClassDef_DList, it, ClassDef {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_ClassDef_DList, next, Nonempty_ClassDef_DList {{
    if (is_equal) {
      Nonempty_ClassDef_DList obj = (Nonempty_ClassDef_DList) history.peek();
      Object temp47 = obj.get_next();
      if(temp47==null) { is_equal = false; return; }
      history.push(temp47);
    }
  }}
  after -> Nonempty_ClassDef_DList, next, Nonempty_ClassDef_DList {{
    if (is_equal) history.pop();
  }}

  before Nonempty_ClassDef_DList {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_PartOrSyntax_List, it, PartOrSyntax {{
    if (is_equal) {
      Nonempty_PartOrSyntax_List obj = (Nonempty_PartOrSyntax_List) history.peek();
      Object temp48 = obj.get_it();
      if(temp48==null) { is_equal = false; return; }
      history.push(temp48);
    }
  }}
  after -> Nonempty_PartOrSyntax_List, it, PartOrSyntax {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_PartOrSyntax_List, next, Nonempty_PartOrSyntax_List {{
    if (is_equal) {
      Nonempty_PartOrSyntax_List obj = (Nonempty_PartOrSyntax_List) history.peek();
      Object temp49 = obj.get_next();
      if(temp49==null) { is_equal = false; return; }
      history.push(temp49);
    }
  }}
  after -> Nonempty_PartOrSyntax_List, next, Nonempty_PartOrSyntax_List {{
    if (is_equal) history.pop();
  }}

  before Nonempty_PartOrSyntax_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_Subclass_Barlist, it, Subclass {{
    if (is_equal) {
      Nonempty_Subclass_Barlist obj = (Nonempty_Subclass_Barlist) history.peek();
      Object temp50 = obj.get_it();
      if(temp50==null) { is_equal = false; return; }
      history.push(temp50);
    }
  }}
  after -> Nonempty_Subclass_Barlist, it, Subclass {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_Subclass_Barlist, next, Nonempty_Subclass_Barlist {{
    if (is_equal) {
      Nonempty_Subclass_Barlist obj = (Nonempty_Subclass_Barlist) history.peek();
      Object temp51 = obj.get_next();
      if(temp51==null) { is_equal = false; return; }
      history.push(temp51);
    }
  }}
  after -> Nonempty_Subclass_Barlist, next, Nonempty_Subclass_Barlist {{
    if (is_equal) history.pop();
  }}

  before Nonempty_Subclass_Barlist {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  before -> Nonempty_Syntax_List, it, Syntax {{
    if (is_equal) {
      Nonempty_Syntax_List obj = (Nonempty_Syntax_List) history.peek();
      Object temp52 = obj.get_it();
      if(temp52==null) { is_equal = false; return; }
      history.push(temp52);
    }
  }}
  after -> Nonempty_Syntax_List, it, Syntax {{
    if (is_equal) history.pop();
  }}

  before -> Nonempty_Syntax_List, next, Nonempty_Syntax_List {{
    if (is_equal) {
      Nonempty_Syntax_List obj = (Nonempty_Syntax_List) history.peek();
      Object temp53 = obj.get_next();
      if(temp53==null) { is_equal = false; return; }
      history.push(temp53);
    }
  }}
  after -> Nonempty_Syntax_List, next, Nonempty_Syntax_List {{
    if (is_equal) history.pop();
  }}

  before Nonempty_Syntax_List {{
    Object obj = history.peek();
    is_equal = is_equal && obj.getClass().equals(host.getClass());
    if(!is_equal) return;
  }}

  return boolean {{ is_equal }}
}