如果列表中的元素附加

时间:2015-02-17 00:33:35

标签: append

我正在尝试为程序创建解析器。例如, 我进入了(我想要的)

  

"(2 + 3)-4"它会变成这样的东西"(减去,(加号,第2号,第3号),第4号)"

到目前为止我做了什么..

  

"(2 + 3)-4"我然后拆分它,它变成列表Z = ["("," 2"," +"," 3",& #34;)"," - "," 4"]然后我比较了" - "是Z的成员,如果是真的我追加元素" - "进入新名单[" - "]

我不确定我做的方式是否正确,我是Er-lang的新手,并且经常挣扎。如果有人能够给我一些见解,谢谢。

1 个答案:

答案 0 :(得分:2)

考虑以下内容,它返回其输入的基于元组的表示:

parse(Expr) ->
    Elems = re:split(Expr, "([-+)(])", [{return,list}]),
    parse(lists:filter(fun(E) -> E /= [] end, Elems), []).
parse([], [Result]) ->
    Result;
parse([], [V2,{op,Op},V1|Tacc]) ->
    parse([], [{Op,V1,V2}|Tacc]);
parse(["("|Tail], Acc) ->
    parse(Tail, [open|Acc]);
parse([")"|Tail], [Op,open|TAcc]) ->
    parse(Tail, [Op|TAcc]);
parse(["+"|Tail], Acc) ->
    parse(Tail, [{op,plus}|Acc]);
parse(["-"|Tail], Acc) ->
    parse(Tail, [{op,minus}|Acc]);
parse([V2|Tail], [{op,Op},V1|Tacc]) ->
    parse(Tail, [{Op,V1,{num,list_to_integer(V2)}}|Tacc]);
parse([Val|Tail], Acc) ->
    parse(Tail, [{num,list_to_integer(Val)}|Acc]).

第一个函数parse/1沿着+-运算符和括号分割表达式,并在结果列表中保留它们。然后它过滤该列表以删除空元素,并将其与空累加器一起传递给parse/2

parse/2函数有八个子句,如下所述:

  • 当解析的输入列表用完时,前两个处理大小写。其中第二个处理需要将累加器中的多个元素折叠为由运算符和操作数组成的单个元组的情况。
  • 接下来的两个句柄用于括号。当我们看到一个开括号时,我们将原子open推入累加器。在看到匹配的右括号后,我们期望在累加器中看到一个操作元组和原子open,我们只用元组替换它们。
  • 第5和第6条分别处理+-。每个只是将{op,Operator}元组推入累加器,其中Operator是原子plus或原子minus
  • 最后两个子句处理值。第一个处理累加器保存值和op元组的情况,它被一个由原子plusminus组成的完整操作元组替换,后跟两个{{1每个包含整数操作数的元组。最后一个句子只处理普通值。

将它放在模块num中,编译它,并在Erlang shell中运行它会产生以下结果:

p