60 lines
1.5 KiB
Erlang
60 lines
1.5 KiB
Erlang
% @doc
|
|
% working out infix parsing bullshit on toy arith language
|
|
%
|
|
% our operators for now are
|
|
%
|
|
% [+, *, ^] in outer->inner order
|
|
-module(ifarith).
|
|
|
|
-export([main/0]).
|
|
|
|
test_str() ->
|
|
"1 + 2 + 3"
|
|
|
|
main() ->
|
|
% first going to tokenize
|
|
Tokens = tokens(test_str()).
|
|
|
|
-record(tk,
|
|
{type = none :: int | op | noise,
|
|
str = none :: none | string(),
|
|
val = none :: none | integer() | atom()}).
|
|
|
|
tokens(Stk, []) ->
|
|
lists:reverse(Stk).
|
|
% [+*^] op token
|
|
tokens(Stk, [Char | Rest]) ->
|
|
case Char of
|
|
Op when $+ =:= Op; $* =:= Op; $^ =:= Op ->
|
|
Tk = #tk{type = op, str = [Op], val = list_to_tuple([Op])},
|
|
tokens([Tk | Stk], Rest);
|
|
D when $0 =< D, D =< $9 ->
|
|
{Tk, NewSrcStr} = tk_int([D], [D], Rest),
|
|
tokens([Tk | Stk], NewSrcStr).
|
|
_ ->
|
|
tokens(Stk, Rest)
|
|
end.
|
|
|
|
|
|
% tokens for now are
|
|
-spec tk_int(DigitStack, CharStack, SrcStr) -> Result when
|
|
DigitStack :: string(),
|
|
CharStack :: string(),
|
|
SrcStr :: string(),
|
|
Result :: {Token, NewSrcStr},
|
|
Token :: #tk{},
|
|
NewSrcStr :: string().
|
|
|
|
tk_int(DigitStack, CharStack, SrcStr) ->
|
|
case SrcStr of
|
|
% cases when still consuming the int
|
|
% [0-9]
|
|
[D | NewSrcStr] when $0 =< D, D =< $9 ->
|
|
tk_int([D | DigitStack], [D | CharStack], NewSrcStr);
|
|
[$_ | NewSrcStr] ->
|
|
tk_int(DigitStack, [D | CharStack], NewSrcStr);
|
|
% otherwise done
|
|
_ ->
|
|
Digits =
|
|
end.
|