Vorrei convertire una stringa contenente un'espressione di Erlang valida nella sua rappresentazione astratta della struttura della sintassi, senza alcun risultato fino ad ora.stringa ad albero di sintassi astratto
Di seguito è riportato un esempio di ciò che vorrei fare. Dopo la compilazione, alling z:z().
genera il modulo zed
, che chiamando zed:zed().
restituisce il risultato dell'applicazione di lists:reverse
nell'elenco fornito.
-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
potrebbe essere "[1,2,3]."
, o "begin A=4, B=2+3, [A,B] end."
, o qualcosa di simile.
(Si noti che questo è solo un esempio di quello che vorrei fare, in modo da valutare String
non è un'opzione per me.)
EDIT:
Specifica ListAST come di seguito genera un enorme monster-error-errore dict-digraph e dice "error interno in lint_module".
String = "[1,2,3].",
{ok, Ts, _} = erl_scan:string(String),
{ok, ListAST} = erl_parse:parse_exprs(Ts),
EDIT2:
Questa soluzione funziona per termini semplici:
{ok, Ts, _} = erl_scan:string(String),
{ok, Term} = erl_parse:parse_term(Ts),
ListAST = erl_syntax:abstract(Term),
Ora che guardo il codice, io ovviamente mescolare erl_syntax e formati erl_parse ... ancora non riesco a capire come fare questo però (tipica troppo errore bejgli). – Zed
Sì, se confronti il tuo ListAST con uno fatto da erl_syntax, non hanno lo stesso aspetto :( 42> ListAST. [{Cons, 1, {intero, 1,1}, {cons, 1, {intero, 1,2}, {nil, 1}}}] 43> erl_syntax: list ([1, 2, 3], []). {tree, list, {attr, 0, [], none}, {list [1,2,3], []}} 44> –
Quindi ho bisogno di un modo per rendere un AST compatibile con 'erl_syntax' dalla stringa, o un modo per mettere un segnaposto nella roba' erl_syntax', e sostituirlo dopo aver chiamato 'revert()'. O mi manca qualcosa di ovvio ... – Zed