В офисе мы применили простые доменные языки (DSL) к нескольким проблемным доменам, с которыми мы столкнулись.
По сути, мы анализируем (lex / yacc) пользовательский скрипт в дереве выражений. Каждый узел в дереве выражений имеет метод .evaluate (), который вызывается рекурсивно, пока программа не будет завершена. Красиво и просто, как пирог. Это хорошо, потому что я почти ничего не знаю о методах синтаксического анализа, построении компилятора и о чем-то подобном (хорошо, что мои коллеги знают что-то одно или два).
Теперь вот задача : реализация, над которой мы сейчас работаем, нуждается в способности
- останов в любой позиции дерева
- сохраняются все состояния
- и восстановить состояние / положение в любое время в будущем.
Сохранение фактического состояния не должно быть слишком сложным, но положение в дереве (или «стек вызовов)» озадачивает меня. Как можно было бы реализовать такую систему? Сохранять позицию в дереве, используя какие-то идентификаторы для каждого узла? Или оценивает само дерево как неправильный подход, и должны ли мы каким-то образом преобразовать его в нечто линейное?
Полагаю, это довольно распространенная проблема, но я не знаю, что искать. Любая помощь по правильной терминологии, толчкам в правильном направлении, ключевым словам для поиска, шаблонам проектирования и т. Д. ... приветствуется!
(Делаем это в Win32 / Dephi, но, надеюсь, мы сможем сохранить независимость от этого языка)