FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Form(résolu)
est-ce un bug sur IF et END_IF? - Page 3 Emptypar leclode Hier à 17:59

» trop de fichiers en cours
est-ce un bug sur IF et END_IF? - Page 3 Emptypar Marc Hier à 11:42

» Bataille navale SM
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jjn4 Ven 26 Avr 2024 - 17:39

» Une calculatrice en une ligne de programme
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jean_debord Ven 26 Avr 2024 - 8:01

» Gestion d'un système client-serveur.
est-ce un bug sur IF et END_IF? - Page 3 Emptypar Pedro Jeu 25 Avr 2024 - 19:31

» Les maths du crocodile
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jean_debord Jeu 25 Avr 2024 - 10:37

» Naissance de Crocodile Basic
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jean_debord Jeu 25 Avr 2024 - 8:45

» Editeur EliP 6 : Le Tiny éditeur avec 25 onglets de travail
est-ce un bug sur IF et END_IF? - Page 3 Emptypar Froggy One Mer 24 Avr 2024 - 18:38

» Dessine-moi une galaxie
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jjn4 Lun 22 Avr 2024 - 13:47

» Erreur END_SUB
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jjn4 Lun 22 Avr 2024 - 13:43

» Bug sur DIM_LOCAL ?
est-ce un bug sur IF et END_IF? - Page 3 Emptypar papydall Dim 21 Avr 2024 - 23:30

» 2D_fill_color(résolu)
est-ce un bug sur IF et END_IF? - Page 3 Emptypar leclode Sam 20 Avr 2024 - 8:32

» Consommation gaz électricité
est-ce un bug sur IF et END_IF? - Page 3 Emptypar leclode Mer 17 Avr 2024 - 11:07

» on_key_down (résolu)
est-ce un bug sur IF et END_IF? - Page 3 Emptypar leclode Mar 16 Avr 2024 - 11:01

» Sous-programme(résolu)
est-ce un bug sur IF et END_IF? - Page 3 Emptypar jjn4 Jeu 4 Avr 2024 - 14:42

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Avril 2024
LunMarMerJeuVenSamDim
1234567
891011121314
15161718192021
22232425262728
2930     
CalendrierCalendrier
Le Deal du moment :
Pokémon EV06 : où acheter le Bundle Lot ...
Voir le deal

 

 est-ce un bug sur IF et END_IF?

Aller en bas 
5 participants
Aller à la page : Précédent  1, 2, 3
AuteurMessage
Nardo26

Nardo26


Nombre de messages : 2294
Age : 55
Localisation : Valence
Date d'inscription : 02/07/2010

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 0:52

Excuse moi pour cette réponse tardive : j'ai des absences parfois sur le forum, car je me bat actuellement avec des balises html qui ne veulent pas faire ce qu'elles sont censées faire !

Quand à la doc, c'est ce que j'ai vérifié après coup... Embarassed
Je me suis dis que Jack avait peut-être déjà écrit cette règle quelque part... et qu'on défonçait des portes ouvertes...
Ouf ! ce n'est pas le cas !... (on aurait l'air malin ! Wink )
Revenir en haut Aller en bas
http://nardo26.lescigales.org
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 1:55

Attention ! je suis tombé sur un bug problable lié à l'analyse syntaxique des if...end_if. Voir mon post ici:
https://panoramic.1fr1.net/un-bug-dans-panoramic-f3/un-bug-dans-l-analyse-syntaxique-sur-ifend_if-t1219.htm#10215
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 14:04

Une structure curieuse également:
Code:
DIM a$, b$
a$="2": b$ = "5"
IF a$ = "1": b$ = "33" ELSE b$ = "44": END_IF
PRINT "a$="+a$+" b$="+b$
ça ne génère pas d'erreur, mais b$ reste inchangé.
Par contre, si la condition est vraie (a$ = "1") là ça part en erreur: structure string incorrecte (si la condition n'est pas vraie, la ligne n'est pas exécutée, elle est ignorée).
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 19:13

C'est plus complexe que ça. ELSE doit être seul sur la ligne pour être reconnu correctement. En fait, dans ton exemple, si la condition est fausse, il ignure complètement le reste de la ligne. Mais fais ceci:
Code:
DIM a$, b$
a$="2": b$ = "5"
IF a$ = "1": b$ = "33"
ELSE
b$ = "44": END_IF
PRINT "a$="+a$+" b$="+b$
toujours avec la condition fausse, alors il exécute le ELSE ! Résultat différent !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 19:24

Et ma petite contribution pour l'analyse des structures IF...ELSE...END_IF, WHILE...END_WHILE, REPEAT...UNTIL, FOR...NEXT. Sans prétention, sans analyse des labels ni variables, mais test complet de la structure logique, avec affichage du numéro de ligne générant une erreur de end_if en trop, par exemple (ce qui manque en Panoramic).

J'applique les principes de Nardo26 (que je salue au passage). Le programme produit un source "aplani" avec le numéro de ligne d'origine et le texte d'origine de la ligne en commentaire, et une ligne par commande, ainsi qu'un source "replié" avec les mêmes lignes qu'à l'origine, mais contenant une indentation correcte. Une variable permet de régler la taille de l'indentation. Des boutons permettent d'afficher l'une ou l'autre version, et un bouton permet de sauvegarder la version affichée. le deux versions générés sont exécutables par l'éditeur Panoramic sans modification, ce qui est intéressant pour débugger (dans la version "aplanie", Panoramic pourra donner un numéro de ligne précis pour chaque commande).

Pour les amateurs: j'ai appliqué la méthode des "objets nommés" pour la première fois dans un de mes programmes - c'est vrai que c'est génial.

Voici le code:
Code:

label aplanir_source, afficher_aplani, afficher_replie, indenter, replier

dim source_file$, resultat_file$, string_indentation$, contenu$
dim numero_objets%, flag_string%, taille_indentation%, niveau_indentation%
dim s$, s1$, chr34$, alors$, lig%
dim i%, j%

numero_objets% = 0

' configuration de l'écran
full_space 0

' création du dialogue d'ouverture
dim open_dialog% : numero_objets% = numero_objets% + 1
open_dialog% = numero_objets% : open_dialog open_dialog%

' création du dialogue de sauvegarde
dim save_dialog% : numero_objets% = numero_objets% + 1
save_dialog% = numero_objets% : save_dialog save_dialog%

' création du bouton d'ouverture
dim button_open% : numero_objets% = numero_objets% + 1
button_open% = numero_objets% : button button_open%
label click_open : on_click button_open%, click_open
top button_open%,10 : left button_open%,10 : caption button_open%,"Ouvrir"

' création du bouton de lancement
dim button_start% : numero_objets% = numero_objets% + 1
button_start% = numero_objets% : button button_start% : hide button_start%
label click_start : on_click button_start%, click_start
top button_start%,10 : left button_start%,100 : caption button_start%,"Démarrer"

