Antlr解析规则以解析具有匹配大括号的字符串

时间:2018-01-25 11:54:38

标签: parsing antlr antlr4

我有一个解析器规则,如下所示

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

enter image description here

但是当我尝试解析具有多个匹配括号的字符串时,它无法正确解析,例如list(srcVm) of flows where (typeTag ="TAG_SRC_IP_VM") until timestamp

enter image description here

有人可以告诉我如何修改上述规则以匹配nested_query规则下的多个匹配大括号的字符串

                      nested_query:1
                            |
    ---------------------------------------------------------         
    list ( nested_query:3 ) of flows where ( nested_query:4) until timestamp                                                   
                  |                                |
                srcVM                    (typeTag ="TAG_SRC_IP_VM")

2 个答案:

答案 0 :(得分:1)

这应该是诀窍:

nested_query
 : ( LPARAN nested_query RPARAN | ~( LPARAN | RPARAN ) )+
 ;

list(srcVm) of flows where typeTag ="TAG_SRC_IP_VM" until timestamp

enter image description here

list(srcVm) of flows where (typeTag ="TAG_SRC_IP_VM") until timestamp

enter image description here

答案 1 :(得分:0)

那么根本就没有任何规则可以允许输入两个括号的输入而不是in | not in就在第二个开口括号前面

  • nested_query中唯一的第一个替代方法只允许出现一个括号(尽管它们可能是嵌套的) - 在顶级括号之外,必须没有括号。
  • 第二种选择允许使用顶级括号(从第一个nested_query开始),然后是非括号,然后是innot in,然后是第二个顶级/级别括号。
  • 第三种选择根本不允许使用括号。

要匹配一个级别的多个括号,nested_query的第一个选项应该类似

~(LPARAN | RPARAN)* (LPARAN nested_query RPARAN ~(LPARAN | RPARAN)*)+ ~(LPARAN | RPARAN)*

但是第二种选择会与此相冲突,因为所有可以匹配它的东西也可以匹配这个修改后的第一种选择。