//========================================================================================= protected override List<BaseElement> CreateElements() { var elements = new List<BaseElement>(); //Идентификаторы в квадратных скобках var oStyle = this.GetStyleByName(S_IDENTIFIER); BoundedElement oGroupId = new BoundedElement(oStyle, "[", "]"); elements.Add(oGroupId); //Однострочные комментарии oStyle = this.GetStyleByName(S_SINGLE_COMMENT); BoundedElement oGroupComment = new BoundedElement(oStyle, "--", ""); elements.Add(oGroupComment); //Многострочные комментарии oStyle = this.GetStyleByName(S_MULTI_COMMENT); BoundedElement oGroupComment2 = new BoundedElement(oStyle, "/*", "*/"); elements.Add(oGroupComment2); //Unicode'овые строковые константы TextStyle oStringTextStyle = this.GetStyleByName(S_STRINGS); BoundedElement oGroupString = new BoundedElement(oStringTextStyle, "N'", "'"); elements.Add(oGroupString); //Строковые константы BoundedElement oGroupString2 = new BoundedElement(oStringTextStyle, "'", "'"); elements.Add(oGroupString2); //Ключевые слова первого эшелона oStyle = this.GetStyleByName(S_KEYWORDS_1); FixedListElement oGroupKw1 = new FixedListElement(oStyle); oGroupKw1.Keywords.AddRange(new string[] { "SELECT", "CREATE", "PARTITION", "FUNCTION", "AS", "RANGE", "FOR", "VALUES", "GO", "SCHEME", "TO", "COLLATE", "ALTER", "NEXT", "USED", "SPLIT", "MERGE", "TABLE", "WITH", "ALLOW_PAGE_LOCKS", "ALLOW_ROW_LOCKS", "ON", "PRIMARY", "KEY", "CLUSTERED", "CHECK", "NOCHECK", "ADD", "DEFAULT", "SWITCH", "DROP", "CONSTRAINT", "UNIQUE", "NONCLUSTERED", "INDEX", "IF", "WHERE", "FROM", "BEGIN", "COMMIT", "TRANSACTION", "USE" , "SPATIAL", "COLUMNSTORE" , "CONTAINS", "MEMORY_OPTIMIZED_DATA", "HASH", "BUCKET_COUNT", "MEMORY_OPTIMIZED", "DURABILITY", "SNAPSHOT", "NATIVE_COMPILATION", "ATOMIC" }); elements.Add(oGroupKw1); //Дополнительные ключевые слова oStyle = this.GetStyleByName(S_KEYWORDS_2); FixedListElement oGroupKw2 = new FixedListElement(oStyle); oGroupKw2.Keywords.AddRange(new string[] { "RIGHT", "LEFT", "NULL", "NOT", "OR", "AND", "IS", "EXISTS" }); elements.Add(oGroupKw2); //Дополнительные ключевые слова oStyle = this.GetStyleByName(S_SYS_FUNCTION); FixedListElement oGroupSysFuncs = new FixedListElement(oStyle); oGroupSysFuncs.Keywords.AddRange(new string[] { "GETDATE", "MONTH", "YEAR", "DAY", "DATEDIFF", "DATEADD", "LEN", "OBJECT_ID" }); elements.Add(oGroupSysFuncs); return elements; }
//========================================================================================= void GetQuotedToken(List<Token> tokens, BoundedElement group) { int iCol, iChar; TextPoint endPoint; Token oToken; string sLine = this.Lines[this.CurPos.Line]; ///Если указан стиль оформления границ блока, то надо создать отдельный токен для начала блока if (group.BoundStyle != null) { iChar = this.CurPos.Char + group.StartSymbols.Length; iCol = TextCaret.GetCol(sLine, iChar, this._TabSize); endPoint = new TextPoint(this.CurPos.Line, iCol, iChar); oToken = new Token( group.StartSymbols, this.CurPos, endPoint, group.BoundStyle); tokens.Add(oToken); this.CurPos = endPoint; } ///Если не указаны конечные символы блока, то блок длится до конца строки if (group.EndSymbols.Length == 0) { string sWord = sLine.Substring(this.CurPos.Char); iCol = TextCaret.GetLastCol(sLine, this._TabSize); oToken = new Token(sWord, this.CurPos, new TextPoint(this.CurPos.Line, iCol, sLine.Length - 1), group.Style); tokens.Add(oToken); this.CurPos.Line++; this.CurPos.Char = 0; this.CurPos.Col = 0; return; } bool bFirstLine = true; while (true) { int iIndex = this.CurPos.Char; if (bFirstLine) iIndex += group.StartSymbols.Length; if (iIndex >= sLine.Length) iIndex = -1; else iIndex = sLine.IndexOf(group.EndSymbols, iIndex); if (iIndex >= 0) { bool bEnd = true; if (group.Escape != null) { int iEscapeIndex = sLine.IndexOf(group.Escape); if (iEscapeIndex >= 0 && iEscapeIndex <= iIndex && iEscapeIndex + group.Escape.Length > iIndex) bEnd = false; } if (bEnd) { if (group.BoundStyle == null) iIndex += group.EndSymbols.Length; string sText = sLine.Substring(this.CurPos.Char, iIndex - this.CurPos.Char); iCol = TextCaret.GetCol(sLine, iIndex, this._TabSize); endPoint = new TextPoint(this.CurPos.Line, iCol, iIndex); tokens.Add(new Token(sText, this.CurPos, endPoint, group.Style)); this.CurPos = endPoint; break; } } iCol = TextCaret.GetLastCol(sLine, this._TabSize); endPoint = new TextPoint(this.CurPos.Line, iCol, sLine.Length); if (bFirstLine) sLine = sLine.Substring(this.CurPos.Char); tokens.Add(new Token(sLine, this.CurPos, endPoint, group.Style)); this.CurPos.Line++; this.CurPos.Char = 0; this.CurPos.Col = 0; if (this.CurPos.Line >= this.Lines.Count) break; sLine = this.Lines[this.CurPos.Line]; bFirstLine = false; } ///Если указан стиль оформления границ блока, то надо создать отдельный токен для конца блока if (group.BoundStyle != null) { iChar = this.CurPos.Char + group.EndSymbols.Length; sLine = this.Lines[this.CurPos.Line]; iCol = TextCaret.GetCol(sLine, iChar, this._TabSize); endPoint = new TextPoint(this.CurPos.Line, iCol, iChar); oToken = new Token( group.EndSymbols, this.CurPos, endPoint, group.BoundStyle); tokens.Add(oToken); this.CurPos = endPoint; } }
//========================================================================================= protected override List<BaseElement> CreateElements() { var elements = new List<BaseElement>(); TextStyle oBoundStyle = new TextStyle("Brackets", Color.Blue); { ///CDATA BoundedElement oBlock = new BoundedElement(new TextStyle("CDATA", Color.Gray), oBoundStyle, "<![CDATA[", "]]>"); elements.Add(oBlock); } { ///комментарии BoundedElement oBlock = new BoundedElement(new TextStyle("Comment", Color.Green), oBoundStyle, "<!--", "-->"); elements.Add(oBlock); } { ///закрывающие теги BoundedElement oBlock = new BoundedElement(new TextStyle("Tag", Color.Black), oBoundStyle, "</", ">"); elements.Add(oBlock); } { ///Простые теги в угловых скобках BoundedElement oBlock = new BoundedElement(new TextStyle("Tag", Color.Black), oBoundStyle, "<", ">"); elements.Add(oBlock); } return elements; }
public void BoundedElements() { ///Задаем настройки TextStyle oStyle = new TextStyle("String", Color.Red); BoundedElement oStringConst = new BoundedElement(oStyle, "'", "'", "''"); NonSyntaxSettings oSettings = new NonSyntaxSettings(); oSettings.Elements.Add(oStringConst); ///Образец текста string sText = "seLect 'xx ''xx[x]'"; List<string> lines = this.GetLines(sText); ///Разбираем SyntaxParser oParser = new SyntaxParser(oSettings, 4); List<Token> tokens = oParser.Parse(lines); ///Проверяем Token oToken; oToken = tokens[1]; Assert.AreEqual(oToken.Style.Name, "String"); Assert.AreEqual(oToken.Text, "'xx ''xx[x]'"); }