diff --git a/apps/iot/src/iot_rule_parser.erl b/apps/iot/src/iot_rule_parser.erl index ee94354..d14b6b4 100644 --- a/apps/iot/src/iot_rule_parser.erl +++ b/apps/iot/src/iot_rule_parser.erl @@ -11,6 +11,8 @@ %% API -export([parse/1, test/0]). +-export([parse_bracket/1]). + test() -> %Rule = <<"SELECT * FROM service.data WHERE id > 0 AND (name = 'anlicheng' OR name = 'test')">>, @@ -133,3 +135,29 @@ get_tag(_) -> complex. +%% 括号解析 +parse_bracket(Tokens) -> + parse_bracket(Tokens, [], []). + +parse_bracket([], [], S) -> + lists:reverse(S); +parse_bracket([], Acc, S) -> + lager:debug("acc is: ~p", [Acc]), + lists:reverse([lists:reverse(Acc)|S]); +parse_bracket([$(|Tokens], Acc, S) -> + {Child, RestTokens} = parse_bracket0(Tokens, []), + %lager:debug("child is: ~p, rest: ~p, s1: ~p", [Child, RestTokens, [Child, lists:reverse(Acc)|S]]), + parse_bracket(RestTokens, [], [Child, lists:reverse(Acc)|S]); +parse_bracket([H|Tokens], Acc, S) -> + parse_bracket(Tokens, [H|Acc], S). + +parse_bracket0([$(|Tokens], Acc) -> + Child = parse_bracket(Tokens), + +parse_bracket0([$)|Tokens], Acc) -> + Child = lists:reverse(Acc), + {Child, Tokens}; +parse_bracket0([H|Tokens], Acc) -> + parse_bracket0(Tokens, [H|Acc]). + +