fix parser

This commit is contained in:
anlicheng 2025-06-11 16:16:13 +08:00
parent 84413ca1bc
commit b4c5b8c050

View File

@ -14,11 +14,14 @@
%% %%
parse(Input) when is_binary(Input) -> parse(Input) when is_binary(Input) ->
Tokens = lexer(Input), Tokens = lexer(Input),
{ok, AST} = parser(Tokens), R = parser(Tokens),
case validate(AST) of lager:debug("parse result is: ~p", [R]).
ok -> {ok, AST};
{error, Reason} -> {error, Reason} %{ok, AST} = parser(Tokens),
end. %case validate(AST) of
% ok -> {ok, AST};
% {error, Reason} -> {error, Reason}
%end.
parse_file(Filename) -> parse_file(Filename) ->
case file:read_file(Filename) of case file:read_file(Filename) of
@ -80,60 +83,71 @@ is_special(_) -> false.
%% AST %% AST
parser(Tokens) -> parser(Tokens) ->
%display_tokens(Tokens), %display_tokens(Tokens),
parser(Tokens, 0, []). {_, B} = parser_block0(Tokens),
{ok, B}.
display_tokens(Tokens) -> display_tokens(Tokens) ->
lists:foreach(fun(T) -> lager:debug("token is: ~p", [T]) end, Tokens). lists:foreach(fun(T) -> lager:debug("token is: ~p", [T]) end, Tokens).
%% tokens解析成block %% tokens解析成block, {ResetToken, Block}
parser([], 0, Blocks0) -> %%
Blocks = lists:reverse(Blocks0), parser_block0([{comment, _, _}|Tokens]) ->
lager:debug("parse result: ~p", [Blocks]), parser_block0(Tokens);
{ok, Blocks}; parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens]) ->
parser_block1(Tokens, {block, Ident, []}).
%% Block的关闭字符 %% Block的关闭字符
parser([{special, _, $}}|Tokens], 1, Stack) -> parser_block1([{special, _, $}}|Tokens], B) ->
parser(Tokens, 0, Stack); {Tokens, B};
parser([{special, _, $}}|Tokens], Level, Stack) -> parser_block1([{special, _, $;}|Tokens], B) ->
parser(Tokens, Level - 1, Stack); parser_block1(Tokens, B);
parser([{special, _, $;}|Tokens], Level, Stack) ->
parser(Tokens, Level, Stack);
%% %%
parser([{ident, _, <<>>}|Tokens], Level, Stack) -> parser_block1([{ident, _, <<>>}|Tokens], B) ->
parser(Tokens, Level, Stack); parser_block1(Tokens, B);
%% : port /dev/ttyUSB0;
parser_block1([{ident, _Line, Prop}, {special, _, $;}|Tokens], {block, Block, Props}) ->
parser_block1(Tokens, {block, Block, [Prop|Props]});
%%
parser_block1([{comment, _, _}|Tokens], B) ->
parser_block1(Tokens, B).
%% , , level值必须等于0 %% , : {ResetTokens, Props}
parser([{ident, _, <<"modbus">>}, {special, _, ${} |Tokens], 0, Stack) -> %% Block的关闭字符
parser(Tokens, 1, [{block, modbus, []}|Stack]); parser_props([{special, _, $}}|Tokens], 0, Props) ->
parser([{ident, _, <<"device", Name/binary>>}, {special, _, ${}|Tokens], 0, Stack) -> {Tokens, lists:reverse(Props)};
parser(Tokens, 1, [{block, {device, string:trim(Name)}, []}|Stack]); parser_props([{special, _, $}}|Tokens], Level, Props) ->
parser([{ident, _, <<"processor", Name/binary>>}, {special, _, ${}|Tokens], 0, Stack) -> lager:debug("call level: ~p, me here: ~p", [Level, Props]),
parser(Tokens, 1, [{block, {processor, string:trim(Name)}, []}|Stack]); parser_props(Tokens, Level - 1, Props);
parser([{ident, _, <<"alarm", Name/binary>>}, {special, _, ${}|Tokens], 0, Stack) ->
parser(Tokens, 1, [{block, {alarm, string:trim(Name)}, []}|Stack]);
%% parser_props([{special, _, $;}|Tokens], Level, Props) ->
parser([{ident, _, <<"transport", Proto/binary>>}, {special, _, ${} | Tokens], Level, Stack) -> parser_props(Tokens, Level, Props);
parser(Tokens, Level + 1, [{block, {transport, string:trim(Proto)}, []}|Stack]); %%
parser([{ident, _, <<"variables">>}, {special, _, ${}|Tokens], Level, Stack) -> parser_props([{ident, _, <<>>}|Tokens], Level, Props) ->
parser(Tokens, Level + 1, [{block, variables, []}|Stack]); parser_props(Tokens, Level, Props);
%%
parser_props([{ident, _, <<"transport", Proto/binary>>}, {special, _, ${} | Tokens], Level, Props) ->
{RestTokens, ChildProps} = parser_props(Tokens, 1, []),
display_tokens(Tokens),
parser_props(RestTokens, Level - 1, [{block, {transport, Proto}, ChildProps}|Props]);
parser_props([{ident, _, <<"variables">>}, {special, _, ${}|Tokens], Level, Props) ->
{RestTokens, ChildProps} = parser_props(Tokens, 1, []),
parser_props(RestTokens, Level + 1, [{block, variables, ChildProps}|Props]);
%% %%
parser([{ident, _, BlockName}, {special, _, ${}|Tokens], Level, Stack) -> parser_props([{ident, _, BlockName}, {special, _, ${}|Tokens], Level, Props) ->
parser(Tokens, Level + 1, [{block, BlockName, []}|Stack]); {RestTokens, ChildProps} = parser_props(Tokens, 1, []),
parser_props(RestTokens, Level + 1, [{block, BlockName, ChildProps}|Props]);
%% : port /dev/ttyUSB0; %% : port /dev/ttyUSB0;
parser([{ident, _Line, Prop}, {special, _, $;}|Tokens], Level, [{block, Block, Props}|Stack]) -> parser_props([{ident, _Line, Prop}, {special, _, $;}|Tokens], Level, Props) ->
parser(Tokens, Level, [{block, Block, [Prop|Props]}|Stack]); parser_props(Tokens, Level, [Prop|Props]);
%% todo %%
%parser([{ident, _Line, Name}, {special, _, $=}|Tokens], [{block, _, Props}|Stack]) -> parser_props([{comment, _, _}|Tokens], Level, Props) ->
% {Value, Rest} = parse_value(Tokens, []), parser_props(Tokens, Level, Props).
% parser(Rest, [{block, Props#{binary_to_atom(Name, utf8) => Value}}|Stack]);
parser([{comment, _, _}|Tokens], Level, Stack) ->
parser(Tokens, Level, Stack).
parse_value([{ident, _, Value}|Tokens], _) -> {binary_to_atom(Value, utf8), Tokens}; parse_value([{ident, _, Value}|Tokens], _) -> {binary_to_atom(Value, utf8), Tokens};
parse_value([{integer, _, Value}|Tokens], _) -> {Value, Tokens}; parse_value([{integer, _, Value}|Tokens], _) -> {Value, Tokens};