for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Не фоксом единым
   :: Помощь сайту :: 

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 02.03.17 08:49:55ОтветитьЦитировать
Вот из этого
www.theendian.com
habrahabr.ru

получилось
  
  using System;  
  using System.IO;  
  using Antlr4.Runtime;  
    
  namespace tsql1  
  {  
      class Program  
      {  
          static void Main(string[] args)  
          {  
              try  
              {  
                    
                  string text = System.IO.File.ReadAllText(@"c:\dev\antlr4\grammars-v4-master\tsql\examples\dml_select.sql");  
                  StringReader reader = new StringReader(text);  
                  // В качестве входного потока символов устанавливаем ...  
                  AntlrInputStream input = new AntlrInputStream(reader);  
                  // Настраиваем лексер на этот поток  
                  tsqlLexer lexer = new tsqlLexer(input);  
                  // Создаем поток токенов на основе лексера  
                  CommonTokenStream tokens = new CommonTokenStream(lexer);  
                  // Создаем парсер  
                  tsqlParser parser = new tsqlParser(tokens);  
                  // Specify our entry point  
                  tsqlParser.Select_statementContext tsqlSelect_statementContext = parser.select_statement();  
    
                  // Walk it and attach our listener  
                  Antlr4.Runtime.Tree.ParseTreeWalker walker = new Antlr4.Runtime.Tree.ParseTreeWalker();  
                  AntlrTsqListener listener = new AntlrTsqListener();  
                  walker.Walk(listener, tsqlSelect_statementContext);  
              }  
              catch (Exception e)  
              {  
                  Console.WriteLine(e.Message);  
              }  
              Console.ReadKey();  
          }  
    
      }  
      public class AntlrTsqListener: tsqlBaseListener  
      {  
          public override void EnterSql_clause(tsqlParser.Sql_clauseContext ctx)  
          {  
              Console.WriteLine(ctx.GetText());  
          }  
    
      }  
  }

интересно - я на правильном пути?
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
Igor Korolyov

Сообщений: 30649
Дата: 02.03.17 12:30:52ОтветитьЦитировать
alex;
интересно - я на правильном пути?
Не вникал, но думаю что да. Как получишь результат - отпишись


------------------
WBR, Igor
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2194
Дата: 02.03.17 15:44:17ОтветитьЦитировать
Igor Korolyov
alex;
интересно - я на правильном пути?
Не вникал, но думаю что да. Как получишь результат - отпишись

Будем следить за этим триллером. Кстати, можно отписываться даже если результат далёк от ожидаемого.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 02.03.17 20:01:03ОтветитьЦитировать
Хе-хе,
есть промежуточный рез-т
вселяет надежду ))
  
  using System;  
  using System.IO;  
  using Antlr4.Runtime;  
    
  namespace tsql1  
  {  
      class Program  
      {  
          static void Main(string[] args)  
          {  
              try  
              {  
                    
                  string text = System.IO.File.ReadAllText(@"c:\dev\antlr4\grammars-v4-master\tsql\examples\dml_select.sql");  
                  StringReader reader = new StringReader(text);  
                  // В качестве входного потока символов устанавливаем ...  
                  AntlrInputStream input = new AntlrInputStream(reader);  
                  // Настраиваем лексер на этот поток  
                  tsqlLexer lexer = new tsqlLexer(input);  
                  // Создаем поток токенов на основе лексера  
                  CommonTokenStream tokens = new CommonTokenStream(lexer);  
                  // Создаем парсер  
                  tsqlParser parser = new tsqlParser(tokens);  
                  // Specify our entry point  
                  tsqlParser.Tsql_fileContext Tsql_fileContext1 = parser.tsql_file();  
    
                  // Walk it and attach our listener  
                  Antlr4.Runtime.Tree.ParseTreeWalker walker = new Antlr4.Runtime.Tree.ParseTreeWalker();  
                  AntlrTsqListener listener = new AntlrTsqListener();  
                  walker.Walk(listener, Tsql_fileContext1);  
              }  
              catch (Exception e)  
              {  
                  Console.WriteLine(e.Message);  
              }  
              Console.ReadKey();  
          }  
    
      }  
      public class AntlrTsqListener: tsqlBaseListener  
      {  
          public override void EnterQuery_specification(tsqlParser.Query_specificationContext ctx)  
          {  
              int ii = 0;  
              //Console.WriteLine(ctx.ToStringTree());  
              Console.WriteLine("ctx.ChildCount" + ctx.ChildCount.ToString());  
              for (ii = 0; ii < ctx.ChildCount; ++ii)  
              {  
                  Console.WriteLine("ii=" + ii.ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetType().ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetText());  
              }  
              //Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());  
          }  
      }  
  }

