首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Antlr树重写规则

Antlr树重写规则
EN

Stack Overflow用户
提问于 2009-08-12 22:01:28
回答 1查看 1.7K关注 0票数 1

我正在尝试解析像a IN [3 .. 5[这样的表达式,其中尖括号的方向决定了间隔是包含的还是排除的。我希望将此代码重写为如下所示的AST

代码语言:javascript
复制
             NODE-TYPE
                 |
    +------------+-----------+
    |            |           |
 variable  lower-bound  upper-bound

其中,节点类型是BTW_INCLUSIVE、BTW_EXCL_LOWER、BTW_EXCL_UPPER或BTW_EXCL_BOTH之一,具体取决于尖括号的方向。

我有以下解析规则:

代码语言:javascript
复制
interval_expr : expr1=variable IN
                (LBRACKET|RBRACKET)
                expr2=expression DOTDOT expr3=expression
                (LBRACKET|RBRACKET)
                -> ^(BETWEEN $expr1 $expr2 $expr3)

这是可行的,除了它不能创建正确的树节点类型。如何根据匹配结果选择要创建的节点类型?

EN

回答 1

Stack Overflow用户

发布于 2009-08-13 11:29:15

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

所以你会得到这样的结论:

代码语言:javascript
复制
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);
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1268977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档