' création du bouton de résultat aplani
dim button_aplani% : numero_objets% = numero_objets% + 1
button_aplani% = numero_objets% : button button_aplani% : hide button_aplani%
label click_aplani : on_click button_aplani%, click_aplani
top button_aplani%,10 : left button_aplani%,200 : caption button_aplani%,"Aplani"

' création du bouton de résultat replié
dim button_replie% : numero_objets% = numero_objets% + 1
button_replie% = numero_objets% : button button_replie% : hide button_replie%
label click_replie : on_click button_replie%, click_replie
top button_replie%,10 : left button_replie%,300 : caption button_replie%,"Replié"

' création du bouton de sauvegarde
dim button_sauver% : numero_objets% = numero_objets% + 1
button_sauver% = numero_objets% : button button_sauver% : hide button_sauver%
label click_sauver : on_click button_sauver%, click_sauver
top button_sauver%,10 : left button_sauver%,400 : caption button_sauver%,"Sauver"

' creation du alpha de nom de fichier
dim alpha_nom% : numero_objets% = numero_objets% + 1
alpha_nom% = numero_objets% : alpha alpha_nom%
top alpha_nom%,40 : left alpha_nom%,10 : caption alpha_nom%,"Source:"

' creation du alpha d'avancement du travail
dim alpha_progression% : numero_objets% = numero_objets% + 1
alpha_progression% = numero_objets% : alpha alpha_progression%
top alpha_progression%,10 : left alpha_progression%,620
caption alpha_progression%,"Progression:"+"attente sélection de fichier"

' création du mémo source
dim memo_source% : numero_objets% = numero_objets% + 1
memo_source% = numero_objets% : memo memo_source%
top memo_source%,60 : left memo_source%,10  : width memo_source%,600 : height memo_source%,700

' création du mémo résultat
dim memo_resultat% : numero_objets% = numero_objets% + 1
memo_resultat% = numero_objets% : memo memo_resultat% : hide memo_resultat%
top memo_resultat%,60 : left memo_resultat%,620  : width memo_resultat%,600 : height memo_resultat%,700

' création de les dlist intermédiaires
dim dlist_aplani% : numero_objets% = numero_objets% + 1
dlist_aplani% = numero_objets% : dlist dlist_aplani%
dim dlist_replie% :  : numero_objets% = numero_objets% + 1
dlist_replie% = numero_objets% : dlist dlist_replie%

' initialisations diverses
chr34$ = chr$(34)    : ' guillemet  (")
taille_indentation% = 4
alors$ = " th" + "en"

end


click_open:
    hide button_aplani%
    hide button_replie%
    hide button_sauver%
    hide memo_resultat%
    clear memo_resultat%
    clear memo_source%
    filter open_dialog%, "Source Panoramic|*.bas"
    source_file$ = file_name$(open_dialog%)
    caption alpha_nom%,"Source: "+source_file$
    if source_file$="" or source_file$="_"
        i% = message_error_ok("PSA-E-le fichier source n'est pas ouvert")
        hide button_start%
        return
    end_if
    show button_start%
    caption alpha_progression%,"Progression:"+"attente démarrer"
    return

click_start:
    file_load memo_source%,source_file$
    if count(memo_source%)=0
        i% = message_error_ok("PSA_E_le fichier source est vide")
        return
    end_if
    hide button_aplani%
    hide button_replie%
    hide button_sauver%
    hide memo_resultat%
    gosub aplanir_source
    gosub indenter
    gosub replier
    gosub afficher_replie
    show memo_resultat%
    show button_aplani%
    show button_replie%
    show button_sauver%
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_aplani:
    caption alpha_progression%,"Progression:"+"afficher aplani..."
    display
    gosub afficher_aplani
    caption alpha_progression%,"Progression:"+"attente action"
    return
   
click_replie:
    caption alpha_progression%,"Progression:"+"afficher replié..."
    display
    gosub afficher_replie
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_sauver:
    caption alpha_progression%,"Progression:"+"sauver..."
    display
    if contenu$="replié"
        filter save_dialog%, "Source Panoramic replié|*.bas"
    else
        filter save_dialog%, "Source Panoramic aplani|*.bas"
    end_if
    resultat_file$ = file_name$(save_dialog%)
    if resultat_file$<>"_"
        caption alpha_progression%,"Progression:"+"sauver..."
        file_save memo_resultat%,resultat_file$
    end_if
    caption alpha_progression%,"Progression:"+"attente action"
    return

aplanir_source:
    caption alpha_progression%,"Progression:"+"aplanir..."
    display
    clear dlist_aplani%
    for i%=1 to count(memo_source%)
        s$ = trim$(item_read$(memo_source%,i%))
        item_add dlist_aplani%," ' ="+"=> "+str$(i%)+": "+s$
        if len(s$)>0
            flag_string% = 0
            while len(s$)>0
                if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
                    item_add dlist_aplani%,s$
                    s$ = ""
                    exit_while
                end_if
                j% = 1
                repeat
                    if mid$(s$,j%,1)=chr34$ then flag_string% = 1 - flag_string%
                    if flag_string%=0
                        if mid$(s$,j%,1)=":"
                            if j%=len(s$)
                                item_add dlist_aplani%,s$
                                s$ = ""
                                exit_while
                            else
                                item_add dlist_aplani%,trim$(left$(s$,j%-1))
                                s$ = trim$(right$(s$,len(s$)-j%))
                                j% = 0
                                if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
                                    item_add dlist_aplani%,s$
                                    s$ = ""
                                    exit_while
                                end_if
                            end_if
                        end_if
                    end_if
                    j% = j% + 1
                until j%>len(s$)
                if len(s$)>0 then item_add dlist_aplani%,s$
                s$ = ""
            end_while
        else
            item_add dlist_aplani%,""
        end_if
    next i%
    return
   
indenter:
    caption alpha_progression%,"Progression:"+"indenter..."
    display
    niveau_indentation% = 1
    string_indentation$ = string$(taille_indentation%," ")
    for i%=1 to count(dlist_aplani%)
        s$ = item_read$(dlist_aplani%,i%)
        if left$(s$,6)="' ==> "
            j% = instr(s$,":")
            lig% = val(mid$(s$,7,j%-7))
        end_if
        if right$(s$,1)=":"
            s$ = ""
        else
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
        end_if
        if lower$(left$(s$,3))="if "
            if instr(lower$(s$),alors$)=0
                niveau_indentation% = niveau_indentation% + 1
                string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            end_if
            s$ = ""
        end_if
        if lower$(left$(s$,4))="for "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,6))="while "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,7))="repeat" and len(s$)=6
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,4))="else" and len(s$)=4
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,4))="end_"
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,5))="next "
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,6))="until "
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
    next i%
    return
   
