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、非推奨になっていると思われます(トークンではなく、抽象構文ツリーの解析に使用される可能性が最も高いです)。

第 2 に、 forerl_parse:parse_term/1を機能させるには、用語に終了ドット文字を含める必要があります。erl_scan:string/1あなたが与えたものは何でも喜んでトークンに変換しますが、ターミネーターがなければ、erl_parse:parse_term/1より多くを受け取ることを期待しています.

したがって、シェルで次のことを試してください。

{ok, Tokens, _} = erl_scan:string("{a,[b,c,d]}.").
erl_parse:parse_term(Tokens).
于 2014-05-22T18:05:28.193 に答える