Рез-т
Цитата:
ctx.ChildCount6
ii=0
Antlr4.Runtime.Tree.TerminalNodeImpl
SELECT
ii=1
tsqlParser+Select_listContext
Name,ProductNumber,ListPriceASPrice
ii=2
Antlr4.Runtime.Tree.TerminalNodeImpl
FROM
ii=3
tsqlParser+Table_sourcesContext
Production.Product
ii=4
Antlr4.Runtime.Tree.TerminalNodeImpl
WHERE
ii=5
tsqlParser+Search_conditionContext
ProductLine='R'ANDDaysToManufacture<4

Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 02.03.17 21:40:09ОтветитьЦитировать
Вот тут красиво
ivanyu.me
[attachment 27146 antlr2.png]

тока бы разобраться с
Цитата:
The main idea of AST generation using ANTLR’s listeners is to use stacks. Stacks are you first mate when you’re dealing with broad class of problems on trees.

и здесь
habrahabr.ru

Цитата:
если на одном дереве сейчас параллельно запущено 5 слушателей



Исправлено: alex;, 02.03.17 21:42
Ratings: 0 negative/0 positive


Вложения:
[antlr2.png (15KB)]  

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 21.10.17 19:50:03ОтветитьЦитировать

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 21.10.17 19:53:24ОтветитьЦитировать
Да, и чота я не пойму для чего используется метод accept в шаблоне Visitor.

Я использую тока Visit*

Ответ



Исправлено: alex;, 21.10.17 20:45
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 21.10.17 20:53:09ОтветитьЦитировать
KvanTTT
Посмотрел на ваш код визиторов. Вы неправильно их используете. Внутри визитора можно напрямую обращаться к узлам дерева, а не перебирать их с помощью GetChild и GetType.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 21.10.17 23:42:18ОтветитьЦитировать

Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2194
Дата: 21.10.17 23:42:55ОтветитьЦитировать
alex;
рез-т

Я дико извиняюсь. Но, это именно тот результат, который нужен? IMHO, мне показалось, что работает правило мясокомбината.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 21.10.17 23:47:50ОтветитьЦитировать
Конечная цель - получить связи между таблицами, используемые во всех FROM.

Текущий рез-т обход только нужных узлов.

