On construit un arbre au fur et à mesure que l'on parse le fichier de données. On commence par un fichier povray appellé que l'on définit comme une suite de caméras, boîtes, lumières, ... Après avoir reconnu l'objet, on appelle la méthode pov2C sur cet objet, qui va se charger d'écrire le code C :
co = cone { co.pov2C(fichier); } |
L'objet trouvé retourne un Objet JAVA qui est initialisé avec les bon paramètres :
cone returns [ Cone co=null ] { Point3D a=null, c=null; Modif o = null; double b, d; co= new Cone();} : "cone" BEGBLOCK a=vector3d {co.setBase(a);} VIRG b=chiffre { co.setRayon1(b); } |
On voit ici clairement la structure en arbre évoquée précedemment, avec comme racine le fichier ayant pour fils des objets, ayant eux-même pour fils des attributs. L'utilisation de cet arbre permet également de gérer facilement les unions d'objets, pour lesquels on peut spécifier des attributs en commun (comme une rotation ou une couleur, par exemple). Dans ce cas, l'union a pour fils des objets et des attributs communs à ces objets.
Voici maintenant comment se passe l'évaluation d'une expression :
expression returns [ String p = null ] : { String p1, p2, p3; } p1 = mulExpression ((ADD { p3 = "+"; } | MOINS { p3 = "-"; }) p2 = mulExpression { p1 += p3 + p2; })* {p = p1;}; mulExpression returns [ String p = null ] : { String op1, op2; } (op1=divExpression (MUL op2=divExpression { op1 +="*" + op2; })*) { p=op1; }; divExpression returns[ String p = null ] : { String op1, op2; } (op1=signeExpression (DIV op2=signeExpression { op1 +="/"+op2; })*) { p=op1; }; signeExpression returns [String p = ""] : { String op =null; } op=atom{p+=op;}; atom returns [ String p = null] : { String p1; double a; } ( (a=chiffre { p=a+"";) } | ("clock" { p="clock";}) | (LPAR p1=expression RPAR { p = "("+p1+")"; } )); |
ce qui équivaut à l'arbre présenté par la figure .