replier:
    caption alpha_progression%,"Progression:"+"replier..."
    display
    clear dlist_replie%
    i% = 1
    repeat
        s$ = item_read$(dlist_aplani%,i%)
        if instr(s$," ' ="+"=> ")>0
            j% = instr(s$,":")
            s$ = right$(s$,len(s$)-j%-1)
            s1$ = item_read$(dlist_aplani%,i%+1)
            j% = 0
            while mid$(s1$,j%+1,1)=" "
                j% = j% + 1
            end_while
            if j%=0
                item_add dlist_replie%, s$
            else
                item_add dlist_replie%, left$(s1$,j%) + s$
            end_if
            while i%<count(dlist_aplani%)
                if instr(item_read$(dlist_aplani%,i%+1)," ' ="+"=> ")=0
                    i% = i% + 1
                else
                    exit_while
                end_if
            end_while
        else
            i% = i% + 1
        end_if
    until i%>count(dlist_aplani%)
    return
   
afficher_aplani:
    clear memo_resultat%
    if count(dlist_aplani%)=0 then return
    for i%=1 to count(dlist_aplani%)
        item_add memo_resultat%,item_read$(dlist_aplani%,i%)
    next i%
    contenu$ = "aplani"
    return

afficher_replie:
    clear memo_resultat%
    if count(dlist_replie%)=0 then return
    for i%=1 to count(dlist_replie%)
        item_add memo_resultat%,item_read$(dlist_replie%,i%)
    next i%
    contenu$ = "replié"
    return
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
JL35




Nombre de messages : 7095
Localisation : 77
Date d'inscription : 29/11/2007

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 21:29

Intéressant, comme toujours tu nous a fait quelque chose d'impeccable.

Je suis d'accord avec toi que le 'nommage' des objets résout bien des problème, même si c'est bien long à écrire.

Et je ne doute pas que le "Principe de Nardo" passe à la postérité et soit enseigné aux générations futures.
Revenir en haut Aller en bas
Nardo26

Nardo26


Nombre de messages : 2294
Age : 55
Localisation : Valence
Date d'inscription : 02/07/2010

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 21:49

Arrêtez !
Vous allez me faire rougir... Embarassed
C'est un peu du foutage de gueule ça... non ? Very Happy

Je suis pas trop présent en ce moment sur le forum car je suis tombé sur un os !
Je suis en train d'écrire un script pour ma page d'accueil qui me permet de tester si le navigateur possède le module Flashplayer:
et je galère avec la fct innerHTML qui ne veut pas marcher ! je tourne en rond depuis hier soir... et pour une fois Google n'est pas mon ami !!
Wink

@Klaus:
pourquoi tu n'utilises pas la variable systeme "number_objects" ??
Revenir en haut Aller en bas
http://nardo26.lescigales.org
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyMer 10 Nov 2010 - 23:59

Je n'utilise pas number_objects pour la raison très simple que cette variable retourne le nombre d'objets existant à un instant donné. Cela donne des résultats identiques à ma démarche tant qu'on ne supprime pas d'objets. Mais si l'on a le malheur d'en supprimer un qui n'est pas le dernier objet créé, la prochaine création d'uyn objet provoque...

Quant à l'utilisation de inner_html, je l'utilise en Delphi 6 pour mon ForumBrowser. Regarde le source Pascal inclus dans la distribution. J'utilise cette fonction pour extraire le code html d'une page web chargé dans l'explorateur afin d'isoler les posts, puis leur partie texte. Si par contre, tu de parles pas de Delphi à ce sujet, alors, je suis hors course...
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Nardo26

Nardo26


Nombre de messages : 2294
Age : 55
Localisation : Valence
Date d'inscription : 02/07/2010

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyJeu 11 Nov 2010 - 0:41

ok je comprend mieux là...
Quand à innerHTML c'est en javaScript... mais c'est bon, je viens de résoudre mon problème...
Je me suis un tout petit peu amusé avec la page d'accueil de mon site (un petit tag cloud)...
Amuse-toi par exemple à cliquer sur ton nom... Wink je te laisse découvrir cela...
Revenir en haut Aller en bas
http://nardo26.lescigales.org
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyJeu 11 Nov 2010 - 1:20

Ah, l'effet visuel est très joli, et l'effet de surprise est garanti ! Bravo !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Invité
Invité




est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyJeu 11 Nov 2010 - 1:58

Bravo Klaus pour le programme. Bon travail comme d'habitude
Sleep C'est l'heure!
Revenir en haut Aller en bas
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyVen 12 Nov 2010 - 1:43

J'ai repris mon programme d'analyse de source Panoramic. Les structures SELECT...CASE...END_SELECT n'étaient pas encore prises en compte - voilà qui est fait. De plus, j'ai ajouté une analyse des labels, avec reconnaissance des déclarations (commande label), des définitions (xxxx:) et des utilisations, séparées par goto, gosub et évènements. Il y a aussi un bouton supplémentaire permettant d'afficher la liste de tout ce qui a rapport aux labels, avec les numéros de ligne, et on peut bien sûr sauvegarder cela par le bouton sauver.

Voici le code actuel:
Code:

label aplanir_source, afficher_aplani, afficher_replie, indenter, replier
label identifier_labels, analyser_labels, afficher_labels

dim source_file$, resultat_file$, string_indentation$, contenu$
dim numero_objets%, flag_string%, taille_indentation%, niveau_indentation%
dim flag_label%, flag_defini%, flag_goto%, flag_gosub%, flag_event%
dim flag_case%
dim s$, s1$, s2$, chr34$, alors$, espace$, ext$
dim i%, j%, k%, l%, lig%, typ%

numero_objets% = 0

' configuration de l'écran
full_space 0

' création du dialogue d'ouverture
dim open_dialog% : numero_objets% = numero_objets% + 1
open_dialog% = numero_objets% : open_dialog open_dialog%

' création du dialogue de sauvegarde
dim save_dialog% : numero_objets% = numero_objets% + 1
save_dialog% = numero_objets% : save_dialog save_dialog%

' création du bouton d'ouverture
dim button_open% : numero_objets% = numero_objets% + 1
button_open% = numero_objets% : button button_open%
label click_open : on_click button_open%, click_open
top button_open%,10 : left button_open%,10 : caption button_open%,"Ouvrir"

' création du bouton de lancement
dim button_start% : numero_objets% = numero_objets% + 1
button_start% = numero_objets% : button button_start% : hide button_start%
label click_start : on_click button_start%, click_start
top button_start%,10 : left button_start%,100 : caption button_start%,"Démarrer"

' création du bouton de résultat aplani
dim button_aplani% : numero_objets% = numero_objets% + 1
button_aplani% = numero_objets% : button button_aplani% : hide button_aplani%
label click_aplani : on_click button_aplani%, click_aplani
top button_aplani%,10 : left button_aplani%,200 : caption button_aplani%,"Aplani"

' création du bouton de résultat replié
dim button_replie% : numero_objets% = numero_objets% + 1
button_replie% = numero_objets% : button button_replie% : hide button_replie%
label click_replie : on_click button_replie%, click_replie
top button_replie%,10 : left button_replie%,300 : caption button_replie%,"Replié"

