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 :

un probleme de backspace


Sujet :

Générateurs de compilateur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut un probleme de backspace
    J ai reçu un fichier texte hier que j ai ouvert dans un terminal.
    Le problème est que le fichier est a peut prés illisible puisqu'il est remplit de multiples '^H'.
    Il se trouve que j ai utilisé un petit scan généré par flex pour découvrir que ces '^H' sont en fait des caractères backspace (code ascii 8) et effectivement si je fait l effort de les interpréter moi même le fichier commence a être a peut prés lisible, seulement il fait quelques centaines de pages. Du coup j aimerai que mon pc fasse l effort pour moi.

    J ai donc utilisé un scan flex construit a partir de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %%
    \x08 {printf("");}
    c est mieux mais pas top.

    J ai donc fait un test et ai compilé un petit programme en c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <stdio.h>
     
    int main()
    {printf ("%c",'3') ; printf("%c",'4') ; printf("%c",8);}
    Quand je compile et exécute ce dernier programme j obtient bien ce que j espere, c est a dire
    plus mon invite collée évidemment puisque j ai pas mis de retour chariot...

    j ai donc decide de reprendre le scanner précédent en le modifiant un peu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    %%
    \x08 {printf("%c",8);}
    Résultat quand je passe mon fichier texte a la moulinette de ce scanner ben j obtient le même fichier que l original... sauf si je l affiche directement sur stdout.

    Conclusion, (désolé je pense tout haut...), stdout 'interprète' le caractère backspace.

    J aimerais donc faire un scanner qui interprète ce caractère, malheureusement j ai l impression de partir vers un truc bien compliqué et tous les essais que j ai fait jusqu’à présent se soldent par un échec.
    Je mets ici le dernier en date, ne soyez pas trop méchants
    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
     
    %{
    char textbuff[11]="0123456789\0";
    int myindex = 0 ; 
    int mustAppend = 0;
     
    void decIndex() { if (myindex >0) { myindex-- ; mustAppend = 0;} }
     
    void incIndex() { myindex++; if (myindex== 10) { mustAppend = 1 ; myindex = 0 ;} }
     
    void putBuff( const char c) { if (mustAppend == 1 ) { printf("%s",textbuff); mustAppend = 0; putBuff(c);} 
                                            else {textbuff[myindex] = c ; incIndex();}}
     
    void flushBuff() { textbuff[myindex+1]='\0'; printf("%s",textbuff);}
    %}
    %%
    \x08 { decIndex() ;}
     
    .      { putBuff(*yytext) ;}
     
    <<EOF>> {flushBuff();}
    Dans ma tête ce scan devrait pouvoir gerer ce qui se passe pour au maximum dix backspaces successifs, dans les faits, il marche presque, je dis bien presque :

    1) il y a un problème manifeste avec les retours chariots.

    2) quand je passe mon fichier texte par la moulinette de ce scan... l analyse ne se termine pas, me produit un fichier astronomiquement grand, contenant en son debut l approximation de ce que devrait etre mon fichier final modulo la remarque précédente.

    Du coup j ai plusieurs questions :
    - J ai l impression qu il n est pas possible de gérer un nombre indéterminé de backspaces successifs en une seul passe, ai-je tord ?
    - Y a t il une méthode (une option a passer a vim par exemple...) pour le forcer a interpréter ces satanés backspaces ? (je sens que je vais pleurer mais j voulais quand même essayer avec flex...)
    - Est ce que ma méthode vous parait censée ?
    - Est ce que vous voyez ce qui cloche dans la définition de mon scanner pour éviter les deux problèmes ?

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Voilà une solution en shell:

    et avec (f)lex:


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 142
    Par défaut
    Merci, meme si je suis trèèèès déçu

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

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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