2009-08-12 17 views
1

a IN [3 .. 5[のような式を解析しようとしています。角カッコの方向によって、その間隔が包含的か排他的かが決まります。これはAntlrツリーの書き換えルール

NODE-TYPEは、角括弧の方向に応じて、BTW_INCLUSIVE、BTW_EXCL_LOWER、BTW_EXCL_UPPER又はBTW_EXCL_BOTHの一つである
   NODE-TYPE 
       | 
    +------------+-----------+ 
    |   |   | 
variable lower-bound upper-bound 

等ASTに書き換えることたいです。

私は、次の構文解析ルールを持っている:

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

これは動作しますが、それが正しいツリーノードの種類を作成しないことを除いて。どのようにして一致するものに基づいて作成するノードタイプを選択できますか?

答えて

5

私は、ブラケットの組み合わせごとに1つのルールを書いて、手動でノードタイプを追加することで、この問題を解決しなければならないと思います。私が知る限り、2つの(隣接していない)一致するトークンをもう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);