我正在尝试解析像a IN [3 .. 5[这样的表达式,其中尖括号的方向决定了间隔是包含的还是排除的。我希望将此代码重写为如下所示的AST
NODE-TYPE
|
+------------+-----------+
| | |
variable lower-bound upper-bound其中,节点类型是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)这是可行的,除了它不能创建正确的树节点类型。如何根据匹配结果选择要创建的节点类型?
发布于 2009-08-13 11:29:15
我认为您必须通过为每个括号组合编写一条规则来解决此问题,手动添加节点类型。据我所知,不可能将两个(不相邻的)匹配令牌重写为另一个。
所以你会得到这样的结论:
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);https://stackoverflow.com/questions/1268977
复制相似问题