Erlang试图评估一个字符串

bry*_*sho 0 erlang evaluation term erlang-shell

我正在尝试动态评估Erlang术语

启动Erlang

basho-catah% erl
Erlang R16B03 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.4  (abort with ^G)
Run Code Online (Sandbox Code Playgroud)

创建一个术语

1> {a,[b,c,d]}.
{a,[b,c,d]}
Run Code Online (Sandbox Code Playgroud)

尝试在同一个词中扫描

2> {ok, Tokens, _ } = erl_scan:string("{a,[b,c,d]}").
{ok,[{'{',1},
     {atom,1,a},
     {',',1},
     {'[',1},
     {atom,1,b},
     {',',1},
     {atom,1,c},
     {',',1},
     {atom,1,d},
     {']',1},
     {'}',1}],
    1}


3> Tokens.
[{'{',1},
 {atom,1,a},
 {',',1},
 {'[',1},
 {atom,1,b},
 {',',1},
 {atom,1,c},
 {',',1},
 {atom,1,d},
 {']',1},
 {'}',1}]
Run Code Online (Sandbox Code Playgroud)

但它无法解析该标记化字符串.

4> Foo = erl_parse:parse(Tokens).
{error,{1,erl_parse,["syntax error before: ","'{'"]}}
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?

Sou*_*lls 5

你使用的是错误的功能,还有一个你没有遇到过的警告.

首先,您应该使用的功能是erl_parse:parse_term/1.我实际上无法找到文档erl_parse:parse/1,因此我怀疑它已被弃用(并且很可能用于解析抽象语法树,而不是令牌).

其次,erl_parse:parse_term/1要使用,您必须在术语中包含终止点字符.erl_scan:string/1很乐意将你给它的任何东西转换为代币,但没有终结者erl_parse:parse_term/1希望得到更多.

所以,在shell中尝试以下内容:

{ok, Tokens, _} = erl_scan:string("{a,[b,c,d]}.").
erl_parse:parse_term(Tokens).
Run Code Online (Sandbox Code Playgroud)