我试图动态评估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: ","'{'"]}}
任何想法我做错了什么?
答案 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).