Осталось только обработать их.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 22.10.17 08:01:07ОтветитьЦитировать
А вообще какой-то странный код.
Что в нем не так?
  
  using System;  
  using System.IO;  
  using Antlr4.Runtime;  
  using Antlr4.Runtime.Misc;  
    
  namespace tsql1  
  {  
      class Program  
      {  
          static void Main(string[] args)  
          {  
              //try  
              //{  
                    
                  string text = System.IO.File.ReadAllText(@"c:\dev\antlr4\grammars-v4-master\tsql\examples\dml_insert.sql");  
                  StringReader reader = new StringReader(text);  
                  // В качестве входного потока символов устанавливаем ...  
                  AntlrInputStream input = new AntlrInputStream(reader);  
                  // Настраиваем лексер на этот поток  
                  tsqlLexer lexer = new tsqlLexer(input);  
                  // Создаем поток токенов на основе лексера  
                  CommonTokenStream tokens = new CommonTokenStream(lexer);  
                  // Создаем парсер  
                  tsqlParser parser = new tsqlParser(tokens);  
                  // Specify our entry point  
                  //tsqlParser.Query_specificationContext    
                  tsqlParser.Tsql_fileContext Tsql_fileContext1 = parser.tsql_file();  
              Console.WriteLine("Tsql_fileContext1.ChildCount = " + Tsql_fileContext1.ChildCount.ToString());  
    
              /*                // Walk it and attach our listener  
                              Antlr4.Runtime.Tree.ParseTreeWalker walker = new Antlr4.Runtime.Tree.ParseTreeWalker();  
                              AntlrTsqListener listener = new AntlrTsqListener();  
                              walker.Walk(listener, Tsql_fileContext1);*/  
              AntlrTsqVisitor visitor = new AntlrTsqVisitor();  
                  var result = visitor.Visit(Tsql_fileContext1);  
              //}  
              //    catch (Exception e)  
              //{  
              //    Console.WriteLine(e.Message);  
              //}  
              Console.ReadKey();  
          }  
    
      }  
  /*  
      public class AntlrTsqListener: tsqlBaseListener  
      {  
          public override void EnterQuery_specification(tsqlParser.Query_specificationContext ctx)  
          {  
              int ii = 0;  
              //Console.WriteLine(ctx.ToStringTree());  
              Console.WriteLine("ctx.ChildCount" + ctx.ChildCount.ToString());  
              for (ii = 0; ii < ctx.ChildCount; ++ii)  
              {  
                  Console.WriteLine("ii=" + ii.ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetType().ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetText());  
              }  
              //Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());  
          }  
      }  
     */  
    
      public class AntlrTsqVisitor : tsqlBaseVisitor<String>  
      {  
    
          public override string VisitSql_clauses(tsqlParser.Sql_clausesContext ctx)  
          {  
              Console.WriteLine("VisitSql_clauses");  
              return VisitChildren(ctx).ToString();  
          }  
          public override string VisitSql_clause(tsqlParser.Sql_clauseContext ctx)  
          {  
              Console.WriteLine("VisitSql_clause");  
              try  
              {  
                  return VisitDml_clause(ctx.dml_clause()).ToString();  
              }  
              catch (Exception e)  
              {  
                  return "";  
              }  
          }  
          public override string VisitDml_clause(tsqlParser.Dml_clauseContext ctx)  
          {  
              Console.WriteLine("VisitDml_clause");  
              return VisitChildren(ctx).ToString();  
          }  
    
          public override string VisitSelect_statement([NotNull] tsqlParser.Select_statementContext ctx)  
          {  
              Console.WriteLine("VisitSelect_statement");  
              return VisitTable_sources(ctx.query_expression().query_specification().table_sources()).ToString();  
          }  
          public override string VisitDelete_statement([NotNull] tsqlParser.Delete_statementContext ctx)  
          {  
              Console.WriteLine("VisitDelete_statement");  
              try  
              {  
                  return VisitTable_sources(ctx.table_sources());  
              }  
              catch (Exception e)  
              {  
                  return "";  
              }  
          }  
          public override string VisitUpdate_statement([NotNull] tsqlParser.Update_statementContext ctx)  
          {  
              Console.WriteLine("VisitUpdate_statement");  
              try  
              {  
                  return VisitTable_sources(ctx.table_sources());  
              }  
              catch (Exception e)  
              {  
                  return "";  
              }  
          }  
          public override string VisitInsert_statement([NotNull] tsqlParser.Insert_statementContext ctx)  
          {  
              Console.WriteLine("VisitInsert_statement");  
              try  
              {  
                  return VisitTable_sources(ctx.insert_statement_value().derived_table().subquery().select_statement().query_expression().query_specification().table_sources());  
              }  
              catch (Exception e)  
              {  
                  return "";  
              }  
          }  
          public override string VisitTable_sources([NotNull] tsqlParser.Table_sourcesContext ctx)  
          {  
              Console.WriteLine("VisitTable_sources");  
              return VisitChildren(ctx).ToString();  
          }  
          public override string VisitTable_source([NotNull] tsqlParser.Table_sourceContext ctx)  
          {  
              Console.WriteLine("VisitTable_source");  
              return VisitChildren(ctx).ToString();  
          }  
          public override string VisitTable_source_item_joined([NotNull] tsqlParser.Table_source_item_joinedContext ctx)  
          {  
              Console.WriteLine("VisitTable_source_item_joined");  
              return VisitChildren(ctx).ToString();  
          }  
          public override string VisitTable_source_item([NotNull] tsqlParser.Table_source_itemContext ctx)  
          {  
              Console.WriteLine("VisitTable_source_item");  
              int ii = 0;  
              //Console.WriteLine(ctx.ToStringTree());  
              Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());  
              for (ii = 0; ii < ctx.ChildCount; ++ii)  
              {  
                  Console.WriteLine("ii=" + ii.ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetType().ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetText());  
                  //if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Table_sourcesContext")  
                  //{  
                  //    this.VisitTable_sources(ctx.table_sources());  
                  //}  
              }  
              //Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());  
              return ctx.ToString();  
          }  
          public override string VisitJoin_part([NotNull] tsqlParser.Join_partContext ctx)  
          {  
              Console.WriteLine("VisitJoin_part");  
              int ii = 0;  
              //Console.WriteLine(ctx.ToStringTree());  
              Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());  
              for (ii = 0; ii < ctx.ChildCount; ++ii)  
              {  
                  Console.WriteLine("ii=" + ii.ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetType().ToString());  
                  Console.WriteLine(ctx.GetChild(ii).GetText());  
                  if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Table_sourceContext")  
                  {  
                      this.VisitTable_source(ctx.table_source());  
                  }  
              }  
              //Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());  
              return ctx.ToString();  
          }  
      }  
  }



