Skip to content

Instantly share code, notes, and snippets.

@aeden
Created November 30, 2012 18:18
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save aeden/4177514 to your computer and use it in GitHub Desktop.
Save aeden/4177514 to your computer and use it in GitHub Desktop.
A TXT data lexer in Erlang
parse_txt([C|Rest]) -> parse_txt_char([C|Rest], C, Rest, [], false).
parse_txt(String, [], [], _) -> [String];
parse_txt(_, [], Tokens, _) -> Tokens;
parse_txt(String, [C|Rest], Tokens, Escaped) -> parse_txt_char(String, C, Rest, Tokens, Escaped).
parse_txt(String, [C|Rest], Tokens, CurrentToken, Escaped) -> parse_txt_char(String, C, Rest, Tokens, CurrentToken, Escaped).
parse_txt_char(String, $", Rest, Tokens, _) -> parse_txt(String, Rest, Tokens, [], false);
parse_txt_char(String, _, Rest, Tokens, _) -> parse_txt(String, Rest, Tokens, false).
parse_txt_char(String, $", Rest, Tokens, CurrentToken, false) -> parse_txt(String, Rest, Tokens ++ [CurrentToken], false);
parse_txt_char(String, $", Rest, Tokens, CurrentToken, true) -> parse_txt(String, Rest, Tokens, CurrentToken ++ [$"], false);
parse_txt_char(String, $\\, Rest, Tokens, CurrentToken, false) -> parse_txt(String, Rest, Tokens, CurrentToken, true);
parse_txt_char(String, $\\, Rest, Tokens, CurrentToken, true) -> parse_txt(String, Rest, Tokens, CurrentToken ++ [$\\], false);
parse_txt_char(String, C, Rest, Tokens, CurrentToken, _) -> parse_txt(String, Rest, Tokens, CurrentToken ++ [C], false).
@aeden
Copy link
Author

aeden commented Nov 30, 2012

Here is the inspiration:

parse_csv(String) -> parse_csv_val(re:replace(String,”\r”,”\n”, [global, {return, list}]),no,[],[]).
parse_csv_val([],no,Vals,DV) -> lists:reverse([lists:reverse(Vals)|DV]);
parse_csv_val([],{q,V},Vals,DV) -> lists:reverse([lists:reverse([lists:reverse(V)|Vals])|DV]);
parse_csv_val([],Val,Vals,DV) -> lists:reverse([lists:reverse([lists:reverse(Val)|Vals])|DV]);
parse_csv_val([$\n|Rest],no,Vals,DV) -> parse_csv_val(Rest,no,[],[lists:reverse(Vals)|DV]);
parse_csv_val([$\n|Rest],{q,V},Vals,DV) -> parse_csv_val(Rest,{q,[$\n|V]},Vals,DV);
parse_csv_val([$\n|Rest],Val,Vals,DV) -> parse_csv_val(Rest,no,[],[lists:reverse([lists:reverse(Val)|Vals])|DV]);
parse_csv_val([$"|Rest],no,Vals,DV) -> parse_csv_val(Rest,{q,[]},Vals,DV);
parse_csv_val([$"|Rest],{q,V},Vals,DV) -> parse_csv_val(Rest,no,[lists:reverse(V)|Vals],DV);
parse_csv_val([$,|Rest],no,Vals,DV) -> parse_csv_val(Rest,no,Vals,DV);
parse_csv_val([$,|Rest],{q,V},Vals,DV) -> parse_csv_val(Rest,{q,[$,|V]},Vals,DV);
parse_csv_val([$,|Rest],Val,Vals,DV) -> parse_csv_val(Rest,no,[lists:reverse(Val)|Vals],DV);
parse_csv_val([X|Rest],no,Vals,DV) -> parse_csv_val(Rest,[X],Vals,DV);
parse_csv_val([X|Rest],{q,V},Vals,DV) -> parse_csv_val(Rest,{q,[X|V]},Vals,DV);
parse_csv_val([X|Rest],Val,Vals,DV) -> parse_csv_val(Rest,[X|Val],Vals,DV).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment