gpt4 book ai didi

parsing - Erlang 中的符号算术

转载 作者:行者123 更新时间:2023-12-04 02:47:41 25 4
gpt4 key购买 nike

以下是 O'Reilly Erlang 书中的一个练习:

构建一组操作算术表达式的函数。以如下表达式开头:

(~((2*3)+(3*4)))

它完全包含在括号中,您使用波浪号 (~) 表示一元减号。

首先,为这些编写一个解析器,将它们转换为 Erlang 表示,例如以下:

{minus, {plus, {num, 2}, {num,3}}, {num, 4}}

代表((2+3)-4) ...

我该怎么做?

最佳答案

好吧,你怎么做取决于你想要什么样的解析器。最简单的方法可能是使用类似 yecc 的东西或 neotoma为这种语言生成解析器。

如果您尝试手动编写解析器,那当然是可能的。以下是您可能如何开始编写一个:

-module(parser).
-export([parse/1]).

%% parser:parse("((2+3)+4)") =:= {plus, {plus, {num, 2}, {num, 3}}, {num, 4}}.

parse(S) ->
{[Expr], ""} = parse(S, expr, []),
Expr.

-define(IS_DIGIT(C), (C >= $0 andalso C =< $9)).
-define(IS_SPACE(C),
(C =:= $\s orelse C =:= $\t orelse C =:= $\r orelse C =:= $\n)).
is_space(C) ->
?IS_SPACE(C).
is_digit(C) ->
?IS_DIGIT(C).

skip_space(S) ->
lists:dropwhile(fun is_space/1, S).

parse([$( | Rest], expr, []) ->
{[Expr], Rest1} = parse(Rest, expr, []),
[$) | Rest2] = skip_space(Rest1),
parse(Rest2, op, [Expr]);
parse(S=[D | _], expr, []) when ?IS_DIGIT(D) ->
{Ds, Rest1} = lists:splitwith(fun is_digit/1, S),
parse(Rest1, op, [{num, list_to_integer(Ds)}]);
parse([$+ | Rest], op, [Left]) ->
{[Right], Rest1} = parse(Rest, expr, []),
{[{plus, Left, Right}], Rest1};
parse([C|Rest], State, Acc) when ?IS_SPACE(C) ->
parse(skip_space(Rest), State, Acc);
parse(S, _State, Acc) ->
{Acc, S}.

关于parsing - Erlang 中的符号算术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18557680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com