' création du bouton de résultat labels
dim button_labels% : numero_objets% = numero_objets% + 1
button_labels% = numero_objets% : button button_labels% : hide button_labels%
label click_labels : on_click button_labels%, click_labels
top button_labels%,10 : left button_labels%,400 : caption button_labels%,"Labels"

' création du bouton de sauvegarde
dim button_sauver% : numero_objets% = numero_objets% + 1
button_sauver% = numero_objets% : button button_sauver% : hide button_sauver%
label click_sauver : on_click button_sauver%, click_sauver
top button_sauver%,10 : left button_sauver%,500 : caption button_sauver%,"Sauver"

' creation du alpha de nom de fichier
dim alpha_nom% : numero_objets% = numero_objets% + 1
alpha_nom% = numero_objets% : alpha alpha_nom%
top alpha_nom%,40 : left alpha_nom%,10 : caption alpha_nom%,"Source:"

' creation du alpha d'avancement du travail
dim alpha_progression% : numero_objets% = numero_objets% + 1
alpha_progression% = numero_objets% : alpha alpha_progression%
top alpha_progression%,10 : left alpha_progression%,620
caption alpha_progression%,"Progression:"+"attente sélection de fichier"

' création du mémo source
dim memo_source% : numero_objets% = numero_objets% + 1
memo_source% = numero_objets% : memo memo_source%
top memo_source%,60 : left memo_source%,10  : width memo_source%,600 : height memo_source%,700

' création du mémo résultat
dim memo_resultat% : numero_objets% = numero_objets% + 1
memo_resultat% = numero_objets% : memo memo_resultat% : hide memo_resultat%
top memo_resultat%,60 : left memo_resultat%,620  : width memo_resultat%,600 : height memo_resultat%,700

' création de les dlist intermédiaires
dim dlist_aplani% : numero_objets% = numero_objets% + 1
dlist_aplani% = numero_objets% : dlist dlist_aplani%
dim dlist_replie% :  : numero_objets% = numero_objets% + 1
dlist_replie% = numero_objets% : dlist dlist_replie%
dim dlist_lignes% :  : numero_objets% = numero_objets% + 1
dlist_lignes% = numero_objets% : dlist dlist_lignes%

' initialisations diverses
chr34$ = chr$(34)    : ' guillemet  (")
taille_indentation% = 4
alors$ = " th" + "en"
espace$ = string$(100," ")

end

click_open:
    hide button_aplani%
    hide button_replie%
    hide button_labels%
    hide button_sauver%
    hide memo_resultat%
    clear memo_resultat%
    clear memo_source%
    filter open_dialog%, "Source Panoramic|*.bas"
    source_file$ = file_name$(open_dialog%)
    caption alpha_nom%,"Source: "+source_file$
    if source_file$="" or source_file$="_"
        i% = message_error_ok("PSA-E-le fichier source n'est pas ouvert")
        hide button_start%
        return
    end_if
    show button_start%
    caption alpha_progression%,"Progression:"+"attente démarrer"
    return

click_start:
    file_load memo_source%,source_file$
    if count(memo_source%)=0
        i% = message_error_ok("PSA_E_le fichier source est vide")
        return
    end_if
    hide button_aplani%
    hide button_replie%
    hide button_labels%
    hide button_sauver%
    hide memo_resultat%
    gosub aplanir_source
    gosub identifier_labels
    gosub indenter
    gosub replier
    gosub analyser_labels
    gosub afficher_replie
    show memo_resultat%
    show button_aplani%
    show button_replie%
    show button_labels%
    show button_sauver%
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_aplani:
    caption alpha_progression%,"Progression:"+"afficher aplani..."
    display
    gosub afficher_aplani
    caption alpha_progression%,"Progression:"+"attente action"
    return
   
click_replie:
    caption alpha_progression%,"Progression:"+"afficher replié..."
    display
    gosub afficher_replie
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_labels:
    caption alpha_progression%,"Progression:"+"afficher labels..."
    display
    gosub afficher_labels
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_sauver:
    caption alpha_progression%,"Progression:"+"sauver..."
    display
    if contenu$="aplani"
        ext$ = ".bas"
        filter save_dialog%, "Source Panoramic aplani|*.bas"
    end_if
    if contenu$="replié"
        ext$ = ".bas"
        filter save_dialog%, "Source Panoramic replié|*.bas"
    end_if
    if contenu$="labels"
        ext$ = ".txt"
        filter save_dialog%, "Liste des labels|*.txt"
    end_if
    resultat_file$ = file_name$(save_dialog%)
    if resultat_file$<>"_"
        if right$(resultat_file$,4)<>ext$ then resultat_file$ = resultat_file$ + ext$
        caption alpha_progression%,"Progression:"+"sauver..."
        file_save memo_resultat%,resultat_file$
    end_if
    caption alpha_progression%,"Progression:"+"attente action"
    return
   
aplanir_source:
    caption alpha_progression%,"Progression:"+"aplanir..."
    display
    clear dlist_aplani%
    for i%=1 to count(memo_source%)
        s$ = trim$(item_read$(memo_source%,i%))
        item_add dlist_aplani%," ' ="+"=> "+str$(i%)+": "+s$
        if len(s$)>0
            flag_string% = 0
            while len(s$)>0
                if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
                    item_add dlist_aplani%,s$
                    s$ = ""
                    exit_while
                end_if
                j% = 1
                repeat
                    if mid$(s$,j%,1)=chr34$ then flag_string% = 1 - flag_string%
                    if flag_string%=0
                        if mid$(s$,j%,1)=":"
                            if j%=len(s$)
                                item_add dlist_aplani%,s$
                                s$ = ""
                                exit_while
                            else
                                item_add dlist_aplani%,trim$(left$(s$,j%-1))
                                s$ = trim$(right$(s$,len(s$)-j%))
                                j% = 0
                                if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
                                    item_add dlist_aplani%,s$
                                    s$ = ""
                                    exit_while
                                end_if
                            end_if
                        end_if
                    end_if
                    j% = j% + 1
                until j%>len(s$)
                if len(s$)>0 then item_add dlist_aplani%,s$
                s$ = ""
            end_while
        else
            item_add dlist_aplani%,""
        end_if
    next i%
    return

