2013-10-30 21 views
0

我想擴展Erlang混合器庫(https://github.com/opscode/mixer)以傳遞「-spec()」。它添加到模塊的功能的行。不過,我不清楚erlc的位置是如何指向erlang核心代碼的。Erlang類型規格如何獲得預處理

我開始用一個非常簡單的(測試)模塊:

-module(mix1). 
-export([square/1]). 
-spec(square(number()) -> number()). 
square(X) -> X * X. 

,並以 「erlc + DEBUG_INFO -S mix1.erl」 編制,並得到這個(MODULE_INFO功能去掉):

{module, mix1}. %% version = 0 

{exports, [{module_info,0},{module_info,1},{square,1}]}. 

{attributes, []}. 
{labels, 7}. 
{function, square, 1, 2}. 
    {label,1}. 
    {line,[{location,"mix1.erl",7}]}. 
    {func_info,{atom,mix1},{atom,square},1}. 
    {label,2}. 
    {line,[{location,"mix1.erl",8}]}. 
    {gc_bif,'*',{f,0},1,[{x,0},{x,0}],{x,0}}. 
    return. 

我想弄清楚「-spec()」是如何翻譯的,我沒有看到它們,有什麼想法?我錯過了什麼。這裏的最終目標是將其用於分析轉換。

+0

'S'選項不會生成AST,而是生成BEAM彙編器代碼。 @OdobenusRosmarus建議使用'epp:parse_file/3'是一種方法,另一種方法是使用'E'或'P'選項編譯。 – rvirding

回答

1

我相信你的輸出不完全是AST,而是AST的一些歸一化形式。

{ok, Forms} = epp:parse_file("mix1.erl",[],[]). 
{ok,[{attribute,1,file,{"mix1.erl",1}}, 
    {attribute,1,module,mix1}, 
    {attribute,2,export,[{square,1}]}, 
    {attribute,3,spec, 
       {{square,1}, 
       [{type,3,'fun', 
         [{type,3,product,[{type,3,number,[]}]}, 
         {type,3,number,[]}]}]}}, 
    {function,4,square,1, 
       [{clause,4, 
         [{var,4,'X'}], 
         [], 
         [{op,4,'*',{var,4,'X'},{var,4,'X'}}]}]}, 
    {eof,6}]}