CSC 4508 - Traduction: TP noté 2008-2009

L'exercice concerne le langage ActionScript3, associé au player Flash.

On considère un tout petit sous-ensemble, relatif aux animations 2D.

L'idée est de donner un aperçu des possibilités et questions pour générer un code Java réalisant une animation équivalente (Java a des possibilités d'animation moins optimisées, mais permet des applications polyvalentes puissantes).

La traduction d'un code en langage X dans un autre langage Y est un problème complexe. Après la reconnaissance, il y a des questions "sémantiques" plus ou moins difficiles : identifier dans Y les constructions pouvant donner un résultat équivalent. Il existe cependant des traducteurs (Python2 vers Python3, Processing vers Java, Flex [celui de Adobe] vers ActionScript, ... etc)

On se limite ici:

Par comparaison à un code Java fourni, de fonctionnalité équivalente, on pourra évaluer les traductions qui seraient à réaliser automatiquement, vérifier certaines conditions, éventuellement en réaliser une partie.

A - RECONNAISSANCE DES UNITES LEXICALES

A1 - Analyseur lexical seul (3 points)

Mettre au point un analyseur A1.flex reconnaissant toutes les unités lexicales de Examples/aScript.txt.

  1. Reconnaître, par la même règle, les valeurs numériques en acceptant indifféremment les valeurs réelles ou entières
  2. Créer une même règle pour l'ensemble de mots-clés suivants:
            package   class     function
            public    private
            var       Number    void       this
            if        else
    
  3. Créer une seule règle reconnaissant les symboles de programmation
  4. Créer une seule règle reconnaissant les opérateurs de comparaison: < > <= >= ==
  5. Créer des règles pour chacun des éléments suivants
Indications

A2 - Analyseurs lexical et syntaxique couplés (4 points)

Mettre au point un analyseur A2.flex, gramA2.bison, prin.c passant les unités lexicales à l'analyseur syntaxique, qui les reçoit une à une, sans faire aucun regroupement en "forme syntaxique":

Indications

B - ANALYSE SYNTAXIQUE

Mettre au point successivement les analyseurs lexBxx.flex gramBxx.bison prin.c suivants.

Indications

B1 - Noms composés (ou "références") (2 points)

Mettre au point l'analyseur lexB1.flex, gramB1.bison, prin.c reconnaissant un nom composé c'est-à-dire un symbole, ou bien le mot-clé "this", éventuellement suivis d'autres symboles, chaque nom ajouté étant précédé de '.'

Fichier exemple : Examples/B1.dat

B2 - Arguments et appels de fonction (2 points)

Mettre au point l'analyseur lexB2.flex, gramB2.bison, prin.c reconnaissant: Fichier exemple : Examples/B2.dat

B3 - Expressions arithmétiques (2 points)

Mettre au point l'analyseur lexB3.flex, gramB3.bison, prin.c reconnaissant les expressions arithmétiques. Un opérande peut être une valeur numérique ou un nom composé ou un appel de fonction.

Fichier exemple : Examples/B3.dat

Indications

B4 - Définitions de variables (2 points)

Mettre au point l'analyseur lexB4.flex, gramB4.bison, prin.c reconnaissant des définitions de variables VarDef.

Fichier exemple : Examples/B4.dat

Une définition de variables avec leurs types VarDef peut être de la forme suivante:
private var ball:Ball
private var vx:Number

B5 - Instructions simples (2 points)

Mettre au point l'analyseur lexB5.flex, gramB5.bison, prin.c reconnaissant une notion d'instruction simple SimpleInst.

Fichier exemple : Examples/B5.dat

Une instruction simple se termine par ';'. Une instruction simple pourra être:

B6 - Expressions logiques; conditionnelles/alternatives (1 point)

Mettre au point l'analyseur lexB6.flex, gramB6.bison, prin.c reconnaissant Fichier exemple : Examples/B6.dat

B7 - Blocs d'instructions (1 point)

Mettre au point l'analyseur lexB7.flex, gramB7.bison, prin.c reconnaissant la notion de InstBlock, formé d'une suite d'instructions SimpleInst ou IfInst, encadrées par '{' et '}'.

Fichier exemple: Examples/B7.dat. Ce fichier regroupe les blocs d'instructions des 2 fonctions du script exemple.

B8 - Paramètres formels et définitions de fonction (1 point)

Mettre au point l'analyseur lexB8.flex, gramB8.bison, prin.c reconnaissant

Fichier exemple : Examples/B8.dat

C - ANNEXE : APERCU SUR LA TRANFORMATION DE CODE (Bonus)

CI - CODE Java "fonctionnellement equivalent" (Bonus)

1.1) Des classes Java pour realiser la meme animation sont les suivantes :

     + la classe SimpleBallBouncer correspond d'assez pres au code ActionScript 
       . la fonction timeStep( ) realise les calculs pour la prochaine image
       . un objet SimpleBallBouncer possede un attribut instance de la classe Ball

     + AnimationComponent correspond plus ou moins a la classe Sprite
       - ressemblance : c'est un Container, pouvant contenir d'autres composants
       - differences  : c'est un thread ; elle ne contient pas les coordonnees

     + AnimationFrame, ApplicationFrame fournissent des fonctionnalites 
        correspondant a certaines fonctionnalites du player Flash

     + la classe UseSimpleBallBouncer sert au lancement

AnimJ2D

1.2) Utilisation

     + Preparation : javac UseSimpleBallBouncer.java

     + Lancement   : java UseSimpleBallBouncer
 

C II - TRANSFORMATIONS A EFFECTUER pour passer du code ActionScript au code Java (Bonus)

T1)  Extraire du package ActionScript la classe SimpleBallBouncer 
      (supposee unique)
  
T2)  Avant le code de cette classe, inserer les instructions import de Java

T3)  Faire que cette classe herite de AnimationComponent et non de Sprite
  
T4)  Ajouter a ses fonctions la fonction de trace graphique :
        public void paint(Graphics g)  { ball.paint(g); }

T5)  Transformer les declarations de variables numerique en la syntaxe Java : 
        private var ball:Ball;      --->      private Ball ball;
        private var vx:Number;      --->      private double  vx;

    (inutile de faire des regroupements de variables de meme type)

T6)  Dans chaque fonction ou Math.random() est utilise :
     - transformer chaque Math.random() en random.nextFloat()
     - inserer avant ces appels : Random random = new Random();

T7)  Fonction onEnterFrame() :
     - changer son en-tete en  "public void timeStep()"

T8)  References a "stage.stageWidth", "stage.stageHeight"
     - les remplacer par getWidth(), getHeight()


CSC 4508, TELECOM SudParis, INF, F. MEUNIER, F. SILBER-CHAUSSUMIER
Last modified: Tue Apr 13 11:58:18 CEST 2010