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

C++ Discussion :

Un parser entièrement à la main? Mais il est fou!


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut Un parser entièrement à la main? Mais il est fou!
    Bonjour

    J'utilise actuellement dans un de mes programmes un parser que j'ai écrit entièrement à la main (le langage est assez simple, a peu près équivalent au C).
    Pour l'instant j'ai l'ensemble du code sur environ 2000 lignes et je n'ai pas trop de problème.
    En fait je regrette de ne pas avoir utilisé dès le début une générateur de compilateur (je savais pas que ca existait en fait )
    Mon problème est que je découvre de temps en temps des petites erreurs (comptage de lignes par exemple, ou plus grave des fois).
    Selon vous, est-ce que ca vaut le coup de tout refaire?
    Si oui, avec quoi? (je connais (l'existence de) Lex et Yacc, enfin flex et bison je suis sous Windows)

    Merci de vos conseils

  2. #2
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Ca dépend, si ton code est stable c'est peut-être inutile de le refaire... bien que 2000 lignes de codes ça commence à faire quand même pour un parseur

    Donc y'a plusieurs choses :

    - La syntaxe de ton langage est elle simple ou c'est quand même pas mal compliqué ?
    - Est ce que tu penses que ton langage devra évoluer ? Si oui, est ce que ton code le permet facilement ?
    - Quand tu rencontre un bug, t'est il difficile de le localiser ? De le résoudre ?

    Tu tu trouves que ça n'est pas viable, il faudrait en effete reprendre le code...

    Lex/Yacc ou Flex/Bison, c'est pas mal... j'ai eu l'occasion de jouer un peu avec et j'ai pu faire des trucs assez sympas.

    Sinon, un peu plus clean et orienté C++ tu peux allé voir du coté de boost :
    http://www.boost.org/libs/spirit/index.html

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut
    Le langage est plus simple que le C, donc pas très compliqué.
    C'est un langage qui n'évolue pas et en général avec un débugger je trouve l'erreur aussitôt
    J'ai finalement décidé de garder le code actuel
    Il me reste encore a écrire le préprocesseur (le même que C)
    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    (le langage est assez simple, a peu près équivalent au C).
    Pourquoi ne pas prendre une grammaire EBNF pour du C et la modifier selon tes besoins ?

    Il me reste encore a écrire le préprocesseur (le même que C)
    Dans ce cas-là pourquoi ne pas réutiliser une implémentation du préprocesseur C ?

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    Si ton code fonctionne bien tu peux en effet le conserver mais Lex/Yacc sont vraiment 2 excellent outils. Viellots mais excellents.

    Le seul reproche que je leurs ferais est le non support du c++ en generation.
    Du coup tu ne vois pas ton parser comme une classe mais comme des fonctions.

    Ce n'est pas genant en soit pour l'integration, j'ai deja realisé des Machine Virtuelle et un langage de script avec le tout en c++ mais ca fait pas tres clean dans un programme bien structuré objet.

    Il existe cependant une version MKS de lex/Yacc avec "support" c++ mais presque 400€ la licence ca fait cher pour un particulier.

    Tu as une autre alternative Flexx++ et bison++

    Si le premier fonctionne pas trop mal, le second mais je n'ai pas trop chercher c'est vrai

    Autrement il y a Spirit de BOOST dont j'entend du bon comme du moins bon.
    Il faudras que j'essai un jour.

    Quel est l'objectif reel de ton projet car c'est un sujet qui m'interesse ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Par défaut
    Le langage que j'étudie est celui des fichiers ressource de Microsoft (extension .rc)
    J'ai regardé le source de MinGW (binutils plus exactement), mais c'est vraiment trop long pour moi, je vais garder mon code qui certes ne lit pas tous les fichiers (surtout s'ils sont tordus) mais qui suffit pour une utilisation normale

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Je ne connais pas le langage que tu tentes de parser, mais s'il est tiré du C il est fort possible qu'il soit plus facile de le parser correctement avec un parseur écrit à la main qu'avec un écrit avec lex et yacc. Je me souviens en particulier d'un point qui pose problème et pour lequel il faut faire des hacks si on utilise yacc, c'est la gestion des typedefs. (En C++ j'en vois d'autres, mais ils ne s'appliquent pas au C).

    Un avantage d'un parseur écrit à la main, c'est qu'il est normalement plus facile de lui faire générer de bons messages d'erreur et de continuer à parser.

    Ce n'est pas tout à fait sans raisons qu'ils ont réécrits les parseurs de gcc pour le C et pour le C++ à la main, alors qu'ils utilisaient bison auparavant. (Et B.S. a écrit quelque part qu'une des erreurs qu'il avait commise lors de l'écriture de CFront, c'était d'avoir écouté ceux qui lui conseillaient lex et yacc).

Discussions similaires

  1. [Débutant] mais où est cette main class ?
    Par anisse4 dans le forum Débuter avec Java
    Réponses: 26
    Dernier message: 07/12/2010, 15h59
  2. mais où est pg_hba.conf ??
    Par punky_brooster dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 10/01/2005, 23h08
  3. Mais quel est l'intérêt de XML ?
    Par darkbauer dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 01/06/2004, 18h03
  4. [VC++ .NET] mais où est passée SignedXML ???
    Par benoitB dans le forum MFC
    Réponses: 4
    Dernier message: 30/04/2004, 08h14
  5. Une table qui existe mais qui est inconnu! ?
    Par Nino dans le forum InterBase
    Réponses: 6
    Dernier message: 13/06/2003, 11h47

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