//=========================================================================================
		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;
		}
Beispiel #2
0
		//=========================================================================================
		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;
		}
Beispiel #4
0
		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]'");
		}