【问题标题】:How to change values of "-define" Erlang attributes (macro definitions)?如何更改“-define” Erlang 属性(宏定义)的值?
【发布时间】:2011-11-18 15:27:07
【问题描述】:

普通的 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}},
             []}]}

当然,生成的代码可能无法执行,但可以对宏的使用进行一些“质量”分析。

【问题讨论】:

    标签: macros erlang preprocessor


    【解决方案1】:

    普通编译器无法提供包含预处理器宏的语法树。 正如您所指出的,在将源代码提供给解析器之前,预处理器会扩展宏。

    有一种方法可以获得伪解析树(erl_parse返回的正常解析树不能表示宏):使用模块epp_dodger

    epp_dodger - 绕过 Erlang 预处理器。

    这个模块在不扩展预处理器指令和宏应用程序的情况下标记和解析大多数 Erlang 源代码,只要它们在语法上“表现良好”。因为 erl_parse 模块的普通解析树不能表示这些东西(通常,它们在解析器看到它们之前由 Erlang 预处理器 epp(3) 扩展),使用 erl_syntax 模块创建扩展语法树。

    但是这不能集成到解析转换中。

    但是您可以根据需要仔细阅读语法树并将结果提供给编译器(如果需要)。对于代码的推理,您只需要解析树和Erlang Syntax Tools

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      相关资源
      最近更新 更多