Antlr 解析规则来解析带有匹配大括号的字符串
Antlr parsing rule to parse string with matching braces
我有一个如下所示的解析器规则
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")
好吧,根本没有任何规则允许在第二个左括号前面没有 in
|not in
的情况下输入两组括号 `:
nested_query
中唯一的第一个选项只允许出现一次括号(尽管它们可能是嵌套的)- 在顶级括号之外必须没有括号。
- 第二种选择允许顶级括号(从第一个
nested_query
开始)后跟非括号,然后是 in
或 not in
,然后是第二个 top/level 括号。
- 第三种选择根本不允许使用括号。
要在一个级别上匹配多个括号,nested_query
的第一个替代项应该类似于
~(LPARAN | RPARAN)* (LPARAN nested_query RPARAN ~(LPARAN | RPARAN)*)+ ~(LPARAN | RPARAN)*
但是第二个备选方案将与此冲突,因为所有可以匹配它的东西也可以匹配这个修改后的第一个备选方案。
这应该可以解决问题:
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
我有一个如下所示的解析器规则
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")
好吧,根本没有任何规则允许在第二个左括号前面没有 in
|not in
的情况下输入两组括号 `:
nested_query
中唯一的第一个选项只允许出现一次括号(尽管它们可能是嵌套的)- 在顶级括号之外必须没有括号。- 第二种选择允许顶级括号(从第一个
nested_query
开始)后跟非括号,然后是in
或not in
,然后是第二个 top/level 括号。 - 第三种选择根本不允许使用括号。
要在一个级别上匹配多个括号,nested_query
的第一个替代项应该类似于
~(LPARAN | RPARAN)* (LPARAN nested_query RPARAN ~(LPARAN | RPARAN)*)+ ~(LPARAN | RPARAN)*
但是第二个备选方案将与此冲突,因为所有可以匹配它的东西也可以匹配这个修改后的第一个备选方案。
这应该可以解决问题:
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