indenter:
    caption alpha_progression%,"Progression:"+"indenter..."
    display
    niveau_indentation% = 1
    flag_case% = 0
    string_indentation$ = string$(taille_indentation%," ")
    for i%=1 to count(dlist_aplani%)
        s$ = item_read$(dlist_aplani%,i%)
        if left$(s$,6)="' ="+"=> "
            j% = instr(s$,":")
            lig% = val(mid$(s$,7,j%-7))
        end_if
        if right$(s$,1)=":"
            s$ = ""
        else
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
        end_if
        if lower$(left$(s$,3))="if "
            if instr(lower$(s$),alors$)=0
                niveau_indentation% = niveau_indentation% + 1
                string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            end_if
            s$ = ""
        end_if
        if lower$(left$(s$,4))="for "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,6))="while "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,7))="repeat" and len(s$)=6
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,7))="select "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,5))="case "
            if flag_case%=1
                niveau_indentation% = niveau_indentation% - 1
                string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
                item_delete dlist_aplani%, i%
                item_insert dlist_aplani%,i%,string_indentation$ + s$
            end_if
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
            flag_case% = 1
        end_if
        if lower$(left$(s$,4))="else" and len(s$)=4
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,10))="end_select"
            niveau_indentation% = niveau_indentation% - 1 - flag_case%
            flag_case% = 0
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,4))="end_"
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,5))="next "
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,6))="until "
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
    next i%
    if niveau_indentation%<>1 then item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
    return

replier:
    caption alpha_progression%,"Progression:"+"replier..."
    display
    clear dlist_replie%
    i% = 1
    repeat
        s$ = item_read$(dlist_aplani%,i%)
        if instr(s$," ' ="+"=> ")>0
            j% = instr(s$,":")
            s$ = right$(s$,len(s$)-j%-1)
            s1$ = item_read$(dlist_aplani%,i%+1)
            j% = 0
            while mid$(s1$,j%+1,1)=" "
                j% = j% + 1
            end_while
            if j%=0
                item_add dlist_replie%, s$
            else
                item_add dlist_replie%, left$(s1$,j%) + s$
            end_if
            while i%<count(dlist_aplani%)
                if instr(item_read$(dlist_aplani%,i%+1)," ' ="+"=> ")=0
                    i% = i% + 1
                else
                    exit_while
                end_if
            end_while
        else
            i% = i% + 1
        end_if
    until i%>count(dlist_aplani%)
    return
   
afficher_aplani:
    clear memo_resultat%
    if count(dlist_aplani%)=0 then return
    for i%=1 to count(dlist_aplani%)
        item_add memo_resultat%,item_read$(dlist_aplani%,i%)
    next i%
    contenu$ = "aplani"
    return

afficher_replie:
    clear memo_resultat%
    if count(dlist_replie%)=0 then return
    for i%=1 to count(dlist_replie%)
        item_add memo_resultat%,item_read$(dlist_replie%,i%)
    next i%
    contenu$ = "replié"
    return

afficher_labels:
    clear memo_resultat%
    for i%=1 to count(dlist_lignes%)
        item_add memo_resultat%,item_read$(dlist_lignes%,i%)
    next i%
    contenu$ = "labels"
    return
   
identifier_labels:
    caption alpha_progression%,"Progression:"+"identifier les labels..."
    display
    clear dlist_lignes%
    i% = 1
    repeat
        s$ = trim$(item_read$(dlist_aplani%,i%))
        if instr(s$,"' ="+"=> ")>0
            j% = instr(s$,"' ="+"=> ")
            k% = instr(s$,":")
            lig% = val(mid$(s$,j%+6,k%-j%-6))
            s$ = trim$(right$(s$,len(s$)-k%))
            i% = i% + 1
            s$ = trim$(item_read$(dlist_aplani%,i%))
        end_if
        if lower$(left$(s$,6))="label "
            s$ = trim$(right$(s$,len(s$)-6))
            j% = instr(s$,",")
            while j%>0
                s1$ = trim$(left$(s$,j%-1))
                s$ = trim$(right$(s$,len(s$)-j%))
                item_add dlist_lignes%,s1$+left$(espace$,50-len(s1$))+"0=label  "+"=>"+str$(lig%)
                j% = instr(s$,",")
            end_while
            item_add dlist_lignes%,s$+left$(espace$,50-len(s$))+"0=label  "+"=>"+str$(lig%)
        else
            if right$(s$,1)=":"
                s2$ = left$(s$,len(s$)-1)
                item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"1=défini "+"=>"+str$(lig%)
            else
                if lower$(left$(s$,5))="goto "
                    s2$ = trim$(right$(s$,len(s$)-instr(s$," ")))
                    item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"2=goto  "+"=>"+str$(lig%)
                end_if
                if lower$(left$(s$,6))="gosub "
                    s2$ = trim$(right$(s$,len(s$)-instr(s$," ")))
                    item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"3=gosub  "+"=>"+str$(lig%)
                end_if
                if lower$(left$(s$,3))="on_"
                    s2$ = trim$(right$(s$,len(s$)-instr(s$,",")))
                    item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"4=on_    "+"=>"+str$(lig%)
                end_if
            end_if
        end_if
        i% = i% + 1
    until i%>count(dlist_aplani%)
    sort dlist_lignes%
    return
   
analyser_labels:
    caption alpha_progression%,"Progression:"+"analyser les labels..."
    display
    i%=1
    s1$ = ""
    flag_label% = 0
    flag_defini% = 0
    flag_gosub% = 0
    flag_goto% = 0
    flag_event% = 0
    item_add dlist_lignes%,"***fini***"+espace$
    lig% = 0
    repeat
        s$ = item_read$(dlist_lignes%,i%)
        j% = instr(s$," ")
        s2$ = left$(s$,j%-1)
        if s2$<>s1$
            if flag_label%=1 and flag_defini%=0
                item_add dlist_replie%,"++++ label "+s1$+" non défini (xxx:)"
            end_if
            if flag_label%=0 and flag_defini%=1
                item_add dlist_replie%,"++++ label "+s1$+" non déclaré (commande label)"
            end_if
            if (flag_goto%+flag_gosub%+flag_event%)>1
                item_add dlist_replie%,"++++ label "+s1$+" utilisation ambigue"
            end_if
            if left$(s$,10)="***fini***" then exit_repeat
            flag_label% = 0
            flag_defini% = 0
            flag_gosub% = 0
            flag_goto% = 0
            flag_event% = 0
            s1$ = s2$
        end_if
        j% = instr(s$,"=")
        typ% = val(mid$(s$,j%-1,1))
        select typ%
          case 0
              if flag_label%=1
                  j% = instr(s$,">")
                  lig% = val(right$(s$,len(s$)-j%))
                  item_add dlist_replie%,"++++ label "+s1$+" redéclaré (commande label) à "+str$(lig%)
              end_if
              flag_label% = 1
          case 1
              if flag_defini%=1
                  j% = instr(s$,">")
                  lig% = val(right$(s$,len(s$)-j%))
                  item_add dlist_replie%,"++++ label "+s1$+" redéfini (xxx:) à "+str$(lig%)
              end_if
              flag_defini% = 1
          case 2
              flag_goto% = 1
          case 3
              flag_gosub% = 1
          case 4
              flag_defini% = 1
        end_select
        i% = i% + 1
    until i%>count(dlist_lignes%)
    return
   
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Nardo26

Nardo26


Nombre de messages : 2294
Age : 55
Localisation : Valence
Date d'inscription : 02/07/2010

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyVen 12 Nov 2010 - 8:15

