码迷,mamicode.com
首页 > 其他好文 > 详细

erlang字符串动态解析成为Erlang数据结构(去掉“”)

时间:2016-11-09 17:37:59      阅读:314      评论:0      收藏:0      [点我收藏+]

标签:文法   value   数据结构   list   答案   ++   pre   att   bsp   

Eshell V5.8.2 (abort with ^G)
1> {ok, Scan1, _} = erl_scan:string("[a,b,c].").
{ok,[{‘[‘,1},{atom,1,a},{‘,‘,1},{atom,1,b},{‘,‘,1},{atom,1,c},{‘]‘,1},{dot,1}],1}
2> {ok,P}=erl_parse:parse_exprs(Scan1).
{ok,[{cons,1,{atom,1,a},{cons,1,{atom,1,b},{cons,1,{atom,1,c},{nil,1}}}}]}
3> erl_eval:exprs(P, []) .
{value,[a,b,c],[]}
4>

红色标注的部分就是我们想要的结果,注意erl_scan:string(Exp).接受的参数是一个合法的表达式,必须以.结尾,代表一个表达式的结束,否则文法检查过不去;看一下输出的结果里面.符号被解析为{dot,1};这个问题最关键的部分就已经解决了,还有一个相关的问题就是如何把一个[{1,2},{2,3},{3,4}]转成字符串?这个当然要在io_lib里面去寻找答案,可以这样做: lists:flatten(io_lib:write([{1,2},{2,3},{3,4}])). 结果为"[{1,2},{2,3},{3,4}]"我们做一个完整的例子:

1> lists:flatten(io_lib:write([{1,2},{2,3},{3,4}])).
"[{1,2},{2,3},{3,4}]"
2> S= lists:flatten(io_lib:write([{1,2},{2,3},{3,4}])).
"[{1,2},{2,3},{3,4}]"
3> E=S++".". %%添加结束符
"[{1,2},{2,3},{3,4}]."
4> {ok, Scan1, _} = erl_scan:string(E).
{ok,[{‘[‘,1},{‘{‘,1},{integer,1,1},{‘,‘,1},{integer,1,2},{‘}‘,1},{‘,‘,1},{‘{‘,1},{integer,1,2},{‘,‘,1},{integer,1,3},{‘}‘,1},{‘,‘,1},{‘{‘,1},{integer,1,3},{‘,‘,1},{integer,1,4},{‘}‘,1},{‘]‘,1},{dot,1}], 1}

5> {ok,P}=erl_parse:parse_exprs(Scan1).
{ok,[{cons,1,{tuple,1,[{integer,1,1},{integer,1,2}]}, {cons,1,{tuple,1,[{integer,1,2},{integer,1,3}]},
{cons,1,{tuple,1,[{integer,1,3},{integer,1,4}]},{nil,1}}}}]}
6> erl_eval:exprs(P, []) .
{value,[{1,2},{2,3},{3,4}],[]}
7>

 

 F=fun(S) ->
{ok,Scanned,_} = erl_scan:string(S),
{ok,Parsed} = erl_parse:parse_exprs(Scanned),
{value, Value,_} = erl_eval:exprs(Parsed,[]),
Value end.

erlang字符串动态解析成为Erlang数据结构(去掉“”)

标签:文法   value   数据结构   list   答案   ++   pre   att   bsp   

原文地址:http://www.cnblogs.com/daofen/p/6047789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!