Старый стал

30 строк кода в день — маловато как-то.
С другой стороны — иногда оно вот такое:

parse_task_info(Data) ->
{_, Dict} = parse_task_info(Data, #s{dict = dict:new()}),
Dict
.

parse_task_info([], S) -> {[], S#s.dict};

parse_task_info([$" |T], S)    when S#s.s =:= kquote    -> parse_task_info(T, S#s{token = [$"|S#s.token], s = kvalue});
parse_task_info([$" |T], S)    when S#s.s =:= nquote    -> parse_task_info(T, S#s{token = [$"|S#s.token], s = nvalue});
parse_task_info([H  |T], S)    when S#s.s =:= kquote orelse S#s.s =:= nquote    -> parse_task_info(T, S#s{token = [H|S#s.token]});
parse_task_info([$  |T], S)                                 -> parse_task_info(T, S);
parse_task_info([$= |T], S)    when S#s.s =:= start    -> parse_task_info(T, S#s{key = lists:reverse(S#s.token), token = «», s = kvalue});
parse_task_info([$( |T], S)    when S#s.s =:= start    -> parse_task_info(T, S#s{token = «», s = name});
parse_task_info([$( |T], S) when S#s.s =:= kvalue    ->
{Tn, Dict} = parse_task_info(T, S#s{root = sjoin(S#s.root, S#s.key), token = «», s = name}),
parse_task_info(Tn, S#s{dict = Dict, s = start, token=»"})
;
parse_task_info([$) |T], S) when S#s.s =:= name        -> parse_task_info(T, S#s{key = lists:reverse(S#s.token), token = «», s = nvalue});
parse_task_info([$" |T], S)    when S#s.s =:= kvalue     -> parse_task_info(T, S#s{token = [$"|S#s.token], s = kquote});
parse_task_info([$" |T], S)    when S#s.s =:= nvalue    -> parse_task_info(T, S#s{token = [$"|S#s.token], s = nquote});
parse_task_info([$, |T], S)    when S#s.s =:= start    ->
{T, S#s.dict}
;
parse_task_info([$, |T], S)    when S#s.s =:= kvalue    ->
Dict = dict:store(sjoin(S#s.root,S#s.key), lists:reverse(S#s.token), S#s.dict),
parse_task_info(T, S#s{dict = Dict, token = «», s = start})
;
parse_task_info([$,|T], S)        when S#s.s =:= nvalue    ->
Dict = dict:store(sjoin(S#s.root,S#s.key), lists:reverse(S#s.token), S#s.dict),
{T, Dict}
;
parse_task_info([$}|T], S)        when S#s.s =:= start    ->
{T, S#s.dict}
;
parse_task_info([${|T], S)        when S#s.s =:= nvalue    ->
{Tn, Dict} = parse_task_info(T, S#s{root = sjoin(S#s.root, S#s.key), token = «», s = start}),
parse_task_info(Tn, S#s{dict = Dict, s = start, token=»"})
;
parse_task_info([H|T], S)                                -> parse_task_info(T, S#s{token = [H|S#s.token]})
.

sjoin(«», «») -> «»;
sjoin(«», N2) -> N2;
sjoin(N1, «») -> N1;
sjoin(N1, N2) -> N1 ++ «.» ++ N2.

7 Comments

  1. avatar dimas:

    а я думал хуже перла уже ничего и не придумали …

    Ответить

    avatar

    Fyodor Ustinov отвечает на Август 14th, 2010 19:26:

    Да ладно, что тут непонятного? :)

    Ответить

    avatar

    dimas отвечает на Август 14th, 2010 19:28:

    если бы оно так легко читалось — ты бы не плакался :)

    кстати, а почему Эрланг? реальная потребность, или просто пощупать захотелось?

    Ответить

    avatar

    Fyodor Ustinov отвечает на Август 14th, 2010 19:38:

    Ну читается для меня уже действительно легко. Писалось со скрипом, это да. С другой стороны — это парсер на FSM, его на чем не пиши…

    Эрланг — потому что на него решаемая задача уж больно хорошо ложится.

    Ответить

    avatar

    dimas отвечает на Август 14th, 2010 19:40:

    А потом будет вакансия с винегретом языков, когда тебе надоест это поддерживать :)))

    Ответить

    avatar

    Fyodor Ustinov отвечает на Август 14th, 2010 19:44:

    Ну, ерланг нормальным программером изучается за пару недель.
    Поддерживать ерланговский код на самом деле значительно проще.
    Язык постепенно становится распространённым, так что знать его просто надо.

    P.S. Если я начну писать это на перле — проще будет переписать всё с нуля, если что. :)

    Ответить

  2. Я бы N1 ++ «.» ++ N2. заменил на [N1|["."|[N2]].
    Выполняется эффективней.

    Ответить

Leave a Reply