void CreateSyntaxHighlightInfo(string expression_str, out List <ExpressionTextBox.ColorChangeInfo> color_changes) { color_changes = new List <ExpressionTextBox.ColorChangeInfo>(); Tokenizer tokenizer = new Tokenizer(expression_str, true); ExpressionTextBox.ColorChangeInfo prev_color = new ExpressionTextBox.ColorChangeInfo(0, -1, -1); ExpressionTextBox.ColorChangeInfo color; for (; ;) { int token_length; try { Token token = tokenizer.GetNextToken(); token_length = token.length; color.text_index = token.pos; color.back_color_index = m_ColorInfo.back_color_normal; switch (token.type) { case TokenType.OpNot: case TokenType.OpUpcase: case TokenType.OpLocase: case TokenType.OpLcap: case TokenType.OpContains: case TokenType.OpStartsWith: case TokenType.OpEndsWith: case TokenType.OpConcat: case TokenType.OpEquals: case TokenType.OpNotEquals: case TokenType.OpRegexMatch: case TokenType.OpRegexNotMatch: case TokenType.OpAnd: case TokenType.OpXor: case TokenType.OpOr: case TokenType.Ternary: color.fore_color_index = m_ColorInfo.color_operator; break; case TokenType.String: color.fore_color_index = m_ColorInfo.color_string_literal; break; case TokenType.Variable: color.fore_color_index = m_ColorInfo.color_const_or_variable; break; case TokenType.If: case TokenType.Else: color.fore_color_index = m_ColorInfo.color_keyword; break; case TokenType.OpenBrace: case TokenType.CloseBrace: case TokenType.OpenBracket: case TokenType.CloseBracket: color.fore_color_index = m_ColorInfo.color_brackets; break; case TokenType.SingleLineComment: color.fore_color_index = m_ColorInfo.color_comment; break; default: color.fore_color_index = m_ColorInfo.color_default; break; case TokenType.EOF: color.fore_color_index = -1; break; } } catch (TokenizerException ex) { int pos = ex.ErrorPos; token_length = 1; color.text_index = pos; color.fore_color_index = m_ColorInfo.color_bad_token; color.back_color_index = m_ColorInfo.back_color_error; tokenizer.ResetAndGoToPosition(pos + 1); } // color of space between tokens if (prev_color.text_index < color.text_index) { if (prev_color.back_color_index != m_ColorInfo.back_color_normal) { color_changes.Add(new ExpressionTextBox.ColorChangeInfo(prev_color.text_index, -1, m_ColorInfo.back_color_normal)); prev_color.back_color_index = m_ColorInfo.back_color_normal; } } if (prev_color.fore_color_index != color.fore_color_index || prev_color.back_color_index != color.back_color_index) { ExpressionTextBox.ColorChangeInfo change; change.text_index = color.text_index; change.fore_color_index = prev_color.fore_color_index != color.fore_color_index ? color.fore_color_index : -1; change.back_color_index = prev_color.back_color_index != color.back_color_index ? color.back_color_index : -1; color_changes.Add(change); } // Check for eof if (color.fore_color_index < 0) { break; } prev_color.text_index = color.text_index + token_length; prev_color.fore_color_index = color.fore_color_index; prev_color.back_color_index = color.back_color_index; } }
void CreateSyntaxHighlightInfo(string expression_str, out List<ExpressionTextBox.ColorChangeInfo> color_changes) { color_changes = new List<ExpressionTextBox.ColorChangeInfo>(); Tokenizer tokenizer = new Tokenizer(expression_str, true); ExpressionTextBox.ColorChangeInfo prev_color = new ExpressionTextBox.ColorChangeInfo(0, -1, -1); ExpressionTextBox.ColorChangeInfo color; for (; ; ) { int token_length; try { Token token = tokenizer.GetNextToken(); token_length = token.length; color.text_index = token.pos; color.back_color_index = m_ColorInfo.back_color_normal; switch (token.type) { case TokenType.OpNot: case TokenType.OpUpcase: case TokenType.OpLocase: case TokenType.OpLcap: case TokenType.OpContains: case TokenType.OpStartsWith: case TokenType.OpEndsWith: case TokenType.OpConcat: case TokenType.OpEquals: case TokenType.OpNotEquals: case TokenType.OpRegexMatch: case TokenType.OpRegexNotMatch: case TokenType.OpAnd: case TokenType.OpXor: case TokenType.OpOr: case TokenType.Ternary: color.fore_color_index = m_ColorInfo.color_operator; break; case TokenType.String: color.fore_color_index = m_ColorInfo.color_string_literal; break; case TokenType.Variable: color.fore_color_index = m_ColorInfo.color_const_or_variable; break; case TokenType.If: case TokenType.Else: color.fore_color_index = m_ColorInfo.color_keyword; break; case TokenType.OpenBrace: case TokenType.CloseBrace: case TokenType.OpenBracket: case TokenType.CloseBracket: color.fore_color_index = m_ColorInfo.color_brackets; break; case TokenType.SingleLineComment: color.fore_color_index = m_ColorInfo.color_comment; break; default: color.fore_color_index = m_ColorInfo.color_default; break; case TokenType.EOF: color.fore_color_index = -1; break; } } catch (TokenizerException ex) { int pos = ex.ErrorPos; token_length = 1; color.text_index = pos; color.fore_color_index = m_ColorInfo.color_bad_token; color.back_color_index = m_ColorInfo.back_color_error; tokenizer.ResetAndGoToPosition(pos + 1); } // color of space between tokens if (prev_color.text_index < color.text_index) { if (prev_color.back_color_index != m_ColorInfo.back_color_normal) { color_changes.Add(new ExpressionTextBox.ColorChangeInfo(prev_color.text_index, -1, m_ColorInfo.back_color_normal)); prev_color.back_color_index = m_ColorInfo.back_color_normal; } } if (prev_color.fore_color_index != color.fore_color_index || prev_color.back_color_index != color.back_color_index) { ExpressionTextBox.ColorChangeInfo change; change.text_index = color.text_index; change.fore_color_index = prev_color.fore_color_index != color.fore_color_index ? color.fore_color_index : -1; change.back_color_index = prev_color.back_color_index != color.back_color_index ? color.back_color_index : -1; color_changes.Add(change); } // Check for eof if (color.fore_color_index < 0) break; prev_color.text_index = color.text_index + token_length; prev_color.fore_color_index = color.fore_color_index; prev_color.back_color_index = color.back_color_index; } }