我正在尝试为程序创建解析器。例如, 我进入了(我想要的)
"(2 + 3)-4"它会变成这样的东西"(减去,(加号,第2号,第3号),第4号)"
到目前为止我做了什么..
"(2 + 3)-4"我然后拆分它,它变成列表Z = ["("," 2"," +"," 3",& #34;)"," - "," 4"]然后我比较了" - "是Z的成员,如果是真的我追加元素" - "进入新名单[" - "]
我不确定我做的方式是否正确,我是Er-lang的新手,并且经常挣扎。如果有人能够给我一些见解,谢谢。
答案 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
,我们只用元组替换它们。+
和-
。每个只是将{op,Operator}
元组推入累加器,其中Operator
是原子plus
或原子minus
。op
元组的情况,它被一个由原子plus
或minus
组成的完整操作元组替换,后跟两个{{1每个包含整数操作数的元组。最后一个句子只处理普通值。将它放在模块num
中,编译它,并在Erlang shell中运行它会产生以下结果:
p