Автор Тема: Простой парсер (правильный цикл)  (Прочитано 10337 раз)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #15 : Август 06, 2012, 08:15:47 am »
http://oberspace.dyndns.org/index.php/topic,300.msg7115.html#msg7115
 :-X
Ну, а что еще на черном море делать кроме написания простеньких парсеров на правильных циклах?
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #16 : Август 07, 2012, 03:00:33 pm »
Просто конечный автомат, древовидная структура - и указатель на текущее место в ней. Со спуском в созданный элемент и подъёмом вверх при закрывающей скобке.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #17 : Август 07, 2012, 06:35:30 pm »
Просто конечный автомат, древовидная структура - и указатель на текущее место в ней. Со спуском в созданный элемент и подъёмом вверх при закрывающей скобке.
В принципе "конечный автомат" можно и убрать (состояний маловато :) )  и останется просто: "Просто древо..."

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #18 : Август 07, 2012, 09:40:24 pm »
http://oberspace.dyndns.org/index.php/topic,300.msg7115.html#msg7115
 :-X
Ну, а что еще на черном море делать кроме написания простеньких парсеров на правильных циклах?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #19 : Август 07, 2012, 09:41:12 pm »
http://oberspace.dyndns.org/index.php/topic,300.msg7115.html#msg7115
 :-X
Ну, а что еще на черном море делать кроме написания простеньких парсеров на правильных циклах?
Я его уж года полтора назад написал. Потратил пару минут на обеденном перерыве. :) Задача элементарная. Потому я и предлагаю всем поделиться своими подходами и инструментами. Судя по предыдущим элементарным задачкам подход и предпочтения у всех сильно разные :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #20 : Сентябрь 25, 2012, 08:30:53 pm »
Я его уж года полтора назад написал. Потратил пару минут на обеденном перерыве.

Че то тема интереса не вызвала. Ну да ладно.

Вот откопал мое поделие:
Функция РазобратьТекст(Источник) Экспорт
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Значение");
ТекущаяСтрока = Дерево.Строки.Добавить();
ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
ТекущийРодитель = ТекущаяСтрока.Родитель;
ИсходныйТекст = Источник.ПолучитьТекст();
КоличествоСимволов = СтрДлина(ИсходныйТекст);
ТекущийСимвол = "";
Позиция = 0;
Пока ТекущийСимвол <> "{" И Позиция < КоличествоСимволов Цикл
Позиция = Позиция + 1;
ТекущийСимвол = Сред(ИсходныйТекст, Позиция, 1);
КонецЦикла;
Если ТекущийСимвол = "{" Тогда
Буфер = "";
РежимЧтенияСтроки = Ложь;
Пока Позиция < КоличествоСимволов Цикл
Позиция = Позиция + 1;
ТекущийСимвол = Сред(ИсходныйТекст, Позиция, 1);
Если ТекущийСимвол = "{" Тогда
ТекущийРодитель = ТекущаяСтрока;
ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
ИначеЕсли ТекущийСимвол = "," Тогда
ТекущаяСтрока.Значение = Буфер;
Буфер = "";
ТекущаяСтрока = ТекущийРодитель.Строки.Добавить();
ИначеЕсли ТекущийСимвол = "}" Тогда
ТекущаяСтрока.Значение = Буфер;
Буфер = "";
ТекущаяСтрока = ТекущийРодитель;
ТекущийРодитель = ТекущаяСтрока.Родитель;
ИначеЕсли ТекущийСимвол = """" Тогда
РежимЧтенияСтроки = НЕ РежимЧтенияСтроки;
Буфер = Буфер + ТекущийСимвол;
ИначеЕсли РежимЧтенияСтроки Тогда
Буфер = Буфер + ТекущийСимвол;
ИначеЕсли НЕ ПустаяСтрока(ТекущийСимвол)
ИЛИ (ТекущийСимвол = " ") Тогда
Буфер = Буфер + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Дерево;
КонецФункции

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #21 : Сентябрь 26, 2012, 08:19:48 pm »
Кстати, сейчас только заметил, что у меня в этом коде ошибка есть. Я его писал чтобы быстро разобрать конкретный файлик, и там элементы строкового типа не содержали посторонних символов. Строка по идее не может содержать только одиночный символ кавычки.
Чтобы разрешить в строках символы "{",  "}",  и "," нужно экранировать их переменной "РежимЧтенияСтроки":
Функция РазобратьТекст(Источник) Экспорт
Дерево = Новый ДеревоЗначений;
Дерево.Колонки.Добавить("Значение");
ТекущаяСтрока = Дерево.Строки.Добавить();
ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
ТекущийРодитель = ТекущаяСтрока.Родитель;
ИсходныйТекст = Источник.ПолучитьТекст();
КоличествоСимволов = СтрДлина(ИсходныйТекст);
ТекущийСимвол = "";
Позиция = 0;
Пока ТекущийСимвол <> "{" И Позиция < КоличествоСимволов Цикл
Позиция = Позиция + 1;
ТекущийСимвол = Сред(ИсходныйТекст, Позиция, 1);
КонецЦикла;
Если ТекущийСимвол = "{" Тогда
Буфер = "";
РежимЧтенияСтроки = Ложь;
Пока Позиция < КоличествоСимволов Цикл
Позиция = Позиция + 1;
ТекущийСимвол = Сред(ИсходныйТекст, Позиция, 1);
Если НЕ РежимЧтенияСтроки И ТекущийСимвол = "{" Тогда
ТекущийРодитель = ТекущаяСтрока;
ТекущаяСтрока = ТекущаяСтрока.Строки.Добавить();
ИначеЕсли НЕ РежимЧтенияСтроки И ТекущийСимвол = "," Тогда
ТекущаяСтрока.Значение = Буфер;
Буфер = "";
ТекущаяСтрока = ТекущийРодитель.Строки.Добавить();
ИначеЕсли НЕ РежимЧтенияСтроки И ТекущийСимвол = "}" Тогда
ТекущаяСтрока.Значение = Буфер;
Буфер = "";
ТекущаяСтрока = ТекущийРодитель;
ТекущийРодитель = ТекущаяСтрока.Родитель;
ИначеЕсли ТекущийСимвол = """" Тогда
РежимЧтенияСтроки = НЕ РежимЧтенияСтроки;
Буфер = Буфер + ТекущийСимвол;
ИначеЕсли РежимЧтенияСтроки Тогда
Буфер = Буфер + ТекущийСимвол;
ИначеЕсли НЕ ПустаяСтрока(ТекущийСимвол)
ИЛИ (ТекущийСимвол = " ") Тогда
Буфер = Буфер + ТекущийСимвол;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Возврат Дерево;
КонецФункции