code: private void parseConditionalSect(char[] saved) throws Exception {
          skipWhitespace();
          if (tryRead("INCLUDE")) {
              skipWhitespace();
              require('[');
              // VC: Proper Conditional Section/PE Nesting
              if (readBuffer != saved) {
                  handler.verror("Illegal Conditional Section/PE nesting");
              }
              skipWhitespace();
              while (!tryRead("]]>")) {
                  parseMarkupdecl();
                  skipWhitespace();
              }
          } else if (tryRead("IGNORE")) {
              skipWhitespace();
              require('[');
              // VC: Proper Conditional Section/PE Nesting
              if (readBuffer != saved) {
                  handler.verror("Illegal Conditional Section/PE nesting");
              }
              char c;
              expandPE = false;
              for (int nest = 1; nest > 0;) {
                  c = readCh();
                  switch (c) {
                      case '<':
                          if (tryRead("![")) {
                              nest++;
                          }
                          break;
                      case ']':
                          if (tryRead("]>")) {
                              nest--;
                          }
                  }
              }
              expandPE = true;
          } else {
              fatal("conditional section must begin with INCLUDE or IGNORE");
          }
      }
docs: Parse a conditional section.
  
  <pre>
  [61] conditionalSect ::= includeSect || ignoreSect
  [62] includeSect ::= '&lt;![' S? 'INCLUDE' S? '['
  extSubsetDecl ']]&gt;'
  [63] ignoreSect ::= '&lt;![' S? 'IGNORE' S? '['
  ignoreSectContents* ']]&gt;'
  [64] ignoreSectContents ::= Ignore
  ('&lt;![' ignoreSectContents* ']]&gt;' Ignore )*
  [65] Ignore ::= Char* - (Char* ( '&lt;![' | ']]&gt;') Char* )
  </pre>
  
  <p>
  NOTE: the '&gt;![' has already been read.