/** * 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 }
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; }