1

我正在尝试动态评估 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: ","'{'"]}}

任何想法我做错了什么?

4

1 回答 1

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).
于 2014-05-22T18:05:28.193 回答