2011-09-16 21 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的預處理器。

此模塊tokenises並解析最二郎源代碼,而無需擴大預處理器指令和宏的應用程序,只要這些在語法「乖」。因爲erl_parse模塊不能代表這些東西的正常解析樹(通常情況下,它們被二郎神預處理epp(3)解析器看到他們之前展開),擴展語法樹被創建,使用erl_syntax模塊。

然而,這不能被集成在解析變換。

但你可以仔細閱讀語法樹,只要你喜歡,並將結果饋送到編譯器,如果你需要這個。爲了推理代碼樹和Erlang Syntax Tools都是你需要的。