Переключение на Главную Страницу Страницы: 1 [2]  ОтправитьПечать
Горячая тема (более 10 ответов) Проблема взаимопонимания с регулярными выражениями (число прочтений - 8610 )
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #15 - 19. Марта 2009 :: 18:32
Печать  
JohnyDeath писал(а) 19. Марта 2009 :: 12:25:
vandalsvq писал(а) 19. Марта 2009 :: 11:37:
Поэтому пожалуй счас добью парсинг всех полей таблиц (т.е. чтобы не писать ID а писать ТекущийЭлемент, не писать IDDOC а писать ТекущийДокумент и т.д.)... потом напишу мини FAQ... а дальше уже буду вирт. таблицами заниматься

А если в конфигурации будут реквизиты с именами "ТекущийЭлемент" и "ТекущийДокумент"? ИМХО, зря ты это затеял.
Про ВТ. Вот здесь лежит класс steban-a, немного мною дополненный (в свете последних изменений 1sqlite, там надо будет ВТ "Последнее значение" немного подправить)


Я думал над этой проблемой и решил ее следующим образом...
1. Получаю конструкцию (\$[\wа-я]+)\.([\wа-я]+) из нее получаю
- все выражение
- конструкцию $xxxxx и конструкцию после точки
2. Ищу в тексте конструкцию ИЗ или СОЕДИНЕНИЕ Тип.Вид КАК xxxxx
3. Оттуда соответственно получаю тип и вид и исходя из этого либо парсю (меняю на ID и т.п.) либо оставляю как есть... Не находит конструкцию оставляет как есть
Пока проблем не выявил и вроде пробовал и в спр. делал реквизит ТекущийДокумент, и в Док. делал ТекущийСправочник, Наименование и т.п....

Есть "Но" есть проблемы... но меня ими мало напугать можно. По крайней мере пока к стенке не прижмусь  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #16 - 20. Марта 2009 :: 07:51
Печать  
vandalsvq писал(а) 19. Марта 2009 :: 18:32:
пробовал и в спр. делал реквизит ТекущийДокумент, и в Док. делал ТекущийСправочник, Наименование и т.п....

хитрый  Улыбка
а в справочнике сделать реквизит ТекущийЭлемент и в документе "ТекущийДокумент"?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #17 - 20. Марта 2009 :: 09:10
Печать  
Я правильно понял, что ты хочешь сделать некий обобщенный язык запросов и потом транслировать его в язык запросов конкретного движка (Fox SQL, TSQL, sqlite)?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #18 - 20. Марта 2009 :: 09:21
Печать  
Я бы подошел к такой задаче с другой стороны..

Регекспы не сильно удобны при разборе грамматик.
Например, нужно учесть, что запросы или выражения бывают вложенными. В общем виде такое при помощи регулярных выражений не решается. Можно решить для ограниченного количества уровней вложенности, но шаблоны при этом становятся страшными крокодилами - вот например шаблон для выделения одного параметра ВТ:
Код
Выбрать все
((?:\((?:[^()]|""[^""]*""|'[^']*'|\((?:[^()]|""[^""]*""|'[^']*'|\((?:[^()]|""[^""]*""|'[^']*'|\([^()]*\))*\))*\))*\)|""[^""]*""|'[^']*'|[^,()""'])*) 



Советую посмотреть в сторону Parsing expression grammars (PEGs). Такой подход позволит тебе описав грамматику твоего языка, получать дерево синтаксического разбора, а из этого дерева гораздо проще будет получить текст на выходном языке.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #19 - 20. Марта 2009 :: 09:24
Печать  
Для PEG есть красивая и быстрая реализация в виде либы для Lua - LPeg.
А с Lua в 1с мы работать уже умеем Подмигивание
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #20 - 20. Марта 2009 :: 09:42
Печать  
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #21 - 20. Марта 2009 :: 11:44
Печать  
Цитата:
Я правильно понял, что ты хочешь сделать некий обобщенный язык запросов и потом транслировать его в язык запросов конкретного движка (Fox SQL, TSQL, sqlite)?


Да именно это я счас и делаю. Только вот для SQL - TSQL, для DBF - SQLite. А с FOXом я пока не дружу.. как то не сложилось пока  Улыбка

На счет общих правил и что можно решить регэкспом...
Я посмотрел решение ВТОстатки на sqlite и AccountRecordset и... да... шаблон там нихренанечитаемый на первый взгляд. В целом вроде я все решил, правда конечно остается место для "финта ушами". Пока конечно обхожусь. Тут даже не переводе в язык проблем больше а с учетом особенностей языков. И соответственно рождаются различные ограничения. Вроде того что обязательно надо писать
Код
Выбрать все
ВЫБРАТЬ [b]$Спр.[/b]ТекущийЭлемент ИЗ Справочник.Контрагенты [b]КАК Спр[/b] 


иначе полезут ошибки. В общем я на суд общественности отдам тогда когда хотя бы ВТ по регистрам впихну туда.
Ну а если упрусь в стену то... посмотрим.

А то что ты предложил я почитаю и посмотрю.  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 [2] 
ОтправитьПечать