Что думал Tim Sweeney? (Как этот синтаксический анализатор C++ работает?)

Tim Sweeney Эпопеи MegaGames является ведущим разработчиком для Нереального и фанатом языка программирования. Много лет назад отправил следующий снимок экрана на VoodooExtreme:

Tim Sweeney's screenshot

Как вентилятор программиста на C++ и Sweeney, я был очарован этим. Это показывает универсальный код C++, который реализует некоторый язык сценариев, где тот язык сам, кажется, универсален в том смысле, что это может определить свою собственную грамматику.

Г-н Sweeney никогда не объяснялся.:-)

Редко видеть этот уровень шаблонного программирования, но Вы действительно видите его время от времени, когда люди хотят продвинуть компилятор генерировать большой код или потому что они хотят создать общий код (например, современный Дизайн C++).

Tim, кажется, использует его для создания грамматики в Parser.cpp - Вы видите то, что похоже на расположенных по приоритетам бинарных операторов. Если это так, затем почему Test.ae похож, он также определяет грамматику?

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

21
задан rekire 29 April 2012 в 13:43
поделиться

3 ответа

Я не знаю, что сделал Суини, и предполагаю, что другие ответы об использовании Духа находятся в правильном духе. У меня нет опыта работы с шаблонами Spirit, но я понимаю, что если вы определяете с их помощью сложную грамматику, с ней становится довольно трудно справиться (а также медленно компилировать). Чтобы убедиться в этом, следует использовать реальный опыт других людей.

Есть и другие способы реализации расширений C ++, например, с использованием программных преобразований и расширяемых грамматик. См. этот ответ SO по поводу дополнения самой грамматики C ++ произвольными расширениями, где очень сложные расширения возможны и фактически использовались.

Метапрограммирование шаблонов генерирует интересный код, в котором шаблоны вызываются специально. Используя программные преобразования, вы можете сгенерировать произвольно интересный код в любой точке программы, например, как если бы "шаблоны" (дополнительный синтаксис) изменяли семантику так, как вы считаете полезным.

1
ответ дан 29 November 2019 в 22:03
поделиться

Не могу сказать наверняка, но код C ++ вроде как выглядит как Spirit , генератор синтаксического анализатора C ++, который широко использует шаблоны. Test.ae выглядит так, как будто это метапрограммирование (определение деталей языка на самом языке), что труднее сделать в C ++ (шаблоны - это начало, но они подвержены ошибкам и уродливы), чем это было бы на каком-либо другом целевом языке (например, UnrealScript , что, как я полагаю, написано на test.ae).

Итак - похоже, Parser.cpp определяет базовую грамматику для UnrealScript (с использованием Spirit ), а Test.ae определяет расширения для UnrealScript.

3
ответ дан 29 November 2019 в 22:03
поделиться

Скриншот, очевидно, из MSVC 6.0 или более раннего таймфрейма, который не очень ценил сложные шаблоны (и, конечно, не поддерживал частичную специализацию шаблонов). Я не использовал дух. Из этих скриншотов невозможно сказать, что Суини действительно делает, кроме определения того, что выглядит как DSL в Test.ae.

Единственные полные операторы C++, которые вы можете увидеть, находятся в Parser.cpp - и они не говорят вам ничего, кроме того, что он объявляет 3 типа. Вы действительно не можете сказать много ни о чем - слишком многое скрыто окном «Test.ae».

1
ответ дан 29 November 2019 в 22:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: