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