nextLineRequested = (oldRule != newRule || oldParent != newParent);
if(lineIndex != lastTokenizedLine) { nextLineRequested = false; lastTokenizedLine = lineIndex; }  nextLineRequested |= (oldRule != newRule || oldParent != newParent);
	public Token markTokens(Segment line, int lineIndex)	{		if(lineIndex >= length)		{			throw new IllegalArgumentException("Tokenizing invalid line: "				+ lineIndex);		}		LineInfo info = lineInfo[lineIndex];		/* If cached tokens are valid, return 'em */		if(info.tokensValid)			return info.firstToken;		/* Otherwise, prepare for tokenization */		info.lastToken = null;		LineInfo prev;		if(lineIndex == 0)			prev = null;		else			prev = lineInfo[lineIndex - 1];		ParserRule oldRule = info.context.inRule;		LineContext oldParent = info.context.parent;		markTokensImpl(line,prev,info);		ParserRule newRule = info.context.inRule;		LineContext newParent = info.context.parent;		info.tokensValid = true;		nextLineRequested = (oldRule != newRule ||			oldParent != newParent);		if(nextLineRequested && length - lineIndex > 1)		{			lineInfo[lineIndex + 1].tokensValid = false;		}		addToken(info,0,Token.END);		return info.firstToken;	}