getActionToken(context.inRule.action));
context.inRule.token);
	private void markTokensImpl(Segment line, LineInfo prevInfo,		LineInfo info)	{		LineContext lastContext = (prevInfo == null ? null			: prevInfo.context);		if(lastContext == null) lastContext = new LineContext(null,			getRuleSet(rulePfx.concat("MAIN")));		context = info.context;		context.parent = (lastContext.parent == null ? null			: (LineContext)lastContext.parent.clone());		context.inRule = lastContext.inRule;		context.rules = lastContext.rules;		lastOffset = lastKeyword = line.offset;		lineLength = line.count + line.offset;		int terminateChar = context.rules.getTerminateChar();		int searchLimit = (terminateChar >= 0 && terminateChar < line.count)			? line.offset + terminateChar : lineLength;		escaped = false;		boolean b;		boolean tempEscaped;		Segment tempPattern;		ParserRule rule;		LineContext tempContext;		for(pos = line.offset; pos < searchLimit; pos++)		{			// if we are not in the top level context, we are delegated			if (context.parent != null)			{				tempContext = context;				context = context.parent;				pattern.array = context.inRule.searchChars;				pattern.count = context.inRule.sequenceLengths[1];				pattern.offset = context.inRule.sequenceLengths[0];				b = handleRule(info, line, context.inRule);				context = tempContext;				if (!b)				{					if (escaped)					{						escaped = false;					}					else					{						if (pos != lastOffset)						{							if (context.inRule == null)							{								markKeyword(info,line, lastKeyword, pos);								addToken(info,pos - lastOffset,									getActionToken(context.rules.getDefault()));							}							else if ((context.inRule.action & (NO_LINE_BREAK | NO_WORD_BREAK)) == 0)							{								addToken(info,pos - lastOffset,									getActionToken(context.inRule.action));							}							else							{								addToken(info,pos - lastOffset, Token.INVALID);							}						}						context = (LineContext) context.parent;						if ((context.inRule.action & EXCLUDE_MATCH) == EXCLUDE_MATCH)						{							addToken(info,pattern.count,								getActionToken(context.rules.getDefault()));						}						else						{							addToken(info,pattern.count, getActionToken(context.inRule.action));						}						context.inRule = null;						lastKeyword = lastOffset = pos + pattern.count;					}					pos += (pattern.count - 1); // move pos to last character of match sequence					continue;				}			}			// check the escape rule for the current context, if there is one			if ((rule = context.rules.getEscapeRule()) != null)			{				// assign tempPattern to mutable "buffer" pattern				tempPattern = pattern;				// swap in the escape pattern				pattern = context.rules.getEscapePattern();				tempEscaped = escaped;				b = handleRule(info, line, rule);				// swap back the buffer pattern				pattern = tempPattern;				if (!b)				{					if (tempEscaped) escaped = false;					continue;				}			}			if (context.inRule != null &&				(context.inRule.action & SOFT_SPAN) == 0)			{				// we are in a hard span rule, so see if context.inRule matches				pattern.array = context.inRule.searchChars;				pattern.count = context.inRule.sequenceLengths[1];				pattern.offset = context.inRule.sequenceLengths[0];				handleRule(info, line, context.inRule);			}			else			{				// otherwise, if this isn't a hard span, check every rule				rule = context.rules.getRules(line.array[pos]);				while(rule != null)				{					pattern.array = rule.searchChars;					if (context.inRule == rule && (rule.action & SPAN) == SPAN)					{						pattern.count = rule.sequenceLengths[1];						pattern.offset = rule.sequenceLengths[0];					}					else					{						pattern.count = rule.sequenceLengths[0];						pattern.offset = 0;					}					// stop checking rules if there was a match and go to next pos					if (!handleRule(info,line, rule))						break;					rule = rule.next;				}			}			escaped = false;		}		// check for keywords at the line's end		if(context.inRule == null)			markKeyword(info, line, lastKeyword, lineLength);		// mark all remaining characters		if(lastOffset != lineLength)		{			if (context.inRule == null)			{				addToken(info,lineLength - lastOffset,					getActionToken(context.rules.getDefault()));			}			else if (				(context.inRule.action & SPAN) == SPAN &&				(context.inRule.action & (NO_LINE_BREAK | NO_WORD_BREAK)) != 0			)			{				addToken(info,lineLength - lastOffset,Token.INVALID);				context.inRule = null;			}			else			{				addToken(info,lineLength - lastOffset, getActionToken(context.inRule.action));				if((context.inRule.action & MARK_FOLLOWING) == MARK_FOLLOWING)				{					context.inRule = null;				}			}		}		info.context = context;	}