From 45d41245f95e3198d3ad051124c2665f78a44df3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E7=A4=BC=E6=88=90?= Date: Wed, 1 Mar 2023 20:44:19 +0800 Subject: [PATCH] fix --- apps/iot/src/iot_rule_parser.erl | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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]). + +