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

Générateurs de compilateur Discussion :

Reconnaissance de grammaires


Sujet :

Générateurs de compilateur

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut Reconnaissance de grammaires
    Bonjour à tous,
    Sur un projet de reconnaissance de grammaires (type 0, 1, 2, ou 3; lié à la compilation), je dispose de fichiers textes qu'il faut ouvrir puis analyser.
    Les fichiers sont de la forme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    S ::= a A | a B
     
    A ::= a C | a D  |  a E
     
    B ::= a D | a C | a E | a F
     
    C ::= c 
     
    D ::= d 
     
    E ::= e 
     
    F ::= a | a B
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    S ::= aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
     
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ::= b
    Mon problème n'est pas (pour l'instant) les algoritmes de reconnaissance de chaque grammaire, mais plutôt de savoir comment faire pour stocker chaque caractère à gauche des ::=, puis chaque combinaison de droite, séparées par les | pour pouvoir ensuite les réutiliser dans le programme.

    Si quelqu'un a ne serait-ce qu'un soupçon d'idée là-dessus, je suis preneur
    Merci beaucoup.

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Je suppose que lex et yacc (flex et bison) sont interdits ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Non, rien n'est interdit !
    Par contre c'est la 1ere fois que j'entends parler de Flex/Bison.
    Ce sont des librairies associées à C ?

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    euh...

    en C les fonctions strchr ou strstr

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Superne0 Voir le message
    Non, rien n'est interdit !
    Par contre c'est la 1ere fois que j'entends parler de Flex/Bison.
    Ce sont des librairies associées à C ?
    Flex et bison sont 2 utilitaires plutôt issus du monde Unix qui permettent de générer des analyseurs lexicographiques (reconnaissance de mot clés) et syntaxiques (combinaison des mots clés entre eux).

    A partir d'une spécification de grammaire qui ressemble étrangement à ce que tu as donné, ils génère du code C ou C++ qui sait analyser un flux et dire si ce flux est conforme à la grammaire donnée.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Bonsoir à tous.
    Bon évidemment, pas droit d'utiliser Flex/Bison au final ... donc avec les moyens du bord.
    Une question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ArrayList<String[][]> gramatica;
     
        private int paso = 0;
        ArrayList<String> contenido;
        ArrayList<String> contenidoConv;
    en Java est-il équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct gramatica{
    	int paso;
    	char* conten;
    	char* conten_conv;
    	struct gramatica *next;	
    };
    en C, ou bien plus simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char** gramatica;
    int paso = 0;
    char* contenido;
    char* contenidoConv;
    ?
    Merci

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    @Superne0: Sûrement pas le premier, qui correspondrait à une liste chaînée.

    Ça correspondrait plus à ceci:
    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
    struct StringArray
    {
    	char **pStrings;
    	size_t arrayLength;
    };
     
    struct StringArrayArray
    {
    	struct StringArray * pStringArrays;
    	size_t arrayLength;
    };
     
    struct ArrayList_StringArrayArray
    {
    	struct StringArray* pStringArrayArrays;
    	size_t listCapacity;
    	size_t listLength;
    };
     
    struct ArrayList_String
    {
    	char ** pStrings;
    	size_t listCapacity;
    	size_t listLength;
    };
     
    ...
    ArrayList_StringArrayArray gramatica;
    int paso = 0;
    ArrayList_String contenido;
    ArrayList_String contenidoConv;
    Ou, si tu préfères "plus simple":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char * ** * gramatica; /* oui, quatre astérisques (!!) */
    int paso = 0;
    char ** contenido;
    char ** contenidoConv;
    PS: Je suppose que tu n'as pas droit au C++ non plus?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Non, juste du C a éxécuté en ligne de commande.
    Pourquoi 4 astérisques ?
    Je dispose du code source en Java (en gros je dois faire de la traduction vers C :S), et à un moment donné j'éxécute , où line est un String [ ][ ] (en Java).
    Donc l'équivalent en C ne serait-il pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    &gramatica = &line, avec char** gramatica et char** line
    ?
    Pour ça je ne comprends pas pourquoi 4 astérisques à la déclaration de "gramatica"

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Quatre astérisques, parce que tu as une liste de tableaux de tableaux de chaînes de caractères.

    Autrement dit, une liste de tableaux de tableaux de tableaux de char.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Salut, quand je déclare dans le programme principal (main)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char** test
    call(test[0])
    avec la fonction call cela fonctionne parfaitement.
    Par contre, quand je mets dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char**** test
    call(test[0][0][0])
    avec la fonction call
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void call(char*** test)
    cela ne fonctionne pas.
    Voici l'unique erreur que me renvoit le terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    test.c: In function ‘main’:
    test.c:24: attention : passing argument 1 of ‘addLinea’ from incompatible pointer type

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    C'est parce qu'il faut juste passer test[0].
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    en passant test[0], j'obtiens le résultat suivant dans le terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    test.c: In function ‘main’:
    test.c:24: attention : passing argument 1 of ‘addLinea’ from incompatible pointer type
     
    et quand j'éxécute :
     
    r
    r
    r
    Erreur de segmentation

  13. #13
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Si ce n'est pas initialisé, c'est normal.

    C n'est pas java. Si tu veux avoir une chance de ne pas laisser ta santé mentale là-dedans, tu aurais plutôt intéret à y aller en C++...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Pas mal le coup de la santé mentale, mais c'est vrai que ça prend la tête !
    Sinon, voici le code test que j'essaye de faire fonctionner :
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    void call(char*** test){
    	int i,j,k;
    	for(i=0;i<=2;i++){
    		for(j=0;j<=2;j++){
    			for(k=0;k<=2;k++){
    				test[i][j][k] = 'r';
    				printf("%c\n",test[i][j][k]);
    			}
    		}
    	}
    }
     
     
    int main() {
    	int i,j,k;
    	char test[2][2][2][2];
    	//for(i=0;i<3;i++){	
    	//	for(j=0;j<3;j++){
    	//		for(k=0;k<3;k++){
    				call(test[0]);
    	//		}
    	//	}
    	//}
    	return(0);
    }

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Conseil: Utilise plutôt les structures que je t'aies montrées, ça sera plus facile à gérer et à relire.
    N'oublie pas que le C ne fait pas de gestion automatique de la mémoire, et ne mémorise pas lui-même la taille des tableaux alloués (du moins, pas de manière accessible)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Par défaut
    Projet terminé, merci beaucoup Médinoc

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

Discussions similaires

  1. Reconnaissance Vocal et Grammaire
    Par Legarsdelouest dans le forum VB.NET
    Réponses: 0
    Dernier message: 07/06/2010, 17h56
  2. Réponses: 2
    Dernier message: 26/01/2004, 20h11
  3. Réponses: 23
    Dernier message: 16/11/2002, 19h41
  4. [langage] Reconnaissance de mots
    Par Flo. dans le forum Langage
    Réponses: 2
    Dernier message: 10/08/2002, 23h34
  5. Réponses: 2
    Dernier message: 21/05/2002, 10h25

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