コード例 #1
0
  /**
   * Scans in search of a block peer (open/close). Stops on EOF, or when block peer is found
   * (balance is 0)
   *
   * @return 0 if block peer token was found (even if assumed by a syntax correction), or a count of
   *     how many blocks were left open.
   */
  protected int scanToBlockPeer(
      int expectedTokenIx, FnTokenAdvance fnAdvance, BlockTokenRule[] blockTkRules) {
    assertTrue(expectedTokenIx >= 0 && expectedTokenIx < blockTkRules.length);
    while (fnAdvance.advanceToken() != TOKEN_EOF) {
      for (int i = 0; i < blockTkRules.length; i++) {
        BlockTokenRule blockRule = blockTkRules[i];

        if (token == blockRule.close) {
          int pendingBlocks = scanToBlockPeer(i, fnAdvance, blockTkRules);
          if (pendingBlocks > 0) {
            return pendingBlocks + 1;
          }
          break;
        }
        if (token == blockRule.open) {
          if (i == expectedTokenIx) {
            return 0;
          } else {
            // syntax error
            if (i < expectedTokenIx) {
              // Stronger rule takes precedence.
              // Assume syntax correction, as if blockRule[expectedTokenIx].open was found:
              fnAdvance.revertToken();
              token = TOKEN_INVALID;
              return 0;
            } else {
              // ignore token
            }
          }
          break;
        }
      }
    }
    return 1; // Balance is 1 if we reached the end without finding peer
  }
コード例 #2
0
  protected int findUnmatchedOpen(int requiredPriority) {
    while (prevTokenFn.advanceToken() != TOKEN_EOF) {
      for (int i = 0; i < blockRules.length; i++) {
        BlockTokenRule blockRule = blockRules[i];

        if (token == blockRule.close) {
          // do a subscan
          if (scanToBlockPeer(i, prevTokenFn, blockRules) > 0) {
            // block start not found, so there is an unmatched close
            return -1;
          }
          break;
        }
        if (token == blockRule.open
            && (getPriorityOfBlockToken((char) token) <= requiredPriority)) {
          return 1;
        }
      }
    }
    return 0;
  }