IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Javacc et calcul du nombre d'appel d'unefonction ( )


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Points : 18
    Points
    18
    Par défaut Javacc et calcul du nombre d'appel d'unefonction ( )
    Bonjour,
    j'ai généré un parseur par l'outil JavaCC.

    par la suite, je souhaite calculer le nombre d'appel d'une fonction dans le fichier d'entrée de DATA ( input file stream ).

    MyProgram est défini par JavaCC rules suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    TOKEN : { <id : ["a"-"z","A"-"Z","_"] (["a"-"z","A"-"Z","0"-"9","_"])* >}
     
    MyProgram ():{}
    {
     
    (MyMethod ())*
     
    }
     
      MyMethod () {}
    {
    <method> <id> "(" (Argument ()) * ")" {}
    (Statement ()) *
    return String
    <end_method>
    }
     
    Argument void () {}
    {
    <STRING> <id>
    <STRING> <id>
    }
     
    void statement () {}
    {
     
     
    // here  Call_MyMethod () is used for calling the method defined by  the<id> and its parameters       
    Call_MyMethod ()   
     
    statementType2 ()
    ...........
    }
     
    // Javacc rules of Call_MyMethod ()
     
     
     
    Call_MyMethod void ()  {}
    {
    <id> "(" (
          ExpressionTreeStructure ()
          (
            "," ExpressionTreeStructure ()
          ) *
        ) *
    ")"
    }
     
    ExpressionTreeStructure void () {}
     
    {
    ......
    }


    input file stream is :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <method>   id1  ( String sid11, String sid12)
    statement11
    statement12
    return String1
    <end_method>
     
     
    <method>   id2  ( String sid21, String sid22)
    statement21
    id1(sid1,sid2)  // call of Method the name id1 with argument  sid11 and  sid12
    return String2
    <end_method>
     
     
    <method>   id3  ( String sid31, String sid32)
    id1(sid1,sid2)  // call of Method the name id1 with argument  sid11 and  sid12
    statement32
    return String3
    <end_method>
     
     
    <method>   id4  ( String sid41, String sid42)
    id1(sid1,sid2)  // call of Method the name id1 with argument  sid11 and  sid12
    statement42
    return String4
    <end_method>


    ma question est comment compter le nombre d'appel de la méthode <method> défini par id2 qui est appelé par d'autres méthodes.
    dans le cas de fichier d’entrée ( input file stream ) mentionnée ci-dessus :
    3 est le nombre d'appel de la méthode défini par identifiant id1.


    Merci d'avance de votre aide.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2007
    Messages
    697
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 697
    Points : 1 241
    Points
    1 241
    Par défaut
    Bonjour,

    tout d'abord, je tiens à préciser que je n'ai jamais travaillé avec javaCC (mais vu le MP que j'ai reçu et le peu de réponse à ce type de question en général, je pense que ma réponse sera appréciée) donc ma réponse contiendra peut-être des imprécisions mais l'idée générale est là.
    De ce que j'ai vu JavaCC fonctionne de manière assez similaire à ANTLR.

    Avec JavaCC, chaque règle est compilée en méthode Java qui en soit n'ont pas d'état entre chaque appel. L'état (l'accumulateur du nombre d'appel de la fonction) doit donc être stocké à un niveau plus global. En java c'est au niveau d'un Objet. J'ai l'impression que tu n'as pas mis tout le code mais normalement tu dois avoir quelque chose qui ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    PARSER_BEGIN(MyProgramClass)
    public class MyProgramClass{
        public static void main(String [] args){
              MyProgramClass parser = new MyProgramClass(System.in);
              paser.MyProgram();
       }
    }
    PARSER_END(MyProgramClass)
    Je te propose donc de la transformer pour obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PARSER_BEGIN(MyProgramClass)
    public class MyProgramClass{
         private Map<String, Integer> functionCallCount = new HashMap<String, Integer>(); 
        public static void main(String [] args){
              MyProgramClass parser = new MyProgramClass(System.in);
              paser.MyProgram();
              for(Entry<String, HashMap> entry : functionCallCount.entrySet()) {
                   System.out.println("function " + entry.getKey() + " is called " +  entry.getValue() + " time(s).");
               }
       }
    }
    PARSER_END(MyProgramClass)
    Ensuite il faut remplir ta Map. Pour ça javaCC te permet d'insérer du code Java au sein du code du parser en ajoutant des section {//ton code java ici}.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Call_MyMethod void ()  {}
    {
    (n=<id> { int count = 0; 
              if(functionCallCount.containsKey(n)) count = functionCallCount.get(n);
              functionCallCount.put(n, count + 1);
            }
    )
     "(" (
          ExpressionTreeStructure ()
          (
            "," ExpressionTreeStructure ()
          ) *
        ) *
    ")"
    }
    Autre chose j'ai pas touché à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Call_MyMethod void ()  {}{...}
    mais tu es sur que ce n'est pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Call_MyMethod  ()  {}{...}
    Quand on demande de l'aide on s'assure de poster du code compilable, là je suis pas vraiment certain que ce soit le cas (je n'ai rien vu te tel dans la doc de java CC).
    Sinon juste pour information le premier bloc {} sert à définir des variables locales à une règle/méthode, ça peut servir si tu veux connaître par exemple le nombre d'instructions au sein d'une méthode par exemple.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2013
    Messages : 22
    Points : 18
    Points
    18
    Par défaut
    Bonjour,
    le problème est résolu.
    merci de votre intervention efficace.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul soustraction nombre de 18chiffres
    Par peppena dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 05/08/2005, 14h46
  2. Calculer le nombre de ligne de code source
    Par yanis97 dans le forum Qualimétrie
    Réponses: 4
    Dernier message: 04/07/2005, 23h02
  3. [Debutant(e)]Calcul du nombre de ligne sous eclipse
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 10/12/2004, 09h53
  4. calcule du nombre de jours entre 2 dates
    Par nazimb dans le forum ASP
    Réponses: 4
    Dernier message: 28/09/2004, 16h22
  5. Comparaison de base et calculs du nombre d'éléments dans Bas
    Par BXDSPORT dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/07/2004, 09h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo