1

のような式を解析しようとしています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)

これは機能しますが、正しいツリー ノード タイプが作成されません。一致したものに基づいて作成するノード タイプを選択するにはどうすればよいですか?

4

1 に答える 1

5

これを解決するには、ブラケットの組み合わせごとに 1 つのルールを記述し、ノード タイプを手動で追加する必要があると思います。私の知る限り、2 つの (隣接していない) 一致するトークンを別のトークンに書き換えることはできません。

したがって、次のようになります。

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);
于 2009-08-13T11:29:15.440 に答える