fix parser

This commit is contained in:
anlicheng 2025-06-10 23:19:03 +08:00
parent b3536f31b7
commit 6b678e454f

View File

@ -37,27 +37,28 @@ lexer(<<$\s, Rest/binary>>, Line, Current, Acc) ->
lexer(<<$\n, Rest/binary>>, Line, Current, Acc) -> lexer(<<$\n, Rest/binary>>, Line, Current, Acc) ->
lexer(Rest, Line + 1, Current, Acc); lexer(Rest, Line + 1, Current, Acc);
lexer(<<$\t, Rest/binary>>, Line, Current, Acc) -> lexer(<<$\t, Rest/binary>>, Line, Current, Acc) ->
lexer(Rest, Line, Current, Acc); lexer(Rest, Line, [" "|Current], Acc);
lexer(<<$#, Rest/binary>>, Line, _Current, Acc) -> lexer(<<$#, Rest/binary>>, Line, _Current, Acc) ->
{Comment, NewRest} = read_until(Rest, <<$\n>>), {Comment, NewRest} = read_until(Rest, <<$\n>>),
lexer(NewRest, Line + 1, [], [{comment, Line, Comment}|Acc]); lexer(NewRest, Line + 1, [], [{comment, Line, Comment}|Acc]);
%% , $=
lexer(<<${, Rest/binary>>, Line, [], Acc) -> lexer(<<${, Rest/binary>>, Line, [], Acc) ->
lexer(Rest, Line, [], [{'{', Line}|Acc]); lexer(Rest, Line, [], [{'{', Line}|Acc]);
lexer(<<$}, Rest/binary>>, Line, [], Acc) -> lexer(<<$}, Rest/binary>>, Line, [], Acc) ->
lexer(Rest, Line, [], [{'}', Line}|Acc]); lexer(Rest, Line, [], [{'}', Line}|Acc]);
lexer(<<$;, Rest/binary>>, Line, [], Acc) -> lexer(<<$;, Rest/binary>>, Line, [], Acc) ->
lexer(Rest, Line, [], [{';', Line}|Acc]); lexer(Rest, Line, [], [{';', Line}|Acc]);
%%
lexer(<<Char/utf8, Rest/binary>>, Line, Current, Acc) -> lexer(<<Char/utf8, Rest/binary>>, Line, Current, Acc) ->
case is_special(Char) of case is_special(Char) of
true -> true ->
NewAcc = case Current of case Current of
[] -> [] ->
Acc; lexer(Rest, Line, [], [{special, Line, list_to_binary([Char])}|Acc]);
_ -> _ ->
Ident = list_to_binary(string:trim(lists:reverse(Current))), Ident = list_to_binary(string:trim(lists:reverse(Current))),
[{ident, Line, Ident}|Acc] lexer(Rest, Line, [], [{special, Line, list_to_binary([Char])}, {ident, Line, Ident}|Acc])
end, end;
lexer(Rest, Line, [], [{special, Line, Char}|NewAcc]);
false -> false ->
lexer(Rest, Line, [Char|Current], Acc) lexer(Rest, Line, [Char|Current], Acc)
end. end.
@ -93,6 +94,10 @@ parser([{ident, _, <<"modbus">>}|Tokens], Stack) ->
parser(Tokens, [{block, modbus, []}|Stack]); parser(Tokens, [{block, modbus, []}|Stack]);
parser([{ident, _, <<"device">>}, {ident, _, Name}|Tokens], Stack) -> parser([{ident, _, <<"device">>}, {ident, _, Name}|Tokens], Stack) ->
parser(Tokens, [{block, {device, Name}, []}|Stack]); parser(Tokens, [{block, {device, Name}, []}|Stack]);
parser([{ident, _, <<"processor">>}, {ident, _, Name}|Tokens], Stack) ->
parser(Tokens, [{block, {processor, Name}, []}|Stack]);
parser([{ident, _, <<"alarm">>}, {ident, _, Name}|Tokens], Stack) ->
parser(Tokens, [{block, {alarm, Name}, []}|Stack]);
parser([{ident, _Line, Name}, {special, _, $=}|Tokens], [{block, _, Props}|Stack]) -> parser([{ident, _Line, Name}, {special, _, $=}|Tokens], [{block, _, Props}|Stack]) ->
{Value, Rest} = parse_value(Tokens, []), {Value, Rest} = parse_value(Tokens, []),
parser(Rest, [{block, Props#{binary_to_atom(Name, utf8) => Value}}|Stack]); parser(Rest, [{block, Props#{binary_to_atom(Name, utf8) => Value}}|Stack]);