From 6b678e454f50aca7cd6e053aa5b847cc5e7979e7 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Tue, 10 Jun 2025 23:19:03 +0800 Subject: [PATCH] fix parser --- apps/modbus/src/modbus_parser.erl | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/apps/modbus/src/modbus_parser.erl b/apps/modbus/src/modbus_parser.erl index 8aeb7ca..eac1921 100644 --- a/apps/modbus/src/modbus_parser.erl +++ b/apps/modbus/src/modbus_parser.erl @@ -37,27 +37,28 @@ lexer(<<$\s, Rest/binary>>, Line, Current, Acc) -> lexer(<<$\n, Rest/binary>>, Line, Current, Acc) -> lexer(Rest, Line + 1, 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) -> {Comment, NewRest} = read_until(Rest, <<$\n>>), lexer(NewRest, Line + 1, [], [{comment, Line, Comment}|Acc]); +%% 处理特殊字符开头的行, ‘$=’ 不会是一行的开头 lexer(<<${, Rest/binary>>, Line, [], Acc) -> lexer(Rest, Line, [], [{'{', Line}|Acc]); lexer(<<$}, Rest/binary>>, Line, [], Acc) -> lexer(Rest, Line, [], [{'}', Line}|Acc]); lexer(<<$;, Rest/binary>>, Line, [], Acc) -> lexer(Rest, Line, [], [{';', Line}|Acc]); +%% 在行中遇到特殊字符的处理逻辑 lexer(<>, Line, Current, Acc) -> case is_special(Char) of true -> - NewAcc = case Current of - [] -> - Acc; - _ -> - Ident = list_to_binary(string:trim(lists:reverse(Current))), - [{ident, Line, Ident}|Acc] - end, - lexer(Rest, Line, [], [{special, Line, Char}|NewAcc]); + case Current of + [] -> + lexer(Rest, Line, [], [{special, Line, list_to_binary([Char])}|Acc]); + _ -> + Ident = list_to_binary(string:trim(lists:reverse(Current))), + lexer(Rest, Line, [], [{special, Line, list_to_binary([Char])}, {ident, Line, Ident}|Acc]) + end; false -> lexer(Rest, Line, [Char|Current], Acc) end. @@ -93,6 +94,10 @@ parser([{ident, _, <<"modbus">>}|Tokens], Stack) -> parser(Tokens, [{block, modbus, []}|Stack]); parser([{ident, _, <<"device">>}, {ident, _, Name}|Tokens], 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]) -> {Value, Rest} = parse_value(Tokens, []), parser(Rest, [{block, Props#{binary_to_atom(Name, utf8) => Value}}|Stack]);