Parsing Antlr树重写规则

Parsing Antlr树重写规则,parsing,antlr,Parsing,Antlr,我试图解析[3..5[中的a这样的表达式,其中尖括号的方向决定了间隔是包含的还是独占的。我希望将其重写为类似AST的表达式 NODE-TYPE | +------------+-----------+ | | | variable lower-bound upper-bound 其中节点类型是BTW_INCLUSIVE、BTW_EXCL_LOWER、BTW_EXCL_UP

我试图解析[3..5[中的
a这样的表达式,其中尖括号的方向决定了间隔是包含的还是独占的。我希望将其重写为类似AST的表达式

             NODE-TYPE
                 |
    +------------+-----------+
    |            |           |
 variable  lower-bound  upper-bound
其中节点类型是BTW_INCLUSIVE、BTW_EXCL_LOWER、BTW_EXCL_UPPER或BTW_EXCL_两者之一,具体取决于尖括号的方向

我有以下解析规则:

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

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

我认为您必须为每个括号组合编写一条规则,手动添加节点类型来解决此问题。据我所知,无法重写两条(非相邻的)将令牌相互匹配

所以你会得到这个:

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

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

所以你会得到这个:

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