2009-08-12 7 views
1

J'essaye d'analyser une expression comme a IN [3 .. 5[, où la direction des chevrons détermine si l'intervalle est inclusif ou exclusif. Je veux que ce soit réécrite à un AST commeRègles de réécriture d'arborescence Antlr

   NODE-TYPE 
       | 
    +------------+-----------+ 
    |   |   | 
variable lower-bound upper-bound 

où NODE-TYPE est l'un des BTW_INCLUSIVE, BTW_EXCL_LOWER, BTW_EXCL_UPPER ou BTW_EXCL_BOTH, selon la direction des équerres.

J'ai la règle Parse suivante:

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

Cela fonctionne, sauf qu'il ne crée pas le type de nœud d'arborescence correct. Comment puis-je choisir quel type de noeud créer en fonction de ce qui a été mis en correspondance?

Répondre

5

Je pense que vous devez résoudre cela en écrivant une règle pour chacune des combinaisons de parenthèses, en ajoutant le type de nœud manuellement. Pour autant que je sache, il n'est pas possible de réécrire deux jetons correspondants (non adjacents) dans un autre.

Vous obtiendrez ceci:

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