【问题标题】:Antlr Tree Grammar蚂蚁树语法
【发布时间】:2012-05-01 05:05:18
【问题描述】:

我在从解析器语法迁移到树语法时遇到了问题,当我使用树运算符 (^,!) 而不是重写规则 (->) 时出现问题

where_clause
    :   'where'! condition_or
    ;

condition_or
    :   condition_and ( 'or'^ condition_and )*
    ;

condition_and
    :   condition_expr ( 'and'^ condition_expr )*
    ;

condition_expr
    :   condition_comparision
//  |   condition_in
//  |   condition_like
    ;

condition_comparision
    :   column_identifier ('=' | '!=' | '>' | '<')^ sql_element
    ;

对于上面的解析器语法,树语法会是什么样子?由于这不是递归的,因此我无法将其折叠成树语法中的单个规则。

使用重写语法强制重写解析器语法的另一种方法

condition_or
    :   condition_and -> condition_and 
     ( 'or' x=condition_and -> ^('or' condition_or $x))*
    ;

有没有更简单的方法?

谢谢

【问题讨论】:

    标签: java tree antlr grammar abstract-syntax-tree


    【解决方案1】:

    相应的树语法如下所示:

    where_clause
        :   condition_or
        ;
    
    condition_or
        :   ^('or' condition_and condition_and)
        ;
    
    condition_and
        :   ^('and' condition_expr condition_expr)
        ;
    
    condition_expr
        :   condition_comparision
        ;
    
    condition_comparision
        :   ^('=' column_identifier sql_element)
        |   ^('!=' column_identifier sql_element)
        |   ^('>' column_identifier sql_element)
        |   ^('<' column_identifier sql_element)
        ;
    

    【讨论】:

    • 你让它看起来很简单。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 2023-03-27
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    相关资源
    最近更新 更多