有効なErlang式を含む文字列をその抽象構文ツリー表現に変換したいのですが、これまでのところ成功していません。
以下は私がやりたいことの例です。コンパイル後、allingはモジュールを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を指定すると、巨大なdict-digraph-error-monsterが生成され、「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),