我想將包含有效的Erlang表達式的字符串轉換爲其抽象語法樹表示形式,目前爲止沒有任何成功。字符串到抽象語法樹
下面是我想要做的一個例子。編譯後,通過調用z:z().
生成模塊zed
,調用zed:zed().
返回在給定列表上應用lists:reverse
的結果。
-module(z).
-export([z/0]).
z() ->
ModuleAST = erl_syntax:attribute(erl_syntax:atom(module),
[erl_syntax:atom("zed")]),
ExportAST = erl_syntax:attribute(erl_syntax:atom(export),
[erl_syntax:list(
[erl_syntax:arity_qualifier(
erl_syntax:atom("zed"),
erl_syntax:integer(0))])]),
%ListAST = ?(String), % This is where I would put my AST
ListAST = erl_syntax:list([erl_syntax:integer(1), erl_syntax:integer(2)]),
FunctionAST = erl_syntax:function(erl_syntax:atom("zed"),
[erl_syntax:clause(
[], none,
[erl_syntax:application(
erl_syntax:atom(lists),
erl_syntax:atom(reverse),
[ListAST]
)])]),
Forms = [erl_syntax:revert(AST) || AST <- [ModuleAST, ExportAST, FunctionAST]],
case compile:forms(Forms) of
{ok,ModuleName,Binary} -> code:load_binary(ModuleName, "z", Binary);
{ok,ModuleName,Binary,_Warnings} -> code:load_binary(ModuleName, "z", Binary)
end.
String
可能是"[1,2,3]."
,或"begin A=4, B=2+3, [A,B] end."
,或任何類似的。
(請注意,這只是我想這樣做,所以評估String
什麼的例子並不是我的選擇。)
編輯:
指定ListAST如下會生成一個巨大的字典 - 圖形錯誤 - 怪物,並說「lint_module中存在內部錯誤」。
String = "[1,2,3].",
{ok, Ts, _} = erl_scan:string(String),
{ok, ListAST} = erl_parse:parse_exprs(Ts),
EDIT2:
該解決方案適用於簡單來說:
{ok, Ts, _} = erl_scan:string(String),
{ok, Term} = erl_parse:parse_term(Ts),
ListAST = erl_syntax:abstract(Term),
現在,我在看代碼,我顯然混淆了erl_syntax和erl_parse格式......仍然無法弄清楚如何做到這一點,但(典型太多bejgli錯誤)。 – Zed 2009-12-29 13:39:39
是的,如果你比較ListList和erl_syntax創建的列表,他們看起來並不相似:( 42> ListAST。[{cons,1,{integer,1,1},{cons,1,{integer, {},{nil,1}}}] 43> erl_syntax:list([1,2,3],[])。 ,[1,2,3],[]}} 44> – 2009-12-29 14:02:34
所以我需要一種方法來使'erl_syntax'兼容的AST脫離字符串,或者將佔位符放入'erl_syntax'的東西,並在調用'revert()'之後替換它,或者我缺少一些明顯的... – Zed 2009-12-29 14:07:33