Skip to content

Instantly share code, notes, and snippets.

@niamtokik
Created January 21, 2017 20:00
Show Gist options
  • Save niamtokik/7edbc46172b869aeed887530b042ce60 to your computer and use it in GitHub Desktop.
Save niamtokik/7edbc46172b869aeed887530b042ce60 to your computer and use it in GitHub Desktop.
% Simple erlang parser.
-module(parser).
-compile([export_all]).
% Start char, with start State
-define(DATA_START(X, K),
data(<<X, Rest/bitstring>>, Buf, Ret) ->
data(Rest, Buf, Ret, K)).
% End char, drop the rest of the line
-define(DATA_END(X),
data(<<X>>, Buf, Ret, State) ->
Ret ++ [{State, Buf}];
data(<<X,_/bitstring>>, Buf, Ret, State) ->
[{State, Buf}] ++ Ret).
% Null char, just dropped.
-define(DATA_NULL(X),
data(<<X, Rest/bitstring>>, Buf, Ret, State) ->
data(Rest, Buf, Ret, State)).
% Character(s), Current State, Next State
-define(DATA_SEP(X, S, N),
data(<<X, Rest/bitstring>>, Buf, Ret, S) ->
data(Rest, <<>>, [{S, Buf}] ++ Ret , N)).
data(Bitstring) ->
data(Bitstring, <<>>, []).
?DATA_START("[", key).
?DATA_END("]");
?DATA_NULL(" ");
?DATA_SEP(":", key, value);
?DATA_SEP("->", value, target);
?DATA_SEP("<-", target, from);
data(<<Char, Rest/bitstring>>, Buf, Ret, State)
when (Char >= $0 andalso Char =< $9 ) orelse
(Char >= $A andalso Char =< $z ) ->
data(Rest, <<Buf/bitstring, Char>>, Ret, State);
data(<<Char, Rest/bitstring>>, _, _, State) ->
{error, bad_char, <<Char>>, State}.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment