/// <summary> /// /// </summary> /// <returns>Next line start context</returns> public LineContext FinalizeLine() { m_tb.PutToken(m_currentContext); if(m_currentContext == BabelTokenContext.CommentSingleLine) { m_currentContext = m_commentContext; m_commentContext = BabelTokenContext.Other; } if(m_currentContext != BabelTokenContext.CommentMultiLine) { //Only multiline comments can be carried to a new line m_currentContext = BabelTokenContext.Other; m_commentContext = BabelTokenContext.Other; } return new LineContext { Context = m_currentContext, CommentContext = m_commentContext }; }
public void ProcessChar(char c) { switch(m_currentContext) { case BabelTokenContext.StringConst: m_tb.SkipChar(); switch(c) { case '\\': m_isEscape = !m_isEscape; break; case '"': if(!m_isEscape) { m_tb.PutToken(BabelTokenType.StringConst); m_currentContext = BabelTokenContext.Other; m_isEscape = false; } break; default: m_isEscape = false; break; } break; case BabelTokenContext.CharConst: m_tb.SkipChar(); switch(c) { case '\\': m_isEscape = !m_isEscape; break; case '\'': if(!m_isEscape) { m_tb.PutToken(BabelTokenType.StringConst); m_currentContext = BabelTokenContext.Other; m_isEscape = false; } break; default: m_isEscape = false; break; } break; case BabelTokenContext.CommentMultiLine: m_tb.SkipChar(); switch(c) { case '/': if(m_isEscape) { m_tb.PutToken(BabelTokenType.Comment); m_isEscape = false; m_currentContext = m_commentContext; } break; case '*': m_isEscape = true; break; default: m_isEscape = false; break; } break; case BabelTokenContext.CommentSingleLine: m_tb.SkipChar(); break; /*case BabelTokenContext.Attribute: m_tb.SkipChar(); switch(c) { case ']': m_tb.PutToken(BabelTokenContext.Attribute); m_currentContext = BabelTokenContext.Other; break; default: break; } break;*/ default: switch(c) { case ' ': case '\t': case '(': case ')': case '{': case '}': case '[': case ']': case ',': case ';': case '<': case '>': case '=': m_tb.PutToken(m_currentContext); m_tb.SkipChar(); m_tb.PutToken(BabelTokenContext.Other); m_isSlash = false; break; case '/': if(m_isSlash) { m_tb.SkipChar(); m_isSlash = false; m_commentContext = m_currentContext; m_currentContext = BabelTokenContext.CommentSingleLine; } else { m_tb.PutToken(m_currentContext); m_tb.SkipChar(); m_isSlash = true; } break; case '*': if(m_isSlash) { m_commentContext = m_currentContext; m_currentContext = BabelTokenContext.CommentMultiLine; } m_tb.SkipChar(); m_isSlash = false; break; case '@': m_tb.PutToken(m_currentContext); m_tb.SkipChar(); m_currentContext = BabelTokenContext.BabelContext; m_isSlash = false; break; /*case '[': m_tb.PutToken(m_currentContext); m_tb.SkipChar(); m_currentContext = BabelTokenContext.Attribute; m_isSlash = false; break;*/ case '"': m_tb.PutToken(m_currentContext); m_tb.SkipChar(); m_currentContext = BabelTokenContext.StringConst; m_isSlash = false; break; case '\'': m_tb.PutToken(m_currentContext); m_tb.SkipChar(); m_currentContext = BabelTokenContext.CharConst; m_isSlash = false; break; default: m_tb.AddChar(c); m_isSlash = false; break; } break; } }
public Analizer(int locationStart, ITextSnapshotLine snapshotSpan, LineContext startContext, IClassificationTypeRegistryService typeService, List<ITagSpan<ClassificationTag>> result) { m_tb = new TokenBuilder(locationStart, snapshotSpan, typeService, result); m_currentContext = startContext.Context; m_commentContext = startContext.CommentContext; }
public int PutToken(BabelTokenContext context) { BabelTokenType tt; switch(context) { case BabelTokenContext.CharConst: case BabelTokenContext.StringConst: tt = BabelTokenType.StringConst; break; /*case BabelTokenContext.Attribute: tt = BabelTokenType.BabelOther; break;*/ case BabelTokenContext.CommentSingleLine: case BabelTokenContext.CommentMultiLine: tt = BabelTokenType.Comment; break; case BabelTokenContext.BabelContext: tt = BabelTokenType.BabelContext; break; default: tt = Classify(); break; } return PutToken(tt); }