完成了一个层级的匹配

This commit is contained in:
anlicheng 2025-06-11 18:25:05 +08:00
parent cc2d061d09
commit 6eadee5bd2

View File

@ -11,6 +11,11 @@
-export([parse/1, parse_file/1]). -export([parse/1, parse_file/1]).
-include("modbus_ast.hrl"). -include("modbus_ast.hrl").
-record(block, {
ident :: binary(),
props = []
}).
%% %%
parse(Input) when is_binary(Input) -> parse(Input) when is_binary(Input) ->
Tokens = lexer(Input), Tokens = lexer(Input),
@ -95,19 +100,22 @@ display_tokens(Tokens) ->
parser_block0([{comment, _, _}|Tokens]) -> parser_block0([{comment, _, _}|Tokens]) ->
parser_block0(Tokens); parser_block0(Tokens);
parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens]) -> parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens]) ->
parser_block0(Tokens, {block, Ident, []}). parser_block0(Tokens, #block{ident = Ident}).
%%
parser_block0([{ident, _, Ident}, {special, _, ${}|Tokens], B = #block{props = Props}) ->
{ResetTokens, B0} = parser_block0(Tokens, #block{ident = Ident, props = []}),
parser_block0(ResetTokens, B#block{props = [B0|Props]});
%% Block的关闭字符 %% Block的关闭字符
parser_block0([{special, _, $}}|Tokens], B) -> parser_block0([{special, _, $}}|Tokens], B = #block{props = Props}) ->
{Tokens, B}; {Tokens, B#block{props = lists:reverse(Props)}};
parser_block0([{special, _, $;}|Tokens], B) -> parser_block0([{special, _, $;}|Tokens], B) ->
parser_block0(Tokens, B); parser_block0(Tokens, B);
%% %%
parser_block0([{ident, _, <<>>}|Tokens], B) -> parser_block0([{ident, _, <<>>}|Tokens], B) ->
parser_block0(Tokens, B); parser_block0(Tokens, B);
%% : port /dev/ttyUSB0; %% : port /dev/ttyUSB0;
parser_block0([{ident, _Line, Prop}, {special, _, $;}|Tokens], {block, Block, Props}) -> parser_block0([{ident, _Line, Prop}, {special, _, $;}|Tokens], B = #block{props = Props}) ->
parser_block0(Tokens, {block, Block, [Prop|Props]}); parser_block0(Tokens, B#block{props = [Prop|Props]});
%% %%
parser_block0([{comment, _, _}|Tokens], B) -> parser_block0([{comment, _, _}|Tokens], B) ->
parser_block0(Tokens, B). parser_block0(Tokens, B).