Да, такой подход используют, например, в ATS. Основные проблемы - медленно и не удается использовать информацию от фронтенда для оптимизации в бекенде.
Компилятор не может понять, что переменные с указателем больше ни где не используются (например, что одна из них не указывает на вторую) и поддерживает их актуальное значение, что мешает оптимизации.
Использовать монодические/комбинаторные парсеры. Примеры обычно приводятся на Haskell, но использовать этот паттерн не сложно на почти любом языке - желательно наличие замыканий и сборки мусора, без них можно обойтись, но программировать приходится сложно.