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

Langage Delphi Discussion :

Création d'un analyseur syntaxique


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Par défaut Création d'un analyseur syntaxique
    Bonjour,

    Je dois créer le programme suivant :

    J'ai un fichier texte avec des enregistrement.
    Je dois rejeter chaque ligne qui comporte au moins un caractère non latin.
    Les fichiers peuvent contenir des centaine de milliers de lignes.

    Existe-t-il un composant qui aiderait à exécuter cette analyse syntaxique des caractères? Un outil rapide. Ou suis-je obligé de prendre caractère par caractère et de le comparer avec tous les caractères latins pour tester s'il est valide ou non?

    Merci!

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Salut,

    ... Je dois rejeter chaque ligne qui comporte au moins un caractère non latin.
    1) créer par exemple un Type ChrNonLatin : array[1..N] of Char,
    2) scruter chaque ligne à partir de son début avec une boucle à interrompre au premier if MaLigne[i]=ChrNonLatin[j] then Rejet de la ligne et passage à la ligne suivante.

    Les fichiers peuvent contenir des centaine de milliers de lignes.
    ... Peu importe : Si t'as une mem-vive-disponible suffisante tu peux charger le tout dans un TMemoryStream (rapidité maxi) ... sinon tu peux utiliser un TFileStream ou bien parcourir le fichier laissé sur disque ligne par ligne avec Readln().

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    815
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 815
    Par défaut
    salut

    Juste une idée.. j'ai pas de reponse pour les composant faisant cela.

    Si Ton texte est formaté et pas brut, tu peux peut être faire une recherche du nom de la police (avec les balises) dans la ligne courante et la comparer a une liste de police mais cela demande d'identifier tous les noms de polices latines ??.

    La méthode de lecture de contrôle de caractères semble plus sure, mais peut être pas assez rapide.
    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
     
    function CtrlChaineLatine(Lg:string):boolean;
    const ChaineLatine='abcdefghijklmnopqrstv123456789....'; // chaine de caracteres valide.
    var i:integer;
    begin
        result:=true;
        for i:=1 to length(Lg)do
        begin
            if pos(lg[i],ChaineLatine)=0 then
            begin
              result:=false;
              exit;
            end;
        end;
    end;
    tu peux aussi mixer les deux pour gagner du temps, quand dans une ligne tu tombe sur une police qui t'es inconnu, alors tu contrôle les caractères..

  4. #4
    Membre Expert

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Par défaut
    Quoi que tu fasses, il faudra bien lire chaque caractère au moins une fois pour savoir s'il appartient au jeu de caractère que tu veux.

    Personnellement, je ferais le teste avec un tableau lookup qui indique si un caractère est correct ou non :

    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
     
    const
      CharIsOk : array[char] of boolean = (false, false, ....., true, ...... ); // A définir en fonction des caractères valides.
     
    function CtrlChaine(const s : string) : boolean;
    var p : pChar;
    begin
      if s = ''
      then result := true
      else begin
        result := true;
        p := @s[1];
        while (p^<>#0) and result do
        begin
          result := result and CharIsOk[p^];
          inc(p);
        end;
      end;
    end;
    Maintenant libre à toi de voir comment gerer la lecture des chaines à tester.

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Par défaut
    Merci pour vos réponses,

    Franck, je ne comprends pas trop comment utiliser et définir la constante CharIsOk?
    A supposer que l'alphabet latin ne soit composé que de cinq caractères : a b c d e, comment remplirais-tu le tableau?
    Et si la ligne étudiée est celle ci : abc]ac, peux tu me montrer grossièrement comment réagit ton algorythme?

    Merci!

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Re-Salut,

    je ne comprends pas trop comment utiliser et définir la constante CharIsOk?
    A supposer que l'alphabet latin ne soit composé que de cinq caractères : a b c d e, comment remplirais-tu le tableau?
    const CharIsOk : array[char] of boolean = (false, false, ....., true, ...... );

    array[char] comprend les '0..255' caractères de la table Ascii
    donc dans ton exemple des cinq caractères a b c d e, le 'a' occupe la 97ième position et les quatre autres suivent.
    Donc tu mets au début 96 fois false au début et ensuite 5 fois true (pour a b c d e) et ensuite toute une série de false couvrant la plage 102..255 c'est à dire du 'f' jusqu'à la fin.

    Les 96 false du début correspondent aux caractères qui précèdent le 'a'

    Oups, faut remplacer le 32ième false du début par true : il correspond au caractère ' ' espace.

    Le mieux serait que tu prennes une table Ascii pour choisir les caractères à fixer à true car tes lignes de texte peuvent comporter des caractères de ponctuation (,;! des majuscules etc : à toi de choisir.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Par défaut
    ok, merci pour cet éclaircissement!!

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

Discussions similaires

  1. Analyseur syntaxique descendant
    Par jalam dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 02/01/2007, 08h15
  2. Analyseur Syntaxique Expression Booléenne
    Par Invité dans le forum Langage
    Réponses: 8
    Dernier message: 01/10/2006, 10h57
  3. Analyseur syntaxique HTML
    Par roudoudouduo dans le forum Outils
    Réponses: 5
    Dernier message: 03/07/2006, 16h52
  4. analyseur syntaxique
    Par tomy29 dans le forum Langage
    Réponses: 11
    Dernier message: 11/01/2006, 12h45
  5. [Conception] Analyseur Syntaxique
    Par guu dans le forum Général Java
    Réponses: 7
    Dernier message: 03/01/2006, 12h28

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