-module(foo).
-compile(export_all).
p/1
。 parse(Str) ->
{ok, Tokens, _} = erl_scan:string(Str ++ "."),
{ok, [E]} = erl_parse:parse_exprs(Tokens),
E.
这个函数滥用了Erlang解析器,以便我们可以获取Erlang令牌的语法分析树。
rpn({op, _, What, LS, RS}) ->
rpn(LS),
rpn(RS),
io:format(" ~s ", [atom_to_list(What)]);
rpn({integer, _, N}) ->
io:format(" ~B ", [N]).
RPN输出是进行后序树遍历。因此,我们基本上遍历树的左侧和右侧,然后将自己作为节点输出。 "括号"的顺序在树中抽象存储。优先级由Erlang解析器处理。如果需要,可以轻松地通过递归下降分析器实现此操作。但这是与“如何编写Erlang解析器?”的问题不同。答案有两个方面:要么使用leex+yecc,要么使用基于解析器组合器和/或递归下降的解析器。特别是对于这么简单的语法。
p(Str) ->
Tree = parse(Str),
rpn(Tree),
io:format("~n").
这只是格式化文本。