From a4aa4b52680494fe4b909919ac16a0edae4e761a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E7=A4=BC=E6=88=90?= Date: Fri, 3 Mar 2023 11:19:55 +0800 Subject: [PATCH] fix rule --- apps/iot/src/iot_rule_parser.erl | 56 ++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/apps/iot/src/iot_rule_parser.erl b/apps/iot/src/iot_rule_parser.erl index d14b6b4..cc9cf42 100644 --- a/apps/iot/src/iot_rule_parser.erl +++ b/apps/iot/src/iot_rule_parser.erl @@ -134,30 +134,60 @@ get_tag(0) -> get_tag(_) -> complex. +-record(bracket, { + items = [] +}). %% 括号解析 parse_bracket(Tokens) -> parse_bracket(Tokens, [], []). parse_bracket([], [], S) -> - lists:reverse(S); + #bracket{items = lists:reverse(S)}; parse_bracket([], Acc, S) -> - lager:debug("acc is: ~p", [Acc]), - lists:reverse([lists:reverse(Acc)|S]); + #bracket{items = 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]); + {ChildElements, RestTokens} = parse_bracket0(Tokens), + Bracket = parse_bracket(ChildElements), + parse_bracket(RestTokens, [], [Bracket, 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) -> + parse_bracket0(Tokens, [], 1). +parse_bracket0([$)|Tokens], Acc, Level) when Level - 1 == 0 -> + {lists:reverse(Acc), Tokens}; +parse_bracket0([$)|Tokens], Acc, Level) -> + parse_bracket0(Tokens, [$)|Acc], Level - 1); +parse_bracket0([$(|Tokens], Acc, Level) -> + parse_bracket0(Tokens, [$(|Acc], Level + 1); +parse_bracket0([H|Tokens], Acc, Level) -> + parse_bracket0(Tokens, [H|Acc], Level). + +%% 处理运算符号解析出表达式和操作符号 +%{bracket,["id < 3 OR ", +% {bracket,["name = 'anlicheng' OR ", +% {bracket,["name = 'test' AND ", +% {bracket,["y = 1 OR x = 1"]}]}]}, +% " OR ", +% {bracket,["1 = 1"]}]} + +syntax(Bracket = #bracket{items = Items}) -> + lists:map(fun(E) -> + case E of + B = #bracket{} -> + syntax(B); + Expr -> + string:split(Expr, "AND", all) + + end + end, Items), + + + + ok. + -parse_bracket0([$)|Tokens], Acc) -> - Child = lists:reverse(Acc), - {Child, Tokens}; -parse_bracket0([H|Tokens], Acc) -> - parse_bracket0(Tokens, [H|Acc]).