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 开始)后跟非括号,然后是 innot 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