मैं किसी भी सफलता के बिना, इसके सार वाक्यविन्यास वृक्ष प्रतिनिधित्व में एक मान्य एरलांग अभिव्यक्ति वाली स्ट्रिंग को कन्वर्ट करना चाहता हूं।स्ट्रिंग को अमूर्त सिंटैक्स पेड़
नीचे एक उदाहरण है जो मैं करना चाहता हूं। संकलन के बाद, 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),
अब जब कि मैं कोड को देखो, मैं स्पष्ट रूप से ऊपर erl_syntax और erl_parse प्रारूपों मिश्रण ... अभी भी यह कैसे हालांकि (आम बहुत ज्यादा bejgli त्रुटि) करने के लिए को समझ नहीं सकता। – Zed
हाँ, यदि आप erl_syntax द्वारा बनाए गए एक के साथ अपनी ListAST की तुलना करते हैं तो वे समान रूप से नहीं दिखते हैं :( 42> ListAST। [{Cons, 1, {integer, 1,1}, {cons, 1, {integer, 1,2}, {शून्य, 1}}}] 43> erl_syntax:। सूची ([1, 2, 3], []) {पेड़, सूची, {attr, 0, [], कोई नहीं} {सूची , [1,2,3], []}} 44> –
तो मैं या तो एक तरह से स्ट्रिंग, या एक तरह से 'erl_syntax' सामान के लिए एक प्लेसहोल्डर डाल करने के बाहर एक' erl_syntax' संगत एएसटी बनाने की जरूरत है, और 'वापस लाएं() कॉल' के बाद इसे बदलना या मैं कुछ स्पष्ट याद आ रही है ... – Zed