完成了一个层级的匹配
This commit is contained in:
parent
cc2d061d09
commit
6eadee5bd2
@ -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).
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user