Как изменить значения атрибутов Erlang "-define" (определения макросов)? - PullRequest
3 голосов
/ 16 сентября 2011

Обычные атрибуты Erlang могут быть изменены с помощью преобразований разбора.Это не относится к атрибутам "-define", так как они обрабатываются препроцессором.Что бы вы сделали, если бы вы хотели изменить значение всех макросов без изменения самого файла?

В идеале я хочу вызвать некоторую измененную версию компилятора, которая будет иметь следующий эффект:

При запуске с вводом ...

...
-define(constant, 45).
-define(debug(X), io:format(X)).
...
   ?debug(?constant) % Line: 7
...

.. и параметром ...

something:external

результатом будет некоторая абстрактная форма, которая вместо ...

{call,7,
      {remote,7,{atom,7,io},{atom,7,format}},
      [{integer,7,45}]}

... будет иметь:

{call,7,
      {remote,7,{atom,7,something},{atom,7,external}},
      [{call,7,
             {remote,7,{atom,7,something},{atom,7,external}},
             []}]}

Конечно, результирующий код, вероятно, не будет исполняемым, но может обеспечить некоторый «качественный» анализ использования макросов.

1 Ответ

1 голос
/ 20 сентября 2011

Синтаксическое дерево с включенными макросами препроцессора не может быть предоставлено обычным компилятором. Как вы заметили, макропроцессоры расширяются препроцессором до того, как источник передается в анализатор.

Существует способ получить псевдо-дерево разбора (нормальное дерево разбора, возвращаемое erl_parse, не может представлять макросы): используйте модуль epp_dodger

epp_dodger - обходит препроцессор Erlang.

Этот модуль разбивает на части и анализирует большую часть исходного кода Erlang без расширения директив препроцессора и приложений макрокоманд, если они синтаксически "хорошо себя ведут". Поскольку обычные деревья разбора модуля erl_parse не могут представлять эти вещи (обычно они раскрываются препроцессором Erlang epp (3) до того, как синтаксический анализатор их видит), создается расширенное синтаксическое дерево с использованием erl_syntax модуль.

Однако это не может быть интегрировано в преобразование синтаксического анализа.

Но вы можете просматривать синтаксические деревья по своему усмотрению и передавать результат компилятору, если вам это нужно. Просто для рассуждений о коде все, что вам нужно, это дерево разбора и Синтаксические инструменты Erlang .

...