что такое вычислительные макросы и синтаксические макросы - PullRequest
0 голосов
/ 23 марта 2012

Я читал статью «Объектно-ориентированный препроцессор, пригодный для C ++».

"http://www.informatik.uni -bremen.de / st / lehre / Arte-fakt / Семинар / paper / 17 /% 20Object-Oriented% 20preprocessor% 20fit% 20for% 20C ++. Pdf"

В нем рассматриваются три различных типа макросов.

  1. текстовые макросы.// почти так же, как C препроцессор
  2. вычислительные макросы // текст заменен в результате вычисления
  3. синтаксических макросов.// текст заменен синтаксическим деревом, представляющим лингвистически непротиворечивую конструкцию.

Может кто-нибудь объяснить сложным образом последние два типа макросов.Это говорит о том, что встроенные функции и шаблоны являются примерами вычислительных макросов, как?

Ответы [ 2 ]

1 голос
/ 14 апреля 2012

Глядя на оригинальную статью Читама за 1966 г., на которую ссылаются работы Виллинка и Мучника, я бы суммировал различные типы макросов, например:

  1. Текстовые макросы выполняют замену текста перед сканированием и анализом.
  2. Синтаксические макросы обрабатываются во время сканирования и анализа.Вызов макроса синтаксиса заменяет вызов макроса другим фрагментом AST.
  3. Вычислительные макросы могут выполняться в любой момент после того, как AST был создан сканером и анализатором.Дело в том, что на данном этапе мы больше не обрабатываем какой-либо текст, а вместо этого манипулируем узлами AST, т. Е. Имеем дело с объектами, к которым уже может быть прикреплена семантическая информация.

IЯ не эксперт по внутренним компонентам C ++, но я предполагаю, что встраивание вызовов функций и создание экземпляров шаблонов связано с манипулированием синтаксическим деревом до, во время и после того, как оно аннотировано семантической информацией, необходимой для его правильной компиляции, поскольку оба из них, похоже, предполагают, что знаютмного вещей (например, информация о типе и, если что-то хорошо, чтобы быть встроенными), которые еще не известны во время сканирования и анализа.

1 голос
/ 23 марта 2012

2. Похоже, они означают, что некоторые вычисления выполняются во время компиляции, а результирующие инструкции, выполняемые во время выполнения, включают только результат.Я бы не подумал, что встроенные функции особенно это отражают, но шаблонное метапрограммирование делает именно это.Также constexpr в C ++ 11.

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

...