fix parser
This commit is contained in:
parent
b3536f31b7
commit
6b678e454f
@ -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(<<Char/utf8, Rest/binary>>, 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]);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user