2
J'essaie de créer une grammaire pour multiplier et diviser des nombres dans lesquels le symbole '*' n'a pas besoin d'être inclus. J'en ai besoin pour sortir un AST. Donc, pour l'entrée comme ceci:ANTLR: multiplication en omettant le symbole '*'
1 2/3 4
Je veux l'AST soit
(* (/ (* 1 2) 3) 4)
J'ai frappé sur ce qui suit, qui utilise le code java pour créer les nœuds appropriés:
grammar TestProd;
options {
output = AST;
}
tokens {
PROD;
}
DIV : '/';
multExpr: (INTEGER -> INTEGER)
({div = null;}
div=DIV? b=INTEGER
->
^({$div == null ? (Object)adaptor.create(PROD, "*") : (Object)adaptor.create(DIV, "/")}
$multExpr $b))*
;
INTEGER: ('0' | '1'..'9' '0'..'9'*);
WHITESPACE: (' ' | '\t')+ { $channel = HIDDEN; };
Cela fonctionne. Mais existe-t-il un moyen meilleur/plus simple?
Je savais qu'il devait y avoir une meilleure façon ... semble maintenant évident. Merci, Bart! –
@Dan, vous êtes les bienvenus! –