【问题标题】:Antlr tree rewrite rulesAntlr 树重写规则
【发布时间】:2009-08-12 22:01:27
【问题描述】:

我正在尝试解析像a IN [3 .. 5[ 这样的表达式,其中尖括号的方向决定了区间是包含还是不包含。我希望将其重写为类似 AST 的

             NODE-TYPE
                 |
    +------------+-----------+
    |            |           |
 variable  lower-bound  upper-bound

其中 NODE-TYPE 是 BTW_INCLUSIVE、BTW_EXCL_LOWER、BTW_EXCL_UPPER 或 BTW_EXCL_BOTH 之一,具体取决于尖括号的方向。

我有以下解析规则:

interval_expr : expr1=variable IN
                (LBRACKET|RBRACKET)
                expr2=expression DOTDOT expr3=expression
                (LBRACKET|RBRACKET)
                -> ^(BETWEEN $expr1 $expr2 $expr3)

这可行,只是它没有创建正确的树节点类型。如何根据匹配的内容选择要创建的节点类型?

【问题讨论】:

    标签: parsing antlr


    【解决方案1】:

    我认为你必须通过为每个括号组合编写一个规则来解决这个问题,手动添加节点类型。据我所知,不可能将两个(不相邻的)匹配标记重写为另一个。

    所以你会得到这个:

    interval_expr:
      inclusive_expr |
      excl_lower_expr |
      excl_upper_expr |
      excl_both_expr;
    
    inclusive_expr:
      expr1=variable IN LBRACKET expr2=expression DOTDOT expr3=expression RBRACKET
        -> ^(BTW_INCLUSIVE $expr1 $expr2 $expr3);
    
    excl_lower_expr:
      expr1=variable IN RBRACKET expr2=expression DOTDOT expr3=expression RBRACKET
        -> ^(BTW_EXCL_LOWER $expr1 $expr2 $expr3);
    
    excl_upper_expr:
      expr1=variable IN LBRACKET expr2=expression DOTDOT expr3=expression LBRACKET
        -> ^(BTW_EXCL_UPPER $expr1 $expr2 $expr3);
    
    excl_both_expr:
      expr1=variable IN RBRACKET expr2=expression DOTDOT expr3=expression LBRACKET
        -> ^(BTW_EXCL_BOTH $expr1 $expr2 $expr3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      相关资源
      最近更新 更多