代码之家  ›  专栏  ›  技术社区  ›  tuk

Antlr分析规则,用于分析具有匹配大括号的字符串

  •  1
  • tuk  · 技术社区  · 6 年前

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

    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 回复  |  直到 6 年前
        1
  •  1
  •   Bart Kiers    6 年前

    这应该可以做到:

    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

        2
  •  0
  •   Jiri Tousek    6 年前

    没有任何规则允许两组括号紧跟输入 没有 in | not in 就在第二个大括号前面` :

    • 中唯一的第一个备选方案 nested_query 只允许出现一个括号(尽管它们可能是嵌套的)-在顶级括号之外,不能有括号。
    • 第二个备选方案允许使用顶级括号(从第一个 嵌套的\u查询 )后跟非括号,然后 在里面 歪投球 然后是第二个顶部/级别括号。
    • 第三种选择根本不允许使用括号。

    要在一个级别上匹配多个括号,第一个选项是 嵌套的\u查询 应该是这样的

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

    但是,第二个备选方案将与此相冲突,因为所有能够匹配它的东西也可以匹配修改后的第一个备选方案。