case ':': backslash = false; if(token == Token.NULL && lastKeyword == offset) { addToken((i+1) - lastOffset,Token.LABEL); lastOffset = i + 1; lastKeyword = lastOffset; } break;
	public byte markTokensImpl(byte token, Segment line, int lineIndex)	{		int offset = line.offset;		int lastOffset = offset;		int lastKeyword = offset;		int length = line.count + offset;		boolean backslash = false;loop:		for(int i = offset; i < length; i++)		{			char c = line.array[i];			switch(c)			{			case '\\':				backslash = !backslash;				break;			case '*':				if((token == Token.COMMENT1 || token == Token.COMMENT2)					&& length - i > 1)				{					backslash = false;					if(length - i > 1 && line.array[i+1] == '/')					{						i++;						addToken((i+1) - lastOffset,token);						token = Token.NULL;						lastOffset = i + 1;						lastKeyword = lastOffset;					}					break;				}			case ':':				backslash = false;				if(token == Token.NULL && lastKeyword == offset)				{					addToken((i+1) - lastOffset,Token.LABEL);					lastOffset = i + 1;					lastKeyword = lastOffset;				}				break;			case '#':				backslash = false;				if(cpp && token == Token.NULL)				{					token = Token.KEYWORD2;					addToken(i - lastOffset,Token.NULL);					addToken(length - i,Token.KEYWORD2);					lastOffset = length;					break loop;				}				break;			case '/':				backslash = false;				if(token == Token.NULL && length - i > 1)				{					switch(line.array[i+1])					{					case '*':						addToken(i - lastOffset,token);						lastOffset = i;						lastKeyword = lastOffset;						if(length - i > 2 && line.array[i+2] == '*')							token = Token.COMMENT2;						else							token = Token.COMMENT1;						break;                        		case '/':						addToken(i - lastOffset,token);						addToken(length - i,Token.COMMENT1);						lastOffset = length;						lastKeyword = lastOffset;						break loop;					}				}				break;			case '"':				if(backslash)					backslash = false;				else if(token == Token.NULL)				{					token = Token.LITERAL1;					addToken(i - lastOffset,Token.NULL);					lastOffset = i;					lastKeyword = lastOffset;				}				else if(token == Token.LITERAL1)				{					token = Token.NULL;					addToken((i+1) - lastOffset,Token.LITERAL1);					lastOffset = i + 1;					lastKeyword = lastOffset;				}				break;			case '\'':				if(backslash)					backslash = false;				else if(token == Token.NULL)				{					token = Token.LITERAL2;					addToken(i - lastOffset,Token.NULL);					lastOffset = i;					lastKeyword = lastOffset;				}				else if(token == Token.LITERAL2)				{					token = Token.NULL;					addToken((i+1) - lastOffset,Token.LITERAL1);					lastOffset = i + 1;					lastKeyword = lastOffset;				}				break;			default:				backslash = false;				if(token == Token.NULL && c != '_' &&					!Character.isLetter(c))				{					int len = i - lastKeyword;					byte id = keywords.lookup(line,lastKeyword,len);					if(id != Token.NULL)					{						if(lastKeyword != lastOffset)							addToken(lastKeyword - lastOffset,Token.NULL);						addToken(len,id);						lastOffset = i;					}					lastKeyword = i + 1;				}				break;			}		}		if(token == Token.NULL)		{			int len = length - lastKeyword;			byte id = keywords.lookup(line,lastKeyword,len);			if(id != Token.NULL)			{				if(lastKeyword != lastOffset)					addToken(lastKeyword - lastOffset,Token.NULL);				addToken(len,id);				lastOffset = length;			}		}		if(lastOffset != length)		{			if(token == Token.LITERAL1 || token == Token.LITERAL2)			{				addToken(length - lastOffset,Token.INVALID);				token = Token.NULL;			}			else				addToken(length - lastOffset,token);		}		if(token == Token.KEYWORD2 && !backslash)			token = Token.NULL;		return token;	}