Bonjour Klaus,

Beau boulot ! Smile

Quelques petites remarques pour améliorer ton prog:
Ton programme n'aime pas trop les commentaires de ce style :
' ceci est un commentaire :

les ":" en fin du commentaire sont pris en compte et le commentaire est considéré comme une étiquette...

De même, j'ai fais le test avec un source dont les lignes sont un peu longues:
celles-ci se retrouvent tronçonnées et cela perturbe l'analyse du code...

PS: J'ai pas bien compris ce que faisait "Aplanir". Lorsque j'essaye, cela me copie la ligne avec son n°...
scratch
Revenir en haut Aller en bas
http://nardo26.lescigales.org
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyVen 12 Nov 2010 - 10:47

Je vais revoir ma copie à l'aide de tes remarques.
1. une ligne du type ' commentaire :
--> je vois d'où ça vient, et c'est facile à corriger

2. Les lignes un peu longues sont tronquées avec un renvoi à la ligne
--> j'ai rencontré cela aussi, cela vient de Panoramic qui coupe une ligne d'un mémo qui ne s'affiche pas en entier : On n'a pas accès à la propriété WordWrap du mémo Delphi; pour Panoramic, c'est "true" en permanence ! regarde ceci:
Code:

dim s$

width 0,1200
memo 1 : top 1,100 : left 1,10 : width 1,1100
memo 2 : top 2,10 : left 2,10 : width 2,500
dlist 3

s$ = string$(40,"a") + " "
item_add 3,s$+s$+s$+s$
item_add 1,item_read$(3,1)
item_add 2,item_read$(3,1)

end

Pour l'affichage, je n'ai pas de solution, mais pour la sauvegarde, je vais le corriger: au lieu de sauvegarder le mémo affiché, je vais sauvegarder la dlist qui l'alimente, et le problème seréa règlé

3. Aplanir
--> c'est la fonction essentielle. Elle produiit, pour chaque ligne, un commentaire contenant la ligne d'origine avec son numéro de ligne d'origine, puis autant de lignes Panoramic réelles qu'il y a de lignes de commande indépendantes dans la ligne d'origine. En gros,
Code:

top memo_resultat%,60 : left memo_resultat%,620  : width memo_resultat%,600 : height memo_resultat%,700
est remplacé par
Code:

' ==> 74: top memo_resultat%,60 : left memo_resultat%,620  : width memo_resultat%,600 : height memo_resultat%,700
    top memo_resultat%,60
    left memo_resultat%,620
    width memo_resultat%,600
    height memo_resultat%,700
Ceci permet deux choses: d'une part, pour l'analyse, je travaille uniquement sur le code "aplani" - c'est beaucoup plus simple. Et d'autre part, ce code est un code valide pour l'éditeur Panoramic, et on peut l'exécuter directement. Pour debugger un programme, c'est plus parlant quand on cherche une erreur pour laquelle Panoramic nous dit "ligne 317", ma s cette ligne contient 5 commandes, par exemple. En version aplanie, on a directement l'indication de la commande en faute. Mais je reconnais que dans le cas d'une commande par ligne, cela semble un peu superflu. Néanmoins, cela me permet, pour l'analyse, d'avoir pour chaque ligne le numéro de ligne Panoramic d'origine, ce qui est important.
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Klaus

Klaus


Nombre de messages : 12274
Age : 74
Localisation : Ile de France
Date d'inscription : 29/12/2009

est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 EmptyVen 12 Nov 2010 - 10:56

Voici la version qui contient les deux corrections:
Code:

label aplanir_source, afficher_aplani, afficher_replie, indenter, replier
label identifier_labels, analyser_labels, afficher_labels

dim source_file$, resultat_file$, string_indentation$, contenu$
dim numero_objets%, flag_string%, taille_indentation%, niveau_indentation%
dim flag_label%, flag_defini%, flag_goto%, flag_gosub%, flag_event%
dim flag_case%
dim s$, s1$, s2$, chr34$, alors$, espace$, ext$
dim i%, j%, k%, l%, lig%, typ%

numero_objets% = 0

' configuration de l'écran
full_space 0

' création du dialogue d'ouverture
dim open_dialog% : numero_objets% = numero_objets% + 1
open_dialog% = numero_objets% : open_dialog open_dialog%

' création du dialogue de sauvegarde
dim save_dialog% : numero_objets% = numero_objets% + 1
save_dialog% = numero_objets% : save_dialog save_dialog%

' création du bouton d'ouverture
dim button_open% : numero_objets% = numero_objets% + 1
button_open% = numero_objets% : button button_open%
label click_open : on_click button_open%, click_open
top button_open%,10 : left button_open%,10 : caption button_open%,"Ouvrir"

' création du bouton de lancement
dim button_start% : numero_objets% = numero_objets% + 1
button_start% = numero_objets% : button button_start% : hide button_start%
label click_start : on_click button_start%, click_start
top button_start%,10 : left button_start%,100 : caption button_start%,"Démarrer"

' création du bouton de résultat aplani
dim button_aplani% : numero_objets% = numero_objets% + 1
button_aplani% = numero_objets% : button button_aplani% : hide button_aplani%
label click_aplani : on_click button_aplani%, click_aplani
top button_aplani%,10 : left button_aplani%,200 : caption button_aplani%,"Aplani"

' création du bouton de résultat replié
dim button_replie% : numero_objets% = numero_objets% + 1
button_replie% = numero_objets% : button button_replie% : hide button_replie%
label click_replie : on_click button_replie%, click_replie
top button_replie%,10 : left button_replie%,300 : caption button_replie%,"Replié"

' création du bouton de résultat labels
dim button_labels% : numero_objets% = numero_objets% + 1
button_labels% = numero_objets% : button button_labels% : hide button_labels%
label click_labels : on_click button_labels%, click_labels
top button_labels%,10 : left button_labels%,400 : caption button_labels%,"Labels"

' création du bouton de sauvegarde
dim button_sauver% : numero_objets% = numero_objets% + 1
button_sauver% = numero_objets% : button button_sauver% : hide button_sauver%
label click_sauver : on_click button_sauver%, click_sauver
top button_sauver%,10 : left button_sauver%,500 : caption button_sauver%,"Sauver"

' creation du alpha de nom de fichier
dim alpha_nom% : numero_objets% = numero_objets% + 1
alpha_nom% = numero_objets% : alpha alpha_nom%
top alpha_nom%,40 : left alpha_nom%,10 : caption alpha_nom%,"Source:"

' creation du alpha d'avancement du travail
dim alpha_progression% : numero_objets% = numero_objets% + 1
alpha_progression% = numero_objets% : alpha alpha_progression%
top alpha_progression%,10 : left alpha_progression%,620
caption alpha_progression%,"Progression:"+"attente sélection de fichier"

' création du mémo source
dim memo_source% : numero_objets% = numero_objets% + 1
memo_source% = numero_objets% : memo memo_source%
top memo_source%,60 : left memo_source%,10  : width memo_source%,600 : height memo_source%,700

