Erlang试图评估一个字符串

时间:2014-05-22 15:28:58

标签: 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)

创建一个术语

1> {a,[b,c,d]}.
{a,[b,c,d]}

尝试使用相同的术语进行扫描

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}]

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

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

任何想法我做错了什么?

1 个答案:

答案 0 :(得分: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).