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

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Простой парсер (правильный цикл)
« : Август 03, 2012, 12:39:09 pm »
В 1С есть стандартный сериализатор, который преобразует любой объект в поток символов след. формата:

Весь поток - это список элементов через запятую в фигурных скобках.
например:
{1, 2.2, "Один"}

Элементы могут быть трех типов:
1. Число - как первые два элемента в примере
2. Строка - в кавычках как третий элемент в примере (строка может содержать апострофы и удвоенные кавычки "")
3. UID (например 51e7a0d2-530b-11d4-b98a-008048da3034)

Списки могут быть вложенными.
Например:

{1, 2, {1, 2}, "ООО ""Восход"""}

Примеры сериализации:

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);
Массив.Добавить(4);

сериализуется в:
{"#",51e7a0d2-530b-11d4-b98a-008048da3034,
{4,
{"N",1},
{"N",2},
{"N",3},
{"N",4}
}
}

Структура = Новый Структура("Один, Два, Три, Четыре", 1, 2, 3, 4)

сериализуется в:
{"#",4238019d-7e49-4fc9-91db-b6b951d5cf8e,
{4,
{
{"S","Один"},
{"N",1}
},
{
{"S","Два"},
{"N",2}
},
{
{"S","Три"},
{"N",3}
},
{
{"S","Четыре"},
{"N",4}
}
}
}

Байткод из компилированной обработки с предыдущими примерами:
{1,
{"Cmd",40,0,
{1,1},
{2,0},
{18,0},
{51,0},
{16,0},
{1,3},
{2,0},
{4,2},
{18,1},
{20,1},
{1,3},
{1,4},
{2,0},
{4,3},
{18,1},
{20,1},
{1,4},
{1,5},
{2,0},
{4,4},
{18,1},
{20,1},
{1,5},
{1,6},
{2,0},
{4,5},
{18,1},
{20,1},
{1,6},
{1,8},
{2,1},
{4,6},
{4,2},
{4,3},
{4,4},
{4,5},
{18,5},
{51,7},
{16,0},
{22,0}
},
{"Const",8,
{"S","Массив"},
{"S","Добавить"},
{"N",1},
{"N",2},
{"N",3},
{"N",4},
{"S","Один, Два, Три, Четыре"},
{"S","Структура"}
},
{"Var",2,
{"Массив",0,-1},
{"Структура",0,-1}
}
}

Нужно написать парсер, который поднимет это в дерево. Каждый узел дерева должен знать своего родителя и список детей.

Ради эффективности желательно делать без рекурсии (так интереснее  :))
Хотелось бы дейкстру тут увидеть  ;)

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #1 : Август 03, 2012, 12:58:33 pm »
Ради эффективности желательно делать без рекурсии (так интереснее  :))

А как связаны эффективность и отсутствие рекурсии? о_О
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #2 : Август 03, 2012, 01:06:24 pm »
Ради эффективности желательно делать без рекурсии (так интереснее  :))

А как связаны эффективность и отсутствие рекурсии? о_О
Не обращай внимания на этих императивщиков, у них понятие рекурсии тесно связано с ростом (использования)стека.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #3 : Август 03, 2012, 01:21:02 pm »
Просто не везде есть умные оптимизаторы :)

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #4 : Август 03, 2012, 01:56:19 pm »
Просто не везде есть умные оптимизаторы :)
Во-первых это не есть умная оптимизация, это тупая оптимизация.
Во-вторых для функциональных языков (например haskell) это не оптимизация, а просто корректная кодогенерация.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #5 : Август 03, 2012, 03:04:58 pm »
Пусть тупая. Это не отменяет того факта что в некоторых языках цикл много быстрее аналогичной рекурсивной функции

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #6 : Август 03, 2012, 03:06:58 pm »
Пусть тупая. Это не отменяет того факта что в некоторых языках цикл много быстрее аналогичной рекурсивной функции
А зачем из за проблем некоторых реализаций некоторых языков в условие задания вводить пункт запрещающий рекурсию? Ведь таким образом ты по факту запрещаешь решать задачу на, например, haskell'e, просто потому, что там нет циклов, а есть только рекурсия.
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #7 : Август 03, 2012, 03:13:29 pm »
Пусть реализации всякие будут. Просто первая естественная мысль - это применить рекурсию. А хочется еще и циклы увидеть

valexey

  • Administrator
  • Hero Member
  • *****
  • Сообщений: 1990
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #8 : Август 03, 2012, 03:17:55 pm »
Пусть реализации всякие будут. Просто первая естественная мысль - это применить рекурсию. А хочется еще и циклы увидеть
А может сразу goto (с вычисляемой меткой, для пущего хардкора)? :-D
"но сейчас, чтобы компенсировать растущую мощность компьютеров, программисты используют фреймворки"

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #9 : Август 03, 2012, 04:11:25 pm »
количество уровней фиксировано и каждый уровень отвечает за свою область определений?

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #10 : Август 03, 2012, 04:59:31 pm »
И желательно привести пример того, что хотим получить в результате.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #11 : Август 05, 2012, 04:57:01 am »
В смысле? Результатом должно быть дерево каждый узел которого знает родителя, список потомков, ну и значение узла естественно

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Простой парсер (правильный цикл)
« Ответ #12 : Август 05, 2012, 05:27:39 am »
Пусть реализации всякие будут. Просто первая естественная мысль - это применить рекурсию. А хочется еще и циклы увидеть
А может сразу goto (с вычисляемой меткой, для пущего хардкора)? :-D

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Простой парсер (правильный цикл)
« Ответ #13 : Август 06, 2012, 04:56:21 am »
Пусть реализации всякие будут. Просто первая естественная мысль - это применить рекурсию. А хочется еще и циклы увидеть
А, что, если "применить" рекурсию, то цикл здесь разве не нужен будет?
И, вообще, что-то не понятно, а в чём проблема.
Парсите поток, выделяя кривые скобки, запятую и всё остальное (элемент) и рулите деревом. И никакой рекурсии.
Про МАМПС  с его деревьями я уж и молчать буду. :)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля