diff --git a/apps/modbus/src/modbus_parser.erl b/apps/modbus/src/modbus_parser.erl index c14be28..bd6c7f5 100644 --- a/apps/modbus/src/modbus_parser.erl +++ b/apps/modbus/src/modbus_parser.erl @@ -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).