完成了一个层级的匹配

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