public MainWindow() { InitializeComponent(); var testQuery1 = @"SELECT COUNT(1) AS Col1, Table1.Column1 AS Col2"; var testQuery2 = @"SELECT Table1.Column1, Table2.Column2 FROM Table1 INNER JOIN Table2 T2 ON T2.Id = Table1.Id WHERE T2.Id < 300 AND Table1.Id > 10 AND Table1.Name LIKE '%Svensson' ORDER BY T2.Id"; var test3 = "server.[Databas 1].dbo.[Id Column 2]"; //var p = new SqlTokenizer(x => new Lexer(x)); //var result = p.Process(testQuery2); //var parser = new sql1(); //var result = parser.Parse("SELECT COUNT(1) AS Col1, COUNT(1) Col3, Table1.Column1 AS Col2, Table1.Column1 FROM Table1 T2"); //var parser = new FuzzySqlParser(); //var result = parser.Parse("SELECT COUNT(1) AS Col1, COUNT(1) Col3, Table1.Column1 AS Col2, Table1.Column1 , (SELECT * FROM SOMETHING) AS T INSERT INTO Table WHERE x = y"); var lexer = new SqlParser.Lexer("1234.123+456456"); var result = lexer.Tokenize(); Console.WriteLine("Antal = " + result.ToString()); }
protected bool IsMatchingString(Lexer lexer, string text) { if (lexer.Current == text[0]) { if (text.Length == 1) { lexer.Next(); return true; } if (lexer.Peek == text[1]) { if (text.Length == 2) { lexer.Next(); lexer.Next(); return true; } else { throw new NotImplementedException("Har inte implementerat lämförelse för strängar än två tecken."); } } } return false; }
public override bool Match(Lexer lexer, out State result) { int startPos = lexer.Pos; if (IsMatchingString(lexer, MatchString)) { result = new State(Type, startPos, lexer.Pos - startPos); return true; } result = new State(); return false; }
public override bool Match(Lexer lexer, out State result) { int startPos = lexer.Pos; if (IsMatchingString(lexer, Start)) { if (EscapeCharacter == null) { do { if (IsMatchingString(lexer, End)) { result = new State(Type, startPos, lexer.Pos - startPos); return true; } } while (lexer.Next()); // Det här är specialfall som uppstår om man inte har något sluttecken och vi kommer till slutet på texten. // I teorin är det inte en träff, men jag vill ändå räkna det som en träff fast som inte är komplett. result = new State(Type, startPos, lexer.Pos - startPos, true); return true; } else { do { if (lexer.Current == EscapeCharacter) { // Är det nuvarande tecknet samma som escape så hoppa över det och nästa. lexer.Next(); } else if (IsMatchingString(lexer, End)) { result = new State(Type, startPos, lexer.Pos - startPos); return true; } } while (lexer.Next()); // Det här är specialfall som uppstår om man inte har något sluttecken och vi kommer till slutet på texten. // I teorin är det inte en träff, men jag vill ändå räkna det som en träff fast som inte är komplett. result = new State(Type, startPos, lexer.Pos - startPos, true); return true; } } result = new State(); return false; }
public abstract bool Match(Lexer lexer, out State result);
public override bool Match(Lexer lexer, out State result) { if (!lexer.IsLetter) { result = new State(); return false; } int startPos = lexer.Pos; while (lexer.Next()) { if (!(lexer.IsLetterOrDigit || lexer.Current == '_')) break; } var foundWord = lexer.GetSubArray(startPos, lexer.Pos - startPos).ToString().ToUpper(); result = new State(SpecialWords.ContainsKey(foundWord) ? SpecialWords[foundWord] : Type, startPos, lexer.Pos - startPos); return true; }