' création du mémo résultat
dim memo_resultat% : numero_objets% = numero_objets% + 1
memo_resultat% = numero_objets% : memo memo_resultat% : hide memo_resultat%
top memo_resultat%,60 : left memo_resultat%,620  : width memo_resultat%,600 : height memo_resultat%,700

' création de les dlist intermédiaires
dim dlist_aplani% : numero_objets% = numero_objets% + 1
dlist_aplani% = numero_objets% : dlist dlist_aplani%
dim dlist_replie% :  : numero_objets% = numero_objets% + 1
dlist_replie% = numero_objets% : dlist dlist_replie%
dim dlist_lignes% :  : numero_objets% = numero_objets% + 1
dlist_lignes% = numero_objets% : dlist dlist_lignes%

' initialisations diverses
chr34$ = chr$(34)    : ' guillemet  (")
taille_indentation% = 4
alors$ = " th" + "en"
espace$ = string$(100," ")

end

click_open:
    hide button_aplani%
    hide button_replie%
    hide button_labels%
    hide button_sauver%
    hide memo_resultat%
    clear memo_resultat%
    clear memo_source%
    filter open_dialog%, "Source Panoramic|*.bas"
    source_file$ = file_name$(open_dialog%)
    caption alpha_nom%,"Source: "+source_file$
    if source_file$="" or source_file$="_"
        i% = message_error_ok("PSA-E-le fichier source n'est pas ouvert")
        hide button_start%
        return
    end_if
    show button_start%
    caption alpha_progression%,"Progression:"+"attente démarrer"
    return

click_start:
    file_load memo_source%,source_file$
    if count(memo_source%)=0
        i% = message_error_ok("PSA_E_le fichier source est vide")
        return
    end_if
    hide button_aplani%
    hide button_replie%
    hide button_labels%
    hide button_sauver%
    hide memo_resultat%
    gosub aplanir_source
    gosub identifier_labels
    gosub indenter
    gosub replier
    gosub analyser_labels
    gosub afficher_replie
    show memo_resultat%
    show button_aplani%
    show button_replie%
    show button_labels%
    show button_sauver%
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_aplani:
    caption alpha_progression%,"Progression:"+"afficher aplani..."
    display
    gosub afficher_aplani
    caption alpha_progression%,"Progression:"+"attente action"
    return
   
click_replie:
    caption alpha_progression%,"Progression:"+"afficher replié..."
    display
    gosub afficher_replie
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_labels:
    caption alpha_progression%,"Progression:"+"afficher labels..."
    display
    gosub afficher_labels
    caption alpha_progression%,"Progression:"+"attente action"
    return

click_sauver:
    caption alpha_progression%,"Progression:"+"sauver..."
    display
    if contenu$="aplani"
        ext$ = ".bas"
        filter save_dialog%, "Source Panoramic aplani|*.bas"
        k% = dlist_aplani%
    end_if
    if contenu$="replié"
        ext$ = ".bas"
        filter save_dialog%, "Source Panoramic replié|*.bas"
        k% = dlist_replie%
    end_if
    if contenu$="labels"
        ext$ = ".txt"
        filter save_dialog%, "Liste des labels|*.txt"
        k% = dlist_lignes%
    end_if
    resultat_file$ = file_name$(save_dialog%)
    if resultat_file$<>"_"
        if right$(resultat_file$,4)<>ext$ then resultat_file$ = resultat_file$ + ext$
        caption alpha_progression%,"Progression:"+"sauver..."
        file_save k%,resultat_file$
    end_if
    caption alpha_progression%,"Progression:"+"attente action"
    return
   
aplanir_source:
    caption alpha_progression%,"Progression:"+"aplanir..."
    display
    clear dlist_aplani%
    for i%=1 to count(memo_source%)
        s$ = trim$(item_read$(memo_source%,i%))
        item_add dlist_aplani%," ' ="+"=> "+str$(i%)+": "+s$
        if len(s$)>0
            flag_string% = 0
            while len(s$)>0
                if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
                    item_add dlist_aplani%,s$
                    s$ = ""
                    exit_while
                end_if
                j% = 1
                repeat
                    if mid$(s$,j%,1)=chr34$ then flag_string% = 1 - flag_string%
                    if flag_string%=0
                        if mid$(s$,j%,1)=":"
                            if j%=len(s$)
                                item_add dlist_aplani%,s$
                                s$ = ""
                                exit_while
                            else
                                item_add dlist_aplani%,trim$(left$(s$,j%-1))
                                s$ = trim$(right$(s$,len(s$)-j%))
                                j% = 0
                                if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
                                    item_add dlist_aplani%,s$
                                    s$ = ""
                                    exit_while
                                end_if
                            end_if
                        end_if
                    end_if
                    j% = j% + 1
                until j%>len(s$)
                if len(s$)>0 then item_add dlist_aplani%,s$
                s$ = ""
            end_while
        else
            item_add dlist_aplani%,""
        end_if
    next i%
    return

indenter:
    caption alpha_progression%,"Progression:"+"indenter..."
    display
    niveau_indentation% = 1
    flag_case% = 0
    string_indentation$ = string$(taille_indentation%," ")
    for i%=1 to count(dlist_aplani%)
        s$ = item_read$(dlist_aplani%,i%)
        if left$(s$,6)="' ="+"=> "
            j% = instr(s$,":")
            lig% = val(mid$(s$,7,j%-7))
        end_if
        if right$(s$,1)=":"
            s$ = ""
        else
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
        end_if
        if lower$(left$(s$,3))="if "
            if instr(lower$(s$),alors$)=0
                niveau_indentation% = niveau_indentation% + 1
                string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            end_if
            s$ = ""
        end_if
        if lower$(left$(s$,4))="for "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,6))="while "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,7))="repeat" and len(s$)=6
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,7))="select "
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,5))="case "
            if flag_case%=1
                niveau_indentation% = niveau_indentation% - 1
                string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
                item_delete dlist_aplani%, i%
                item_insert dlist_aplani%,i%,string_indentation$ + s$
            end_if
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
            flag_case% = 1
        end_if
        if lower$(left$(s$,4))="else" and len(s$)=4
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            niveau_indentation% = niveau_indentation% + 1
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            s$ = ""
        end_if
        if lower$(left$(s$,10))="end_select"
            niveau_indentation% = niveau_indentation% - 1 - flag_case%
            flag_case% = 0
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,4))="end_"
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,5))="next "
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
        if lower$(left$(s$,6))="until "
            niveau_indentation% = niveau_indentation% - 1
            if niveau_indentation%<1
                item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
                niveau_indentation% = 1
            end_if
            string_indentation$ = string$(taille_indentation%*niveau_indentation%," ")
            item_delete dlist_aplani%, i%
            item_insert dlist_aplani%,i%,string_indentation$ + s$
            s$ = ""
        end_if
    next i%
    if niveau_indentation%<>1 then item_add dlist_aplani%,"' ++++ erreur de structure ligne "+str$(lig%)
    return

