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 :

analyseur syntaxique


Sujet :

Langage Delphi

  1. #1
    Membre habitué

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Points : 167
    Points
    167
    Par défaut analyseur syntaxique
    Bonjour

    j'ai un fichier HTML de la forme suivante (dsl je le mets avec les balises html) :

    <p align=center style='text-align:center'><b><span style='font-size:7.5pt;
    color:#336699'>Article L1110-1</span></b></p>

    <p class=MsoNormal align=center style='text-align:center'><i>(inséré par Loi nº
    2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)</i></p>

    <p class=MsoNormal style='margin-bottom:12.0pt'><br>
    &nbsp;&nbsp;&nbsp;Le droit fondamental à la protection de la santé doit être
    mis en oeuvre par tous moyens disponibles au bénéfice de toute personne. Les
    professionnels, les établissements et réseaux de santé, les organismes
    d'assurance maladie ou tous autres organismes participant à la prévention et
    aux soins, et les autorités sanitaires contribuent, avec les usagers, à
    développer la prévention, garantir l'égal accès de chaque personne aux soins
    nécessités par son état de santé et assurer la continuité des soins et la
    meilleure sécurité sanitaire possible.<br style='mso-special-character:line-break'>
    <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
    <![endif]></p>

    <p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>

    <p align=center style='text-align:center'><b><span style='font-size:7.5pt;
    color:#336699'>Article L1110-2</span></b></p>

    <p class=MsoNormal align=center style='text-align:center'><i>(inséré par Loi nº
    2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)</i></p>

    <p class=MsoNormal style='margin-bottom:12.0pt'><br>
    &nbsp;&nbsp;&nbsp;La personne malade a droit au respect de sa dignité.<br
    style='mso-special-character:line-break'>
    <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
    <![endif]></p>

    <p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>

    <p align=center style='text-align:center'><b><span style='font-size:7.5pt;
    color:#336699'>Article L1110-3</span></b></p>

    <p class=MsoNormal align=center style='text-align:center'><i>(inséré par Loi nº
    2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)</i></p>

    <p class=MsoNormal style='margin-bottom:12.0pt'><br>
    &nbsp;&nbsp;&nbsp;Aucune personne ne peut faire l'objet de discriminations dans
    l'accès à la prévention ou aux soins.Reference a Article L1110-2<br style='mso-special-character:line-break'>
    <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'>
    <![endif]></p>
    et je veux le découper en autant de fichiers TEXTE que d'articles (ici 3 fichiers), contenant chacun le corps de l'article.

    Delphi est il performant (en tenant compte des balises par exemple) pour effectuer ce genre de traitement (certains langages le sont)? Si oui, y a t il des algos disponibles quelque part?


    Merci pour vos réponses.
    Bonne journée.
    thomas.

    Annexe : le fichier html sans les balises:
    Article L1110-1

    (inséré par Loi nº 2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)

    Le droit fondamental à la protection de la santé doit être mis en oeuvre par tous moyens disponibles au bénéfice de toute personne. Les professionnels, les établissements et réseaux de santé, les organismes d'assurance maladie ou tous autres organismes participant à la prévention et aux soins, et les autorités sanitaires contribuent, avec les usagers, à développer la prévention, garantir l'égal accès de chaque personne aux soins nécessités par son état de santé et assurer la continuité des soins et la meilleure sécurité sanitaire possible.

    Article L1110-2

    (inséré par Loi nº 2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)

    La personne malade a droit au respect de sa dignité.

    Article L1110-3

    (inséré par Loi nº 2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)

    Aucune personne ne peut faire l'objet de discriminations dans l'accès à la prévention ou aux soins.Reference a Article L1110-2

  2. #2
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    La question est plutôt existe-t-il un parser déjà écris.

    Perl serait mieux indiqué pour ce traitement pour le peu que j'en connais.

    Rien ne t'empêche bien sur d'écrire un bout de parser simple en Delphi, mais il y a des langages qui possèdent déjà ce genre de parsers.

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Il me semble qu'il existe déjà des compos Delphi qui affihent du HTML... Peut-être qu'une fois affichés, tu pourras récupérer le texte...
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Membre habitué

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Points : 167
    Points
    167
    Par défaut
    Un parser en delphi me serait d'une tres grande utilité!!

    je sais que le perl est sympa pour ça. mais je n'y connais rien en perl.

    Delphi a peut etre son propre parser.... on peut rever.

  5. #5
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    En réalité, tu n'as même pas besoin d'un parser.

    Il suffit d'éliminé les balises HTML (p, pre ...), de remplacer les accents et les balises <br>.

    Je n'ai pas le code tout près, mais avec ces indications, tu devrais y arriver si tu connais Delphi.

  6. #6
    Membre habitué

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Points : 167
    Points
    167
    Par défaut
    oui, mais je dois quand meme decouper le fichier en autant d'article qu'il contient et mettre chaque article dans un fichier texte.

  7. #7
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Ca reste à amélioré, mais voici déjà un bon début:

    Important: Je n'ai pas fini pour les caractères spéciaux comme '&nbsp;'. Mais, ça élimine les balises.

    Autre soucis à régler: Les balises non fermantes comme la première ligne de ton exemple.
    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
     
    procedure TrimHTML(Var Str: String);
     
    procedure TrimBracket(const Open,Close:String);
    Var
       Op,Cl,P:Integer;
       Temp,B : String;
    Begin
         Repeat
         //Chercher chaque balise.
         Op := Pos(Open,Str);
         Cl := Pos(Close,Str);
     
         If (Op = 0) And (Cl = 0) Then // Aucune balise, pas de modification.
            Exit;
         If Op > Cl Then // Cas d'une balise sur plusieurs lignes.
            P := Cl
         Else
             P := Op;
         Temp := Copy(Str,1,P-1); // Conserver le contenu avant la balise.
         P := Pos('>',Str); // Fermeture balise.
         If P <> 0 Then
            Str := Temp + Copy(Str,P+1,Length(Str)); // Eliminer la balise.
         Until P = 0 ; // Tant qu'il y a des balises ouvertes.
    End;
    Begin
    TrimBracket('<','>');
    TrimBracket('&',';');
    End;
     
     
    //Exemple d'utilisation: UN TMemo, un bouton. Tu mets ton texte dans le TMemo
    procedure TForm1.Button1Click(Sender: TObject);
    Var
       I:Integer;
       Temp:String;
    begin
     with Memo2 do
     begin
     For I:= 0 To Lines.Count - 1 Do
         Begin
         Temp := Lines[I];
         TrimHTML(Temp);
         Lines[I] := Temp;
         End;
     end;
    end;

  8. #8
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Voilà, pour t'aider et commencer je viens de réaliser une petite fonction à la sauvette.

    L'idée, c'est de recopier caractères par caractères le texte du fichier html d'origine que si une variable (que j'appelle ici copie_texte) est égale à true. Dans le cas ou copie_texte est true, on recopie le caractère dans un variable Ligne

    - quand une balise est ouverte avec < on met copie_texte à false
    - quand la balise se referme avec > on met copie_texte à true

    comme ça on ne recopie que le texte brut sans se faire c... avec les balises.
    Cependant, une seule balise est imporatnte, c'est <br>. c'est pour ça que j'en profite à chaque fois pour récuperer le contenu de la balise dans une variable balise.

    Quand on trouve > et que le contenu de balise est égal à <br> , hop, on enregistre le résultat de ligne dans un stringlist avec add(ligne) (qui passe à la ligne) et on commence une nouvelle ligne.

    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
    procedure HTMLToTexte(ASource:TStrings;var ADest:TStringList);
    var copie_texte:Boolean;
        i,longueur:Integer;
        s,ligne,balise:string;
        AChar:Char;
    begin
      ADest.Clear;
     
      s:=ASource.Text;
      longueur:=Length(s);
      if longueur=0 then Exit;
      copie_texte:=true;
      balise:='';
      ligne:='';
      for i:=1 to longueur do
      begin
        AChar:=s[i];
        if AChar='<' then begin
                            copie_texte:=False;
                            balise:='';
                          end;
     
        if copie_texte
        then ligne:=ligne+AChar
        else balise:=balise+AChar;
     
        if AChar='>' then
        begin
          copie_texte:=True;
          if  UpperCase(balise)='<BR>'
          then begin
                 ADest.Add(ligne);
                 ligne:='';
               end;
        end;
      end;
     
      if  (balise)<>'<BR>'
      then begin
             ADest.Add(ligne);
             ligne:='';
           end;
    end;
    La fonction s'utilise comme celà, par exemple :
    - Dans ma fiche, il y a 2 memos et un bouton.
    -Dans memo1, j'ai chargé le texte html
    - Dans memo2, je recupère le texte sans les balises.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.btn1Click(Sender: TObject);
    var ASL:TStringList;
    begin
      memo2.Clear;
      ASL:=TStringList.Create;
      HTMLToTexte(memo1.Lines,ASL);
      memo2.Lines.AddStrings(ASL);
      ASL.Free;
    end;
    Effectivement, après il reste à traiter les caractères speciaux comme &nbsp;, mais la fionction delphi StringReplace devrait t'y aider.

    Enfin, après il va effectivement falloir que tu redécoupe tout ça pour enregistrer plusieur fichiers, mais là, je n'ai point trop le temps.

    Bon dev
    Bidouilleuse Delphi

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Caine
    Ca reste à amélioré, mais voici déjà un bon début:

    Important: Je n'ai pas fini pour les caractères spéciaux comme '&nbsp;'. Mais, ça élimine les balises.

    etc;, etc...
    J'était en train de rédiger quand tu as posté, d'où ma proposition somme toute similaire
    Bidouilleuse Delphi

  10. #10
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Chouette ta version

    Je vais comparer les deux. La tienne est plus simple j'ai l'impression

    C'est un forum, donc par nature, il arrive souvent que les gens postent des codes similaires

    [edit]
    Je rectifie, la tienne est bien mieux. J'ai (par flemme?) trop tendance à me baser sur Pos

  11. #11
    Membre habitué

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

    Informations forums :
    Inscription : Juillet 2004
    Messages : 639
    Points : 167
    Points
    167
    Par défaut
    Merci pour vos réponses, c'est vraiment sympa!

    En fait j'avais mis le texte en version html avec balise car sans les balises html (texte pure donc) il va etre tres dur de découper les articles un par un. Je ne vois pas comment on pourrait repérer un separateur entre chaque article : le retour chariot ne marche pas il peut y en avoir au sein d'un meme article; le mot Article ne marche pas car on peut retrouver ce mot dans un texte d'article, etc...
    les balises etaient donc plus simple pour délimiter chaque article.

    Au final ce que je voudrais c'est :
    On part d'un fichier source contenant le texte :
    "Article 1 : <texte de l'article>
    Article 2 : <texte de l'article>
    Article 3 : <texte de l'article>"
    Apres traitement on a trois fichiers:
    Article1.txt contenant son texte
    Article2.txt contenant son texte
    Article3.txt contenant son texte
    Si ca interesse certains d'entre vous, j'ai la version PHP de cet algorithme. (imparfait car il ne gere pas les articles de meme nom), mais le découpage est bien fait.

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Si, si le séparateur, c'est quand une ligne commence par le mot "Article", de là, en partant de ce fichier texte :


    Article L1110-1

    (inséré par Loi nº 2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)

    Le droit fondamental à la protection de la santé doit être mis en oeuvre par tous moyens disponibles au bénéfice de toute personne. Les professionnels, les établissements et réseaux de santé, les organismes d'assurance maladie ou tous autres organismes participant à la prévention et aux soins, et les autorités sanitaires contribuent, avec les usagers, à développer la prévention, garantir l'égal accès de chaque personne aux soins nécessités par son état de santé et assurer la continuité des soins et la meilleure sécurité sanitaire possible.

    Article L1110-2

    (inséré par Loi nº 2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)

    La personne malade a droit au respect de sa dignité.

    Article L1110-3

    (inséré par Loi nº 2002-303 du 4 mars 2002 art. 3 Journal Officiel du 5 mars 2002)

    Aucune personne ne peut faire l'objet de discriminations dans l'accès à la prévention ou aux soins.Reference a Article L1110-2
    voici le code :
    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
    procedure TForm1.btn1Click(Sender: TObject);
    var ASLSource,ASLDest:TStringList;
        NomArticle,UneLigne,DebutLigne:string;
        i:Integer;
     
    begin
      ASLSource:=TStringList.Create;
      ASLDest:=TStringList.Create;
     
      //Chargement de l'article
      ASLSource.LoadFromFile('Articles.txt');
     
      NomArticle:='';
     
      //Début de traitement (initialisation)
      ASLDest.Clear;
     
      for i:=0 to ASLSource.Count-1 do
      begin
        UneLigne:=ASLSource.Strings[i];
        if Length(Trim(UneLigne))>Length('Article L')
        then begin
              DebutLigne:=Trim(UneLigne);
              DebutLigne:=Copy(DebutLigne,1,7);
              if DebutLigne='Article'
              then begin
                     if NomArticle<>''
                     then begin
                            ASLDest.SaveToFile(ExtractFilePath(Application.ExeName)+NomArticle+'.txt');
                            ASLDest.Clear;
                          end;
                     NomArticle:=Trim(UneLigne);
                   end;
           end;
        ASLDest.Add(UneLigne);
      end;
      //dernier article
      if NomArticle<>'' then ASLDest.SaveToFile(ExtractFilePath(Application.ExeName)+NomArticle+'.txt');
     
      ASLDest.Free;
      ASLSource.Free;
    end;
    Voilà, voilà
    Bidouilleuse Delphi

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

Discussions similaires

  1. Analyseur syntaxique de formule
    Par FANDOR dans le forum Langage
    Réponses: 9
    Dernier message: 11/03/2008, 21h07
  2. Analyseur syntaxique descendant
    Par jalam dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 02/01/2007, 08h15
  3. Analyseur Syntaxique Expression Booléenne
    Par Invité dans le forum Langage
    Réponses: 8
    Dernier message: 01/10/2006, 10h57
  4. Analyseur syntaxique HTML
    Par roudoudouduo dans le forum Outils
    Réponses: 5
    Dernier message: 03/07/2006, 16h52
  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