Я хочу создать парсер для языка, подобного Си. Интересный аспект этого заключается в том, что я хочу построить его таким образом, чтобы тот, кто имеет доступ к источнику, мог легко изменить его, чтобы расширить язык (новый тип выражения экземпляра) с возможностью расширения расширений во время выполнения (они могут быть включается и выключается).
Мое текущее намерение - создать рекурсивный приличный парсер как объект. Каждое производство будет методом объекта. Метод расширения будет состоять в том, чтобы извлекать классы из этой базы, заменяя методы (и производственные определения) по мере необходимости. Я все еще пытаюсь понять, как смешивать и сопоставлять расширения. Одна идея состоит в том, чтобы играть в игры с V-TBL. Объекты будут создаваться с помощью v-tbl, который является копией базы, но с методами, замененными из производных классов.
Помимо сложного характера решения, единственные проблемы, с которыми я сталкиваюсь, это
- разумный способ сделать путаницу v-tbl
- что делать, когда 2 расширения изменяют одну и ту же продукцию (так как большинство замен в конечном итоге вызовет оригинал с одним вызовом замены, другой будет работать, но проблема заключается в механике настройки)
- как разрешить расширение расширений (это может выглядеть как стандартная система MI, но я так и не понял, как они работают)
Другое решение (немного более приземленная версия того же подхода) состоит в том, чтобы использовать статические переменные-члены для хранения указателей на функции и вызывать их для того же эффекта.
Редактировать: Я уже построил систему, которая позволяет мне создавать производства на основе определений BNF. Я могу изменить это, чтобы поддержать все, что я решу.