【问题标题】:Antlr parsing rule to parse string with matching bracesAntlr 解析规则来解析带有匹配大括号的字符串
【发布时间】:2018-01-25 11:54:37
【问题描述】:

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

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")

【问题讨论】:

  • 您能否提供更多信息。 LPARAN/RPARAN/nested_query_op/...的定义是什么?
  • 更新了问题。我错过了那些规则。感谢您指出这一点。

标签: parsing antlr antlr4


【解决方案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

【讨论】:

    【解决方案2】:

    好吧,根本没有任何规则允许在第二个左大括号前面没有in|not in 的情况下允许输入两组括号:: p>

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

    要在一个级别上匹配多个括号,nested_query 的第一个替代项应该类似于

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

    但是第二个替代方案将与此冲突,因为任何可以匹配它的东西也可以匹配这个修改后的第一个替代方案。

    【讨论】:

    • 有没有办法修改nested_query解析规则以匹配list(srcVm) of flows where (typeTag ="TAG_SRC_IP_VM") until timestamp
    • 取决于你到底想做什么——你没有提供太多关于这方面的信息。您只想配对牙套吗?你想检查一下其他语法吗?
    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 2021-11-18
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多