Erlang尝试计算字符串

ogsagwnx  于 2022-12-16  发布在  Erlang
关注(0)|答案(1)|浏览(161)

我尝试动态计算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: ","'{'"]}}

知道我哪里做错了吗?

7nbnzgx9

7nbnzgx91#

您使用了错误的函数,并且还有一个您没有遇到的警告。
首先,您 * 应该 * 使用的函数是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).

相关问题