Исправлено: alex;, 22.10.17 08:21
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 22.10.17 08:25:31ОтветитьЦитировать
С Listener похоже меньше кода писать(т.к. еще подзапросы в where надо обработать), но обход всех узлов, что для этой задачи не критично.



Исправлено: alex;, 22.10.17 09:55
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 22.10.17 09:33:42ОтветитьЦитировать
Ну собственно и так работает
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
Гулин Федор

Сообщений: 3726
Откуда: Минск
Дата: 23.10.17 13:34:31ОтветитьЦитировать
то что работает отлично
а на выходе то что получилось - Реально пригодилось ?

зы как минимум разобоартьс в чужом коде - уже польза
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2194
Дата: 23.10.17 21:55:31ОтветитьЦитировать
Глянем в постановку задачи:

alex;
есть sql server и сотни хранимых процедур
и нет схемы данных

захотелось получить из хранимок табличку связей
из запросов типа
  
  select ...  
  from tab1 t1, tab2 t2...  
  where t1.f1 = t2.f2 and t2.f5 = t1.f2 ...
таблицу
ид_связи|таб1|таб2|поле_таб1|поле_таб2

Табличку в студию.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 23.10.17 23:01:20ОтветитьЦитировать
не,не
я еще не закончил
ща читаю
нашел книжки круть
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2194
Дата: 23.10.17 23:24:52ОтветитьЦитировать
Думаю, если ты все эти книжки прочтёшь, мы тебя лет через 10 увидим, а то и 20.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 24.10.17 07:10:07ОтветитьЦитировать
Пираты Силиконовой Долины(1999)
Наше дело выяснить насколько этот парень не знает, что ему на самом деле нужно и добиться, чтобы до него это дошло.
Чтобы он понял, что только мы можем ему это дать.
Ratings: 0 negative/0 positive

Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 1750
Откуда: Москва
Дата: 24.10.17 07:36:27ОтветитьЦитировать
Гулин Федор
то что работает отлично
а на выходе то что получилось - Реально пригодилось ?

зы как минимум разобоартьс в чужом коде - уже польза

Те кому это нужно уволили меня

Польза...

Зачем люди решают задачи и осваивают методики решения задач?

Когда-то я смотрел на досовские IDE, как на чудо,
а в 2014 году адаптировал за две недели дебагер
Harbour в HbIDE. И это без глубоких навыков владения плюсами.

Нас пугают чипованием людей и прочим. Это все фигня,
все государства уже отстали от прогресса на века.

Вы видели когда-нидь программы для разработки кораблей, автомобилей?
Все это скоро станет доступно.

И что-же первое вы распечатаете на 3d-принтере,
когда у вас будут модели чего угодно?

Вот я пока не знаю, что мне на самом деле нужно.
Ratings: 0 negative/0 positive



Извините, только зарегистрированные пользователи могут писать в этом форуме.

On-line: 34 Sawradym  and Guests: 33


© 2000-2018 Fox Club 
Яндекс.Метрика