2011-09-16 22 views
3

通常のErlang属性は、解析の変換によって変更できます。これはプリプロセッサによって処理されるため、 "-define"属性には適用されません。ファイル自体を変更せずにすべてのマクロの値を変更したい場合はどうしますか?"-define" Erlang属性(マクロ定義)の値を変更するには?

は、理想的には私は次のような効果を持つことになり、コンパイラのいくつかの修正バージョンを呼びたい:

入力して実行

...

... 
-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

プリプロセッサマクロを含む構文木は、通常のコンパイラでは提供できません。 注意したように、マクロは、ソースがパーサに供給される前にプリプロセッサによって展開されます。

は擬似構文解析木(マクロを表すことができないerl_parseによって返され、通常の構文解析ツリー)を取得する方法があります:モジュールepp_dodger

epp_dodger使用 - Erlangのプリプロセッサをバイパスします。

このモジュールは、プリプロセッサディレクティブとマクロアプリケーションを構文的に「正常に動作する」限り、ほとんどのErlangソースコードをトークン化し、解析します。 erl_parseモジュールの通常の構文解析ツリーはこれらのものを表すことができないので(通常、Parlserが認識する前にErlangプリプロセッサepp(3)によって展開されます)、erl_syntaxモジュールを使用して拡張構文ツリーが作成されます。

ただし、これを解析変換に統合することはできません。

しかし、必要に応じて、構文木を好きなように閲覧し、結果をコンパイラに送ることができます。コードについての理由だけで、構文解析ツリーとErlang Syntax Toolsはすべて必要です。

関連する問題