replier:
    caption alpha_progression%,"Progression:"+"replier..."
    display
    clear dlist_replie%
    i% = 1
    repeat
        s$ = item_read$(dlist_aplani%,i%)
        if instr(s$," ' ="+"=> ")>0
            j% = instr(s$,":")
            s$ = right$(s$,len(s$)-j%-1)
            s1$ = item_read$(dlist_aplani%,i%+1)
            j% = 0
            while mid$(s1$,j%+1,1)=" "
                j% = j% + 1
            end_while
            if j%=0
                item_add dlist_replie%, s$
            else
                item_add dlist_replie%, left$(s1$,j%) + s$
            end_if
            while i%<count(dlist_aplani%)
                if instr(item_read$(dlist_aplani%,i%+1)," ' ="+"=> ")=0
                    i% = i% + 1
                else
                    exit_while
                end_if
            end_while
        else
            i% = i% + 1
        end_if
    until i%>count(dlist_aplani%)
    return
   
afficher_aplani:
    clear memo_resultat%
    if count(dlist_aplani%)=0 then return
    for i%=1 to count(dlist_aplani%)
        item_add memo_resultat%,item_read$(dlist_aplani%,i%)
    next i%
    contenu$ = "aplani"
    return

afficher_replie:
    clear memo_resultat%
    if count(dlist_replie%)=0 then return
    for i%=1 to count(dlist_replie%)
        item_add memo_resultat%,item_read$(dlist_replie%,i%)
    next i%
    contenu$ = "replié"
    return

afficher_labels:
    clear memo_resultat%
    for i%=1 to count(dlist_lignes%)
        item_add memo_resultat%,item_read$(dlist_lignes%,i%)
    next i%
    contenu$ = "labels"
    return
   
identifier_labels:
    caption alpha_progression%,"Progression:"+"identifier les labels..."
    display
    clear dlist_lignes%
    i% = 1
    repeat
        s$ = trim$(item_read$(dlist_aplani%,i%))
        if instr(s$,"' ="+"=> ")>0
            j% = instr(s$,"' ="+"=> ")
            k% = instr(s$,":")
            lig% = val(mid$(s$,j%+6,k%-j%-6))
            s$ = trim$(right$(s$,len(s$)-k%))
            i% = i% + 1
            s$ = trim$(item_read$(dlist_aplani%,i%))
        end_if
        if lower$(left$(s$,6))="label "
            s$ = trim$(right$(s$,len(s$)-6))
            j% = instr(s$,",")
            while j%>0
                s1$ = trim$(left$(s$,j%-1))
                s$ = trim$(right$(s$,len(s$)-j%))
                item_add dlist_lignes%,s1$+left$(espace$,50-len(s1$))+"0=label  "+"=>"+str$(lig%)
                j% = instr(s$,",")
            end_while
            item_add dlist_lignes%,s$+left$(espace$,50-len(s$))+"0=label  "+"=>"+str$(lig%)
        else
            if left$(s$,1)="'" or lower$(left$(s$,4))="rem "
            else
                if right$(s$,1)=":"
                    s2$ = left$(s$,len(s$)-1)
                    item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"1=défini "+"=>"+str$(lig%)
                else
                    if lower$(left$(s$,5))="goto "
                        s2$ = trim$(right$(s$,len(s$)-instr(s$," ")))
                        item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"2=goto  "+"=>"+str$(lig%)
                    end_if
                    if lower$(left$(s$,6))="gosub "
                        s2$ = trim$(right$(s$,len(s$)-instr(s$," ")))
                        item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"3=gosub  "+"=>"+str$(lig%)
                    end_if
                    if lower$(left$(s$,3))="on_"
                        s2$ = trim$(right$(s$,len(s$)-instr(s$,",")))
                        item_add dlist_lignes%,s2$+left$(espace$,50-len(s2$))+"4=on_    "+"=>"+str$(lig%)
                    end_if
                end_if
            end_if
        end_if
        i% = i% + 1
    until i%>count(dlist_aplani%)
    sort dlist_lignes%
    return
   
analyser_labels:
    caption alpha_progression%,"Progression:"+"analyser les labels..."
    display
    i%=1
    s1$ = ""
    flag_label% = 0
    flag_defini% = 0
    flag_gosub% = 0
    flag_goto% = 0
    flag_event% = 0
    item_add dlist_lignes%,"***fini***"+espace$
    lig% = 0
    repeat
        s$ = item_read$(dlist_lignes%,i%)
        j% = instr(s$," ")
        s2$ = left$(s$,j%-1)
        if s2$<>s1$
            if flag_label%=1 and flag_defini%=0
                item_add dlist_replie%,"++++ label "+s1$+" non défini (xxx:)"
            end_if
            if flag_label%=0 and flag_defini%=1
                item_add dlist_replie%,"++++ label "+s1$+" non déclaré (commande label)"
            end_if
            if (flag_goto%+flag_gosub%+flag_event%)>1
                item_add dlist_replie%,"++++ label "+s1$+" utilisation ambigue"
            end_if
            if left$(s$,10)="***fini***" then exit_repeat
            flag_label% = 0
            flag_defini% = 0
            flag_gosub% = 0
            flag_goto% = 0
            flag_event% = 0
            s1$ = s2$
        end_if
        j% = instr(s$,"=")
        typ% = val(mid$(s$,j%-1,1))
        select typ%
          case 0
              if flag_label%=1
                  j% = instr(s$,">")
                  lig% = val(right$(s$,len(s$)-j%))
                  item_add dlist_replie%,"++++ label "+s1$+" redéclaré (commande label) à "+str$(lig%)
              end_if
              flag_label% = 1
          case 1
              if flag_defini%=1
                  j% = instr(s$,">")
                  lig% = val(right$(s$,len(s$)-j%))
                  item_add dlist_replie%,"++++ label "+s1$+" redéfini (xxx:) à "+str$(lig%)
              end_if
              flag_defini% = 1
          case 2
              flag_goto% = 1
          case 3
              flag_gosub% = 1
          case 4
              flag_defini% = 1
        end_select
        i% = i% + 1
    until i%>count(dlist_lignes%)
    return
   

EDIT 12/11/2010 14:37
Cette version est maintenant en ligne sur mon site !
Revenir en haut Aller en bas
http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé





est-ce un bug sur IF et END_IF? - Page 3 Empty
MessageSujet: Re: est-ce un bug sur IF et END_IF?   est-ce un bug sur IF et END_IF? - Page 3 Empty

Revenir en haut Aller en bas
 
est-ce un bug sur IF et END_IF?
Revenir en haut 
Page 3 sur 3Aller à la page : Précédent  1, 2, 3
 Sujets similaires
-
» PANORAMIC V0.9.13

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: A l'aide!-
Sauter vers: