我有一个解析器规则,如下所示
nested_query: ~(LPARAN | RPARAN)+? LPARAN nested_query RPARAN ~(LPARAN | RPARAN)+?
| nested_query nested_query_op LPARAN nested_query RPARAN
| ~(LPARAN | RPARAN)+?
;
nested_query_op: binary_in | binary_not_in ;
binary_in: 'in';
binary_not_in: 'not' 'in';
LPARAN: '(';
RPARAN: ')';
这正确匹配字符串list(srcVm) of flows where typeTag ="TAG_SRC_IP_VM" until timestamp
但是当我尝试解析具有多个匹配括号的字符串时,它无法正确解析,例如list(srcVm) of flows where (typeTag ="TAG_SRC_IP_VM") until timestamp
有人可以告诉我如何修改上述规则以匹配nested_query
规则下的多个匹配大括号的字符串
nested_query:1
|
---------------------------------------------------------
list ( nested_query:3 ) of flows where ( nested_query:4) until timestamp
| |
srcVM (typeTag ="TAG_SRC_IP_VM")
答案 0 :(得分:1)
这应该是诀窍:
nested_query
: ( LPARAN nested_query RPARAN | ~( LPARAN | RPARAN ) )+
;
list(srcVm) of flows where typeTag ="TAG_SRC_IP_VM" until timestamp
list(srcVm) of flows where (typeTag ="TAG_SRC_IP_VM") until timestamp
答案 1 :(得分:0)
那么根本就没有任何规则可以允许输入两个括号的输入而不是in
| not in
就在第二个开口括号前面:
nested_query
中唯一的第一个替代方法只允许出现一个括号(尽管它们可能是嵌套的) - 在顶级括号之外,必须没有括号。nested_query
开始),然后是非括号,然后是in
或not in
,然后是第二个顶级/级别括号。要匹配一个级别的多个括号,nested_query
的第一个选项应该类似
~(LPARAN | RPARAN)* (LPARAN nested_query RPARAN ~(LPARAN | RPARAN)*)+ ~(LPARAN | RPARAN)*
但是第二种选择会与此相冲突,因为所有可以匹配它的东西也可以匹配这个修改后的第一种选择。