@webmaxer
Веб разработчик

Чем заменить eval и как правильно трансформировать человеко-понятное описание в исполняемый код?

Я немного не силён в мат части задач такого рода, возможно у таких задач есть определённое название и готовые методики решения, поэтому решил спросить у сообщества. Не смог правильно подобрать запрос к гуглу.

Ситуация:
1) Есть код, написанный в парадигме ООП с кучей классов, объектов, методов и т.д. и т.п.
2) Нужно создать человеко-понятный описательный язык со своим синтаксисом (или использовать один из существующих, например xml) так, чтобы исполняемый код из пункта 1 автоматически создавал экземпляры классов, запускал методы и т.д. и т.п на основе скормленного ему файла с описанием.
Другими словами: структуру и синтаксис описательного языка нужно как-то заложить в исполняемый код, т.е. создать что-то вроде парсера, только он будет после парсинга полученных данных не выводить их на экран и не записывать в базу, что обычно требуется от парсера, а исполнять инструкции на основе того, какое описание содержат полученные данные.
Конечно, действия с полученными данными и исполняемую логику можно покрыть if, else и тд и тп, но на самом деле встроенных средств языков программирования не хватает, т.к. описательная часть вариативна, а значит и количество логики в потенциально создаваемых объектах также вариативно. Например:

Имеется класс "Колобок". У него есть метод (некая внутренняя логика), который должен принимать решение при появлении на горизонте субъекта(ов): лиса, волк, заяц, медведь, а также их комбинаций, количество которых конечно. При создании объекта Колобок мы должны задать ему своего рода характер (используя описательный язык), от которого и будут зависеть дальнейшиие действия с другими субъектами игры и их комбинаций. Задача состоит в том, чтобы у каждого колобка был уникальный характер, но в то же время у каждого из них зашиты одинаковые методы (идти, смотреть, говорить, обходить, убегать). Примеры вариативности:
- Описательная часть у одного колобка может выглядеть коротко так: при появлении на горизонте лисы - убегать, при появлении зайца - поговорить. У его брата (другой объект) похожий характер, но слегка шальной - при встрече любого героя, отличного от зайца или лисы запускается рандомный метод.
- У второго колобка, наоборот, при появлении на горизонте лисы - поговорить с ней (но в случае атаки - убегать), при появлении зайца - обходить стороной, если заяц движется в его сторону - перейти на бег.
- У третьего колобка другой характер - говорить только в том случае, когда все остальные герои находятся рядом, в остальных случаях - убегать.
И вот эта внутренняя логика у каждого колобка должна быть уникальна и зависеть от параметров-инструкций (характера), переданных при создании объекта "Колобок".

Для такого рода задач вроде как используют eval, именно в данный метод можно передать строки с условиями, как мне известно. Но eval опасен, хотя в нём и содержится как раз суть того, о чём я спрашиваю: при создании объектов у каждого из них будет своя, и если того требуется - уникальная логика (характер). Т.е. нужно создать своего рода безопасную альтернативу eval, так скажем.
Из описания eval MDN:
if(eval(string)){

    //do something

}

string. Строка, представленная JavaScript выражением, оператором или последовательностью операторов. Выражение может содержать переменные и свойства существующих объектов.


Кстати, если я правильно понимаю, подобная магия происходит в браузере, когда он считывает html/css и рендерит их, слушает события, такие как ховер, onclick, производит на экране css анимации и т.д и т.п. и всё это происходит на основе описательных языков (html/css), не являющихся исполняемым кодом. У меня задача конечно похожая, поэтому и смотрю в сторону xml, чтобы не городить велосипед, но вот как-то надо сделать связку xml с исполняемым кодом.
  • Вопрос задан
  • 729 просмотров
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
Вам нужно сделать парсер, лексер и возможно компилятор под ваши хотелки (в тот яп, который вы не указали)
Тут примерно рассказано, что вам придется пройти по пути написания https://www.youtube.com/watch?v=byKYLHx5jHo

Я не советую
Если у вас от вашей задачи сразу не появились в голове ключевики или гугл вам не дал ответа, то ничего вменяемого вы не напишете

при создании объектов у каждого из них будет своя, и если того требуется - уникальная логика (характер)
если слегка снизить требования, то можно описать поведение и запихнуть поведение в настройки
Так делают все и не парятся
Ответ написан
MDiMaI666
@MDiMaI666
Талантливый программист
помотрите в сторону Blockly пример
Ответ написан
Комментировать
@forspamonly2
у гугла надо спрашивать про DSL
domain-specific language
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы