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

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Вот из этого
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

Сообщений: 34580
Дата регистрации: 28.05.2002
alex;
интересно - я на правильном пути?
Не вникал, но думаю что да. Как получишь результат - отпишись


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Igor Korolyov
alex;
интересно - я на правильном пути?
Не вникал, но думаю что да. Как получишь результат - отпишись

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

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Хе-хе,
есть промежуточный рез-т
вселяет надежду ))
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;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Вот тут красиво
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 слушателей



Исправлено 1 раз(а). Последнее : alex;, 02.03.17 22:42
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Появилась возможность продолжить
Часть текста скрыта
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_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.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");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
this.VisitSql_clause(ctx.sql_clause(ii));
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
public override string VisitSql_clause(tsqlParser.Sql_clauseContext ctx)
{
Console.WriteLine("VisitSql_clause");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Dml_clauseContext")
{
this.VisitSelect_statement(ctx.dml_clause().select_statement());
}
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
public override string VisitSelect_statement([NotNull] tsqlParser.Select_statementContext ctx)
{
Console.WriteLine("VisitSelect_statement");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Query_expressionContext")
{
this.VisitQuery_expression(ctx.query_expression());
}
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
public override string VisitQuery_expression([NotNull] tsqlParser.Query_expressionContext ctx)
{
Console.WriteLine("VisitQuery_expression");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Query_specificationContext")
{
this.VisitQuery_specification(ctx.query_specification());
}
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
public override string VisitQuery_specification([NotNull] tsqlParser.Query_specificationContext ctx)
{
Console.WriteLine("VisitQuery_specification");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
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 VisitTable_sources([NotNull] tsqlParser.Table_sourcesContext ctx)
{
Console.WriteLine("VisitTable_sources");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Table_sourceContext")
{
this.VisitTable_source(ctx.table_source(ii));
}
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
public override string VisitTable_source([NotNull] tsqlParser.Table_sourceContext ctx)
{
Console.WriteLine("VisitTable_source");
int ii = 0;
//Console.WriteLine(ctx.ToStringTree());
Console.WriteLine("ctx.ChildCount " + ctx.ChildCount.ToString());
for (ii = 0; ii < ctx.ChildCount; ++ii)
{
Console.WriteLine(ctx.GetChild(ii).GetType().ToString());
if (ctx.GetChild(ii).GetType().ToString() == "tsqlParser+Table_source_item_joinedContext")
{
this.VisitTable_source_item_joined(ctx.table_source_item_joined());
}
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
public override string VisitTable_source_item_joined([NotNull] tsqlParser.Table_source_item_joinedContext ctx)
{
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_sourcesContext")
//{
// this.VisitTable_sources(ctx.table_sources());
//}
}
//Console.WriteLine(ctx.GetChild<tsqlParser.i>().ToString());
return ctx.ToString();
}
}
}


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

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Да, и чота я не пойму для чего используется метод accept в шаблоне Visitor.

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

Ответ



Исправлено 1 раз(а). Последнее : alex;, 21.10.17 20:45
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
KvanTTT
Посмотрел на ваш код визиторов. Вы неправильно их используете. Внутри визитора можно напрямую обращаться к узлам дерева, а не перебирать их с помощью GetChild и GetType.
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
упростил

рез-т



Исправлено 1 раз(а). Последнее : alex;, 21.10.17 23:42
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
alex;
рез-т

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

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

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

Осталось только обработать их.
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
А вообще какой-то странный код.
Что в нем не так?
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();
}
}
}



Исправлено 2 раз(а). Последнее : alex;, 22.10.17 08:21
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
С Listener похоже меньше кода писать(т.к. еще подзапросы в where надо обработать), но обход всех узлов, что для этой задачи не критично.



Исправлено 2 раз(а). Последнее : alex;, 22.10.17 09:55
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Ну собственно и так работает
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
Гулин Федор

Сообщений: 4633
Откуда: Минск
Дата регистрации: 24.10.2002
то что работает отлично
а на выходе то что получилось - Реально пригодилось ?

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

Сообщений: 2969
Дата регистрации: 24.04.2004
Глянем в постановку задачи:

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;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
не,не
я еще не закончил
ща читаю
нашел книжки круть
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
S-type

Сообщений: 2969
Дата регистрации: 24.04.2004
Думаю, если ты все эти книжки прочтёшь, мы тебя лет через 10 увидим, а то и 20.
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Пираты Силиконовой Долины(1999)
Наше дело выяснить насколько этот парень не знает, что ему на самом деле нужно и добиться, чтобы до него это дошло.
Чтобы он понял, что только мы можем ему это дать.
Ratings: 0 negative/0 positive
Re: Вопрос знактокам рег. выражений
alex;
Автор

Сообщений: 2850
Откуда: Москва
Дата регистрации: 23.11.2004
Гулин Федор
то что работает отлично
а на выходе то что получилось - Реально пригодилось ?

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

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

Польза...

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

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

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

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

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

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


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

On-line: 4 (Гостей: 4)

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