FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» Logiciel de soutien scolaire en langues.
par Pedro Alvarez Aujourd'hui à 16:52

» KGF_dll - nouvelles versions
par Klaus Aujourd'hui à 14:16

» Compilateur FBPano
par Ouf_ca_passe Aujourd'hui à 12:25

» mise a jour calculatrice
par papydall Aujourd'hui à 2:01

» double guillemets "" dans un EDIT
par Marc Hier à 23:43

» Documentation de KGF
par Klaus Lun 20 Nov 2017 - 22:52

» Zoom sur une portion d'écran
par JL35 Lun 20 Nov 2017 - 21:51

» Recherche d'une expression dans un source
par Marc Lun 20 Nov 2017 - 13:08

» Tracer une grille n'importe où sur l'écran
par JL35 Dim 19 Nov 2017 - 22:14

» TourD Version 2
par Klaus Sam 18 Nov 2017 - 23:58

» La métamatière et le peuple
par JL35 Ven 17 Nov 2017 - 21:18

» Capture d'une zone de l'écran total
par JL35 Ven 17 Nov 2017 - 18:41

» qui peut résoudre mon prb
par pascal10000 Jeu 16 Nov 2017 - 17:30

» évènements et objets système : listage automatique
par Jean Claude Jeu 16 Nov 2017 - 11:15

» Panoramic et la reconnaissance vocale.
par papydall Jeu 16 Nov 2017 - 3:45

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2017
LunMarMerJeuVenSamDim
  12345
6789101112
13141516171819
20212223242526
27282930   
CalendrierCalendrier

Partagez | 
 

 Analyser un code Panoramic

Voir le sujet précédent Voir le sujet suivant Aller en bas 
Aller à la page : 1, 2  Suivant
AuteurMessage
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Analyser un code Panoramic   Dim 12 Nov 2017 - 3:12

Bonjour à tous !

Voici un petit utilitaire qui permet d’analyser un code source Panoramic.

Au départ,  je souhaitais pouvoir visualiser la structure des sous-programmes  LABEL / GOSUB / RETURN d’un source, en n'affichant que les lignes concernées avec leurs numéros de ligne. Ceci étant un bon moyen pour moi, de retrouver des erreurs de structure.

Puis, de fil en aiguille, j’y ai ajouté la visualisation des structures SUB / EXIT_SUB / END_SUB.

C’était trop bête de ne pas continuer, alors les structures :

-   IF / THEN / ELSE / END_IF
-   FOR / TO / STEP / EXIT_FOR / NEXT
-   WHILE / EXIT_WHILE / END_WHILE / REPEAT / EXIT_REPEAT / UNTIL

Edit : ajout de SELECT / CASE / END_SELECT

sont venues compléter l’ensemble.

Code:
' ------------------------------------------------------------------------------
'  PANORAMIC FILE ANALYSER
'  MARC37 - November 2017 - Panoramic v0.9.28.i12
'  http://panoramic-language.pagesperso-orange.fr/French/index.html
'  http://panoramic.top-forum.net
' ------------------------------------------------------------------------------
DIM Debug%
Debug% = 0

DIM a$ : ' basic file name to analyze
DIM b$ : ' Reading a line of a$
DIM c$ : ' uppercase of b$
DIM d$ : ' formatted line number as ######
DIM AlreadyExistingLine%
DIM i%, j% : ' variable loop FOR/NEXT
DIM LineLength%
DIM LineNumber%, FontSize%, MemoInUse%
DIM StartingLinePosition%
DIM FirstCaracter%
DIM Character$
DIM Word$
DIM Line$
DIM z$
LABEL Resize, OpenFile, Bigger, Smaller, About, Quit
LABEL Integral, AllLabel, AllSub, AllIf, AllDim, AllForNext, AllWhile, AllSelect
FontSize% = 10
DLIST 50 : ' hidden object => source code to analyze

IF DEBUG% = 1
    FORM 998
    HEIGHT 998, 800
    WIDTH 998, 550
    Command_target_is 998
    LIST 51 : ' hidden object => list of LABEL
    HEIGHT 51, 750
    WIDTH 51, 500
    FONT_NAME 51,"Courier New"
    FONT_SIZE 51,10
    command_target_is 0
    FORM 999
    HEIGHT 999, 800
    WIDTH 999, 550
    TOP 999, 50
    LEFT 999, 50
    Command_target_is 999
    LIST 52 : ' hidden object => Source code without " "
    HEIGHT 52, 750
    WIDTH 52, 500
    FONT_NAME 52,"Courier New"
    FONT_SIZE 52,10
    command_target_is 0
ELSE
    DLIST 51 : ' hidden object => list of LABEL
    DLIST 52 : ' hidden object => Source code without " "
END_IF

Mask()
ON_CLOSE 0, Quit
ON_RESIZE 0, Resize
ON_CLICK 1, OpenFile
ON_CLICK 2, Quit
ON_CLICK 3, About
ON_CLICK 4, Bigger
ON_CLICK 5, Smaller
ON_CLICK 6, Integral
ON_CLICK 7, AllLabel
ON_CLICK 8, AllSub
ON_CLICK 9, AllIf
ON_CLICK 10, AllDim
ON_CLICK 11, AllForNext
ON_CLICK 12, ALLWhile
ON_CLICK 13, AllSelect
END
' ------------------------------------------------------------------------------
OpenFile:
    IF OBJECT_EXISTS(30)=0 THEN OPEN_DIALOG 30
    FILTER 30,"*.bas|*.bas"
    a$=FILE_NAME$(30)
    IF a$="_" THEN RETURN
    CLEAR 50
    CLEAR 51
    CLEAR 52
    FOR i% = 20 TO 27
        CLEAR i%
    NEXT i%   
    FOR i% = 4 TO 13
        HIDE i%
    NEXT i%
    OFF_RESIZE 0
    OFF_CLICK 1
    LineNumber% = 1
    FOR i% = 21 to 28
        HIDE i%
    NEXT i%
    SHOW 20
    waitingMessage()
    FILE_OPEN_READ 30,a$
    CAPTION 0, a$
    WHILE FILE_EOF(30)<>1
        FILE_READLN 30,b$
        d$=STR$(LineNumber%)
        WHILE LEN(d$)<6
            d$=" "+d$
        END_WHILE
        c$=UPPER$(b$)
        QuoteFilter()
        ITEM_ADD 50, b$
        ITEM_ADD 20, d$+" "+b$
        LineNumber% = LineNumber% + 1
    END_WHILE
    FILE_CLOSE 30
    Analysis()
    HIDE 100
RETURN
' ------------------------------------------------------------------------------
SUB QuoteFilter()
    DIM_LOCAL SingleQuote%
    DIM_LOCAL DoubleQuote%
    LineLength% = LEN(c$)
    IF LineLength% = 0
        ITEM_ADD 52,""
        EXIT_SUB
    END_IF
    IF INSTR(c$,"REM ")>0
        IF INSTR(c$,"REM ")=1 OR INSTR(c$," REM ")>0 OR INSTR(c$,":REM ")>0
            c$= LEFT$(b$,INSTR(c$,"REM"))
            ITEM_ADD 52, c$
            EXIT_SUB
        END_IF   
    END_IF
    IF LineLength% > 0
        SingleQuote% = 0
        DoubleQuote% = 0
        Line$=""
        FOR i% = 1 to LineLength%
            Character$=MID$(c$,i%,1)
            IF Character$ = CHR$(39) AND DoubleQuote% = 0
                ITEM_ADD 52, Line$
                EXIT_SUB
            END_IF
            IF Character$ = CHR$(34) THEN DoubleQuote% = DoubleQuote% + 1
            IF DoubleQuote% = 1 THEN Character$ = "x"
            IF DoubleQuote% = 2 THEN DoubleQuote% = 0   
            Line$ = Line$ + Character$
        NEXT i%
        ITEM_ADD 52, Line$
    END_IF   
END_SUB
' ------------------------------------------------------------------------------
SUB Analysis()
    ExtractingLabelNames()
    FOR LineNumber% = 1 to COUNT(50)
        AlreadyExistingLine% = 0
        b$=ITEM_READ$(50,LineNumber%)
        c$=ITEM_READ$(52,LineNumber%)
        LineLength% = LEN(c$)
        d$=STR$(LineNumber%)
        WHILE LEN(d$)<6
            d$=" "+d$
        END_WHILE
        DisplayLabel()
        DisplaySub()
        DisplayIf()
        DisplayDim()
        DisplayFor()
        DisplayWhile()
        DisplaySelect()
    NEXT LineNumber%
    FOR i% = 4 TO 13
        SHOW i%
    NEXT i%
    ON_RESIZE 0, Resize
    ON_CLICK 1, OpenFile
END_SUB
' ------------------------------------------------------------------------------
SUB ExtractingLabelNames()
    FOR LineNumber% = 1 to COUNT(50)
        b$=ITEM_READ$(50,LineNumber%)
        c$=ITEM_READ$(52,LineNumber%)
        IF INSTR(c$,"LABEL ")>0
            IF INSTR(c$,"LABEL ")=1 OR INSTR(c$," LABEL ")>0 OR INSTR(c$,":LABEL ")>0
                StartingLinePosition% = INSTR(c$,"LABEL ")+6
                LineLength%=LEN(b$)
                FirstCaracter% = 1
                Word$ = ""

                FOR j% = StartingLinePosition% TO LineLength%
                    Character$=MID$(b$,j%,1)
       
                    ' eliminating unauthorized characters
                    IF ASC(Character$)< 32 THEN EXIT_FOR
                    IF ASC(Character$)> 32 AND ASC(Character$)<44 THEN EXIT_FOR
                    IF ASC(Character$)> 44 AND ASC(Character$)<48 THEN EXIT_FOR
                    IF ASC(Character$)> 58 AND ASC(Character$)<65 THEN EXIT_FOR
                    IF ASC(Character$)> 90 AND ASC(Character$)<95 THEN EXIT_FOR
                    IF ASC(Character$)> 95 AND ASC(Character$)<97 THEN EXIT_FOR
                    IF ASC(Character$)> 122 THEN EXIT_FOR
 
                    ' removal of forbidden characters as first letter
                    IF FirstCaracter% = 1
                        IF ASC(Character$)=95 THEN EXIT_FOR
                        IF ASC(Character$)>47 AND ASC(Character$)<58 THEN EXIT_FOR
                    END_IF

                    IF ASC(Character$) = 58
                        Word$=Word$+":"
                        ITEM_ADD 51, Word$
                        Word$ = ""
                        EXIT_FOR
                    END_IF
                   
                    IF ASC(Character$)>47
                        FirstCaracter% = 0
                        Word$ = Word$ + Character$
                    END_IF

                    IF j% = LineLength% OR ASC(Character$) = 32 OR ASC(Character$) = 44
                        FirstCaracter% = 1
                        IF ASC(Word$) > 47
                            Word$=Word$+":"
                            ITEM_ADD 51, Word$
                            Word$ = ""
                        END_IF   
                    END_IF   
                NEXT j%
            END_IF   
        END_IF
    NEXT LineNumber%
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayLabel()
        IF INSTR(c$,"LABEL ")>0
            IF INSTR(c$,"LABEL ")=1 OR INSTR(c$," LABEL ")>0 OR INSTR(c$,":LABEL ")>0
                ITEM_ADD 21, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"GOSUB ")>0
            IF INSTR(c$,"GOSUB ")=1 OR INSTR(c$," GOSUB ")>0 OR INSTR(c$,":GOSUB ")>0
                ITEM_ADD 21, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine% = 0 and COUNT(51) > 0
            FOR i% = 1 to COUNT(51)
                Word$ = ITEM_READ$(51,i%)
                Word$=UPPER$(Word$)
                IF INSTR(c$,Word$)>0
                    j% = INSTR(c$,Word$)
                    IF INSTR(c$,Word$)=1
                        ITEM_ADD 21,""
                        ITEM_ADD 21, d$+" "+b$
                        AlreadyExistingLine% = 1
                    END_IF
                    IF J%>1
                        IF MID$(b$,1,j%-1)= CHR$(32)
                            ITEM_ADD 21,""
                            ITEM_ADD 21, d$+" "+b$
                            AlreadyExistingLine% = 1
                        END_IF   
                    END_IF   
                END_IF   
            NEXT i%
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"RETURN")>0
            IF INSTR(c$,"RETURN ")=1 OR INSTR(c$," RETURN ")>0 OR INSTR(c$,":RETURN ")>0 OR INSTR(c$," RETURN") = (LineLength%-6)OR INSTR(c$,":RETURN") = (LineLength%-6)
                ITEM_ADD 21, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF     
END_SUB
' ------------------------------------------------------------------------------
SUB DisplaySub()
        IF INSTR(c$,"SUB ")>0
            IF INSTR(c$,"SUB ")=1 OR INSTR(c$," SUB ")>0 OR INSTR(c$,":SUB ")>0
                ITEM_ADD 22, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_SUB")>0
            IF INSTR(c$,"EXIT_SUB")=1 OR INSTR(c$," EXIT_SUB")>0 OR INSTR(c$,":EXIT_SUB")>0
                ITEM_ADD 22, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_SUB")>0
            IF INSTR(c$,"END_SUB")=1 OR INSTR(c$," END_SUB")>0 OR INSTR(c$,":END_SUB")>0
                ITEM_ADD 22, d$+" "+b$
                ITEM_ADD 22, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayIf()
        IF INSTR(c$,"IF ")>0 
            IF INSTR(c$,"IF ")=1 OR INSTR(c$," IF ")>0 OR INSTR(c$,":IF ")>0
                ITEM_ADD 23, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        z$=" THEN "
        IF AlreadyExistingLine%=0
            IF INSTR(c$,z$)>0
                ITEM_ADD 23, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"ELSE")>0
            IF INSTR(c$,"ELSE")=1 OR INSTR(c$," ELSE ")>0 OR INSTR(c$,":ELSE:")>0 OR INSTR(c$,":ELSE :")>0 OR INSTR(c$,": ELSE:")>0 OR INSTR(c$," ELSE") = (LineLength%-4)
                ITEM_ADD 23, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_IF")>0
            IF INSTR(c$,"END_IF")=1 OR INSTR(c$," END_IF")>0 OR INSTR(c$,":END_IF")>0
                ITEM_ADD 23, d$+" "+b$
                ITEM_ADD 23, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayDim()
        IF INSTR(c$,"DIM ")>0
            IF INSTR(c$,"DIM ")=1 OR INSTR(c$," DIM ")>0 OR INSTR(c$,":DIM ")>0
                ITEM_ADD 24, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF INSTR(c$,"LOCAL_DIM ")>0
            IF INSTR(c$,"LOCAL_DIM ")=1 OR INSTR(c$," LOCAL_DIM ")>0 OR INSTR(c$,":LOCAL_DIM ")>0
                ITEM_ADD 24, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayFor()
        IF INSTR(c$,"FOR ")>0
            IF INSTR(c$,"FOR ")=1 OR INSTR(c$," FOR ")>0 OR INSTR(c$,":FOR ")>0
                ITEM_ADD 25, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$," TO ")>0 THEN ITEM_ADD 25, d$+" "+b$ : AlreadyExistingLine%=1
        IF AlreadyExistingLine%=0 AND INSTR(c$," STEP ")>0 THEN ITEM_ADD 25, d$+" "+b$ : AlreadyExistingLine%=1
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_FOR")>0
            IF INSTR(c$,"EXIT_FOR")=1 OR INSTR(c$," EXIT_FOR")>0 OR INSTR(c$,":EXIT_FOR")>0
                ITEM_ADD 25, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"NEXT ")>0
            IF INSTR(c$,"NEXT ")=1 OR INSTR(c$," NEXT ")>0 OR INSTR(c$,":NEXT ")>0
                ITEM_ADD 25, d$+" "+b$
                ITEM_ADD 25,""
                AlreadyExistingLine%=1
            END_IF
        END_IF   
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayWhile()
        IF INSTR(c$,"WHILE ")>0
            IF INSTR(c$,"WHILE ")=1 OR INSTR(c$," WHILE ")>0 OR INSTR(c$,":WHILE ")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF INSTR(c$,"REPEAT ")>0
            IF INSTR(c$,"REPEAT ")=1 OR INSTR(c$," REPEAT ")>0 OR INSTR(c$,":REPEAT ")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_WHILE")>0
            IF INSTR(c$,"EXIT_WHILE")=1 OR INSTR(c$," EXIT_WHILE")>0 OR INSTR(c$,":EXIT_WHILE")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_REPEAT")>0
            IF INSTR(c$,"EXIT_REPEAT")=1 OR INSTR(c$," EXIT_REPEAT")>0 OR INSTR(c$,":EXIT_REPEAT")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_WHILE")>0
            IF INSTR(c$,"END_WHILE")=1 OR INSTR(c$," END_WHILE")>0 OR INSTR(c$,":END_WHILE")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"UNTIL")>0
            IF INSTR(c$,"UNTIL")=1 OR INSTR(c$," UNTIL")>0 OR INSTR(c$,":UNTIL")>0
                ITEM_ADD 26, d$+" "+b$
                ITEM_ADD 26, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplaySelect()
        IF INSTR(c$,"SELECT ")>0
            IF INSTR(c$,"SELECT ")=1 OR INSTR(c$," SELECT ")>0 OR INSTR(c$,":SELECT ")>0
                ITEM_ADD 27, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF INSTR(c$,"CASE ")>0
            IF INSTR(c$,"CASE ")=1 OR INSTR(c$," CASE ")>0 OR INSTR(c$,":CASE ")>0
                ITEM_ADD 27, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_SELECT")>0
            IF INSTR(c$,"END_SELECT")=1 OR INSTR(c$," END_SELECT")>0 OR INSTR(c$,":END_SELECT")>0
                ITEM_ADD 27, d$+" "+b$
                ITEM_ADD 27, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
Integral:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 20
    MemoInUse% = 20
RETURN
' ------------------------------------------------------------------------------
AllLabel:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 21
    MemoInUse% = 21
RETURN
' ------------------------------------------------------------------------------
AllSub:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 22
    MemoInUse% = 22
RETURN
' ------------------------------------------------------------------------------
AllIf:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 23
    MemoInUse% = 23
RETURN
' ------------------------------------------------------------------------------
AllDim:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 24
    MemoInUse% = 24
RETURN
' ------------------------------------------------------------------------------
AllForNext:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 25
    MemoInUse% = 25
RETURN
' ------------------------------------------------------------------------------
AllWhile:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 26
    MemoInUse% = 26
RETURN
' ------------------------------------------------------------------------------
AllSelect:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 27
    MemoInUse% = 27
RETURN
' ------------------------------------------------------------------------------
About:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 28
    MemoInUse% = 28
RETURN
' ------------------------------------------------------------------------------
Resize:
    FOR i% = 20 TO 28
        WIDTH i%, (WIDTH(0)-100)
        HEIGHT i%, (HEIGHT(0)-60)
    NEXT i%
RETURN
' ------------------------------------------------------------------------------
Bigger:
    FontSize%=FontSize% + 1
    IF FontSize% > 16 THEN FontSize% = 16 : RETURN
    FOR i% = 20 TO 28
        FONT_SIZE i%, FontSize%
    NEXT i%
    HIDE MemoInUse% : SHOW MemoInUse%
RETURN
' ------------------------------------------------------------------------------
Smaller:
    FontSize%=FontSize% - 1
    IF FontSize% < 8 THEN FontSize% = 8 : RETURN
    FOR i% = 20 TO 28
        FONT_SIZE i%, FontSize%
    NEXT i%
    HIDE MemoInUse% : SHOW MemoInUse%
RETURN
' ------------------------------------------------------------------------------
SUB Mask()
    WIDTH 0, 1000
        HEIGHT 0, 710
        LEFT 0,(SCREEN_X-WIDTH(0))/2
        TOP 0,(SCREEN_Y-HEIGHT(0))/2
    BUTTON 1
        LEFT 1,10
        TOP 1,10
        CAPTION 1, "&Open"
    BUTTON 2
        LEFT 2,10
        TOP 2, 634
        CAPTION 2, "&Quit"
    BUTTON 3
        LEFT 3,10
        TOP 3, 594
        CAPTION 3, "&About"
    CREATE_HIDE
    BUTTON 4
        LEFT 4,10
        TOP 4, 554
        CAPTION 4, "&Bigger"
    BUTTON 5
        LEFT 5,10
        TOP 5,514   
        CAPTION 5, "S&maller" 
    FOR i% = 6 to 13
        BUTTON i%
        LEFT i%, 10
        TOP i%, i%*40-120
    NEXT i%
    for i% = 1 to 13 : font_bold i% : next i%
    CAPTION 6, "&Integral"
    CAPTION 7, "&LABEL"
    HINT 7, "Label, Gosub, Return"
    CAPTION 8, "&SUB"
    HINT 8, "Sub, Exit_Sub, End_sub"
    CAPTION 9, "I&F"
    HINT 9, "If, Then, Else, End_if"
    CAPTION 10, "&DIM"
    HINT 10, "Dim, Local_Dim"
    CAPTION 11, "FO&R"
    Hint 11, "For, To, Step, Exit_For, Next"
    CAPTION 12, "&WHILE"
    Hint 12, "While, Exit_While, End_While, Repeat, Exit_Repeat, Until" 
    CAPTION 13, "SELEC&T"
    Hint 13, "Select, Case, End_Select" 
    FOR i%= 20 TO 28
        LIST i%
        LEFT i%, 100
        TOP i%,10
        WIDTH i%, 870
        HEIGHT i%, 650
        FONT_NAME i%,"Courier New"
        FONT_SIZE i%,10
    NEXT i%
    SHOW 20
    TextAbout()
    MessageBox()
END_SUB
' ------------------------------------------------------------------------------
SUB MessageBox()
    PANEL 100
        WIDTH 100,300
        HEIGHT 100,200
        FONT_NAME 100,"Arial"
        FONT_SIZE 100,14
    COMMAND_TARGET_IS 100
    ALPHA 101
        TOP 101, 60
        LEFT 101, 100
        CAPTION 101, "Please wait"
    ALPHA 102
        TOP 102, 110
        LEFT 102, 60
        CAPTION 102, "Analysis in progress..."
    COMMAND_TARGET_IS 0
    SHOW 101
    SHOW 102
END_SUB
' ------------------------------------------------------------------------------
SUB WaitingMessage()
    TOP 100, (HEIGHT_CLIENT(0)-200)/2
    LEFT 100, (WIDTH_CLIENT(0)-300)/2
    SHOW 100
END_SUB
' ------------------------------------------------------------------------------
SUB TextAbout()
    ITEM_ADD 28,""
    b$="                      PANORAMIC FILE ANALYSER"
    ITEM_ADD 28, b$
    b$="          MARC37 - November 2017 - Panoramic v0.9.28.i12"
    ITEM_ADD 28, b$
    b$="  http://panoramic-language.pagesperso-orange.fr/French/index.html"
    ITEM_ADD 28, b$
    b$="                http://panoramic.top-forum.net"
    ITEM_ADD 28, b$
END_SUB
' ------------------------------------------------------------------------------
Quit:
    TERMINATE
RETURN


EDIT : Mise à jour du code, ajout des structures SELECT / CASE / END_SELECT.

2ème EDIT : Mise à jour du code, sur une idée de Papydall, amélioration des boutons de sélection.


Dernière édition par Marc 37 le Lun 13 Nov 2017 - 17:11, édité 3 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 3:23

Intéressant, ton utilitaire ! Je vais le tester sur un source un peu plus vaste. sur un petot source, il donne des résultats clairs et utiles.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Jean Claude

avatar

Nombre de messages : 5062
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 11:51

Bravo Marc37,

Je viens à l'instant de tester sur un code de 2200 lignes.

C'est génial, on a les départs de boucle et les fins de boucle et aussi les sorties de boucle. Et c'est idem pour les sous-programmes de type LABEL ou SUB.

Voilà qui peut aider au débogage d'un code ! cheers

Je me garde cet utilitaire sous le coude.

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 15:16

Merci Klaus et Jean-Claude pour vos réponses !

J'ai modifié mon premier post pour mettre à jour le code :

J'ai ajouté les structures SELECT / CASE / END_SELECT.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5062
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 15:43

Citation :
J'ai ajouté les structures SELECT / CASE / END_SELECT.
Papydall va être ravis ! Very Happy

Personnellement et pour te récompenser de ton partage , voici ce que j'ai maintenant sur mon bureau:


J'ajoute que grâce à ton "Analyser de structure de code" on voit bien l'utilité de faire une indentation dans nos codes.

Pour ceux qui veulent en savoir plus sur l'identation => https://fr.wikipedia.org/wiki/Style_d%27indentation

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
papydall

avatar

Nombre de messages : 5594
Age : 67
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 17:39

Bonjour tout le monde.
Hello Marc thirty-seven.

Klaus a qualifié d’intéressant ton utilitaire ; Jean-Claude a pressenti que papydall va être ravis.
Hé bien, je suis ravi  ( mais sans ESSE !)
Et en tant que tel, je me suis permis d’apporter une légère touche « papydallienne » à ce très bon code.
Rien d’extraordinaire, mais peut-être qu’un Jean-Claude ou un Klauss apprécieront.
1) L’affichage des boutons est en gras (quelle trouvaille !)
2) Le choix se fait soit avec la souris, soit en tapant au clavier le caractère souligné (ça c’est plutôt intéressant).


ça donne ceci:
 

Et voici ma modification : ça concerne la procédure SUB Mask()

Code:

SUB Mask()
    WIDTH 0, 1000
        HEIGHT 0, 710
        LEFT 0,(SCREEN_X-WIDTH(0))/2
        TOP 0,(SCREEN_Y-HEIGHT(0))/2
    BUTTON 1
        LEFT 1,10
        TOP 1,10
        CAPTION 1, "&Open"
    BUTTON 2
        LEFT 2,10
        TOP 2, 634
        CAPTION 2, "&Quit"
    BUTTON 3
        LEFT 3,10
        TOP 3, 594
        CAPTION 3, "&About"
    CREATE_HIDE
    BUTTON 4
        LEFT 4,10
        TOP 4, 554
        CAPTION 4, "&Bigger"
    BUTTON 5
        LEFT 5,10
        TOP 5,514    
        CAPTION 5, "S&maller"  
    FOR i% = 6 to 13
        BUTTON i%
        LEFT i%, 10
        TOP i%, i%*40-120
    NEXT i%
    for i% = 1 to 13 : font_bold i% : next i%
    CAPTION 6, "&Integral"
    CAPTION 7, "&LABEL"
    HINT 7, "Label, Gosub, Return"
    CAPTION 8, "&SUB"
    HINT 8, "Sub, Exit_Sub, End_sub"
    CAPTION 9, "I&F"
    HINT 9, "If, Then, Else, End_if"
    CAPTION 10, "&DIM"
    HINT 10, "Dim, Local_Dim"
    CAPTION 11, "FO&R"
    Hint 11, "For, To, Step, Exit_For, Next"
    CAPTION 12, "&WHILE"
    Hint 12, "While, Exit_While, End_While, Repeat, Exit_Repeat, Until"  
    CAPTION 13, "SELEC&T"
    Hint 13, "Select, Case, End_Select"  
    FOR i%= 20 TO 28
        LIST i%
        LEFT i%, 100
        TOP i%,10
        WIDTH i%, 870
        HEIGHT i%, 650
        FONT_NAME i%,"Courier New"
        FONT_SIZE i%,10
    NEXT i%
    SHOW 20
    TextAbout()
    MessageBox()
END_SUB

Libre à toi de prendre ou de jeter à la corbeille tongue
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://papydall-panoramic.forumarabia.com/
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 18:37

Bonjour à tous !

Bonjour Papydall !

Le & sur un caption est une astuce que je ne connaissais pas.

C'est bien pratique et très professionnel : mise en gras + soulignement de la lettre choisie et création automatique d'un raccourci clavier, et tout ça, juste avec un petit & savamment placé !

Je prends, j'adopte !

Le code source du premier post et mon Webdav sont mis à jour !

Mercissssss (avec plein de ESSES) Papydall !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



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

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 19:44

Bravo Marc, très utile !

On avait fait un truc similaire autrefois (en 2010, ça ne nous rajeunit pas !) avec l'ami Nardo et la participation active de jjn4 :
http://panoramic.free-boards.net/t1195-analyse-d-un-programme-source-bas?highlight=analyse+code
c'est assez amusant (mais long!) à relire...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Minibug

avatar

Nombre de messages : 2364
Age : 51
Localisation : Vienne (86)
Date d'inscription : 10/02/2012

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 19:59

Salut Marc !

Super ton code. Je viens de tester...
J'avais déjà utilisé un programme en peu similaire, mais je sais plus qui en était l'auteur...

En coup cas Bravo !  cheers

Edit : j'avais pas remarqué la réponse de JL35 juste au dessus. Et bien voilà la réponse !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://gpp.panoramic.free.fr
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 20:09

Bonsoir à tous !

Merci JL35 et Minibug !

Désolé JL35, je ne savais pas que tu avais déjà fait un tel programme.

Je vais le regarder de ce pas.

Bonne continuation à tous !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



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

MessageSujet: Re: Analyser un code Panoramic   Dim 12 Nov 2017 - 21:17

C'est vrai qu'il est perdu dans les limbes (2010), et pas à jour des nouveaux mots-clés.
Mais c'est toujours intéressant et instructif de voir le code des autres, et le tien doit être plus 'moderne' que le mien ! Donc aucun problème, programmons, programmons, il en reste toujours quelque chose.
Et bon courage pour ta lecture ! Very Happy
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 0:52

Ce programme me semble excellent, et je le place également sur mon bureau, pour accès facile.

Néanmoins, je me permets une petite remarque. Ce programme présente un problème similaire à celui de Panoramic_Editor, dans l'analyse du texte pour identifier les mots-clé. C'est valable pour des mots comme THEN ou ELSE, mais également pour tous les autres mots-clé intéressant le programme. En fait, ces mots-clé sont "reconnus" même s'ils sont dans une chaîne de caractères entre guillemets. Il suffit d'ouvrir le source de ce même programme et de regarder n'importe quel bouton de sélection, piur voir ce queje veux dire.

Le fin du fin, ce serait d'ignorer ces mots-clé s'ils sont entourés de guillemets...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 5:43

Suite à la pertinente remarque de Klaus, j'ai ajouté un "filtre" pour ne plus prendre en compte les mots entourés par des guillemets ainsi que ceux dans les REM.

Je viens de le tester sur plusieurs sources, le filtre semble efficace.

Code:
' ------------------------------------------------------------------------------
'  PANORAMIC FILE ANALYSER
'  MARC37 - November 2017 - Panoramic v0.9.28.i12
'  http://panoramic-language.pagesperso-orange.fr/French/index.html
'  http://panoramic.top-forum.net
' ------------------------------------------------------------------------------
DIM Debug%
Debug% = 0

DIM a$ : ' basic file name to analyze
DIM b$ : ' Reading a line of a$
DIM c$ : ' uppercase of b$
DIM d$ : ' formatted line number as ######
DIM AlreadyExistingLine%
DIM i%, j% : ' variable loop FOR/NEXT
DIM LineLength%
DIM LineNumber%, FontSize%, MemoInUse%
DIM StartingLinePosition%
DIM FirstCaracter%
DIM Character$
DIM Word$
DIM Line$
DIM z$
LABEL Resize, OpenFile, Bigger, Smaller, About, Quit
LABEL Integral, AllLabel, AllSub, AllIf, AllDim, AllForNext, AllWhile, AllSelect
FontSize% = 10
DLIST 50 : ' hidden object => source code to analyze

IF DEBUG% = 1
    FORM 998
    HEIGHT 998, 800
    WIDTH 998, 550
    Command_target_is 998
    LIST 51 : ' hidden object => list of LABEL
    HEIGHT 51, 750
    WIDTH 51, 500
    FONT_NAME 51,"Courier New"
    FONT_SIZE 51,10
    command_target_is 0
    FORM 999
    HEIGHT 999, 800
    WIDTH 999, 550
    TOP 999, 50
    LEFT 999, 50
    Command_target_is 999
    LIST 52 : ' hidden object => Source code without " "
    HEIGHT 52, 750
    WIDTH 52, 500
    FONT_NAME 52,"Courier New"
    FONT_SIZE 52,10
    command_target_is 0
ELSE
    DLIST 51 : ' hidden object => list of LABEL
    DLIST 52 : ' hidden object => Source code without " "
END_IF

Mask()
ON_CLOSE 0, Quit
ON_RESIZE 0, Resize
ON_CLICK 1, OpenFile
ON_CLICK 2, Quit
ON_CLICK 3, About
ON_CLICK 4, Bigger
ON_CLICK 5, Smaller
ON_CLICK 6, Integral
ON_CLICK 7, AllLabel
ON_CLICK 8, AllSub
ON_CLICK 9, AllIf
ON_CLICK 10, AllDim
ON_CLICK 11, AllForNext
ON_CLICK 12, ALLWhile
ON_CLICK 13, AllSelect
END
' ------------------------------------------------------------------------------
OpenFile:
    IF OBJECT_EXISTS(30)=0 THEN OPEN_DIALOG 30
    FILTER 30,"*.bas|*.bas"
    a$=FILE_NAME$(30)
    IF a$="_" THEN RETURN
    CLEAR 50
    CLEAR 51
    CLEAR 52
    FOR i% = 20 TO 27
        CLEAR i%
    NEXT i%   
    FOR i% = 4 TO 13
        HIDE i%
    NEXT i%
    OFF_RESIZE 0
    OFF_CLICK 1
    LineNumber% = 1
    FOR i% = 21 to 28
        HIDE i%
    NEXT i%
    SHOW 20
    waitingMessage()
    FILE_OPEN_READ 30,a$
    CAPTION 0, a$
    WHILE FILE_EOF(30)<>1
        FILE_READLN 30,b$
        d$=STR$(LineNumber%)
        WHILE LEN(d$)<6
            d$=" "+d$
        END_WHILE
        c$=UPPER$(b$)
        QuoteFilter()
        ITEM_ADD 50, b$
        ITEM_ADD 20, d$+" "+b$
        LineNumber% = LineNumber% + 1
    END_WHILE
    FILE_CLOSE 30
    Analysis()
    HIDE 100
RETURN
' ------------------------------------------------------------------------------
SUB QuoteFilter()
    DIM_LOCAL SingleQuote%
    DIM_LOCAL DoubleQuote%
    LineLength% = LEN(c$)
    IF LineLength% = 0
        ITEM_ADD 52,""
        EXIT_SUB
    END_IF
    IF INSTR(c$,"REM ")>0
        IF INSTR(c$,"REM ")=1 OR INSTR(c$," REM ")>0 OR INSTR(c$,":REM ")>0
            c$= LEFT$(b$,INSTR(c$,"REM"))
            ITEM_ADD 52, c$
            EXIT_SUB
        END_IF   
    END_IF
    IF LineLength% > 0
        SingleQuote% = 0
        DoubleQuote% = 0
        Line$=""
        FOR i% = 1 to LineLength%
            Character$=MID$(c$,i%,1)
            IF Character$ = CHR$(39) AND DoubleQuote% = 0
                ITEM_ADD 52, Line$
                EXIT_SUB
            END_IF
            IF Character$ = CHR$(34) THEN DoubleQuote% = DoubleQuote% + 1
            IF DoubleQuote% = 1 THEN Character$ = "x"
            IF DoubleQuote% = 2 THEN DoubleQuote% = 0   
            Line$ = Line$ + Character$
        NEXT i%
        ITEM_ADD 52, Line$
    END_IF   
END_SUB
' ------------------------------------------------------------------------------
SUB Analysis()
    ExtractingLabelNames()
    FOR LineNumber% = 1 to COUNT(50)
        AlreadyExistingLine% = 0
        b$=ITEM_READ$(50,LineNumber%)
        c$=ITEM_READ$(52,LineNumber%)
        LineLength% = LEN(c$)
        d$=STR$(LineNumber%)
        WHILE LEN(d$)<6
            d$=" "+d$
        END_WHILE
        DisplayLabel()
        DisplaySub()
        DisplayIf()
        DisplayDim()
        DisplayFor()
        DisplayWhile()
        DisplaySelect()
    NEXT LineNumber%
    FOR i% = 4 TO 13
        SHOW i%
    NEXT i%
    ON_RESIZE 0, Resize
    ON_CLICK 1, OpenFile
END_SUB
' ------------------------------------------------------------------------------
SUB ExtractingLabelNames()
    FOR LineNumber% = 1 to COUNT(50)
        b$=ITEM_READ$(50,LineNumber%)
        c$=ITEM_READ$(52,LineNumber%)
        IF INSTR(c$,"LABEL ")>0
            IF INSTR(c$,"LABEL ")=1 OR INSTR(c$," LABEL ")>0 OR INSTR(c$,":LABEL ")>0
                StartingLinePosition% = INSTR(c$,"LABEL ")+6
                LineLength%=LEN(b$)
                FirstCaracter% = 1
                Word$ = ""

                FOR j% = StartingLinePosition% TO LineLength%
                    Character$=MID$(b$,j%,1)
       
                    ' eliminating unauthorized characters
                    IF ASC(Character$)< 32 THEN EXIT_FOR
                    IF ASC(Character$)> 32 AND ASC(Character$)<44 THEN EXIT_FOR
                    IF ASC(Character$)> 44 AND ASC(Character$)<48 THEN EXIT_FOR
                    IF ASC(Character$)> 58 AND ASC(Character$)<65 THEN EXIT_FOR
                    IF ASC(Character$)> 90 AND ASC(Character$)<95 THEN EXIT_FOR
                    IF ASC(Character$)> 95 AND ASC(Character$)<97 THEN EXIT_FOR
                    IF ASC(Character$)> 122 THEN EXIT_FOR
 
                    ' removal of forbidden characters as first letter
                    IF FirstCaracter% = 1
                        IF ASC(Character$)=95 THEN EXIT_FOR
                        IF ASC(Character$)>47 AND ASC(Character$)<58 THEN EXIT_FOR
                    END_IF

                    IF ASC(Character$) = 58
                        Word$=Word$+":"
                        ITEM_ADD 51, Word$
                        Word$ = ""
                        EXIT_FOR
                    END_IF
                   
                    IF ASC(Character$)>47
                        FirstCaracter% = 0
                        Word$ = Word$ + Character$
                    END_IF

                    IF j% = LineLength% OR ASC(Character$) = 32 OR ASC(Character$) = 44
                        FirstCaracter% = 1
                        IF ASC(Word$) > 47
                            Word$=Word$+":"
                            ITEM_ADD 51, Word$
                            Word$ = ""
                        END_IF   
                    END_IF   
                NEXT j%
            END_IF   
        END_IF
    NEXT LineNumber%
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayLabel()
        IF INSTR(c$,"LABEL ")>0
            IF INSTR(c$,"LABEL ")=1 OR INSTR(c$," LABEL ")>0 OR INSTR(c$,":LABEL ")>0
                ITEM_ADD 21, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"GOSUB ")>0
            IF INSTR(c$,"GOSUB ")=1 OR INSTR(c$," GOSUB ")>0 OR INSTR(c$,":GOSUB ")>0
                ITEM_ADD 21, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine% = 0 and COUNT(51) > 0
            FOR i% = 1 to COUNT(51)
                Word$ = ITEM_READ$(51,i%)
                Word$=UPPER$(Word$)
                IF INSTR(c$,Word$)>0
                    j% = INSTR(c$,Word$)
                    IF INSTR(c$,Word$)=1
                        ITEM_ADD 21,""
                        ITEM_ADD 21, d$+" "+b$
                        AlreadyExistingLine% = 1
                    END_IF
                    IF J%>1
                        IF MID$(b$,1,j%-1)= CHR$(32)
                            ITEM_ADD 21,""
                            ITEM_ADD 21, d$+" "+b$
                            AlreadyExistingLine% = 1
                        END_IF   
                    END_IF   
                END_IF   
            NEXT i%
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"RETURN")>0
            IF INSTR(c$,"RETURN ")=1 OR INSTR(c$," RETURN ")>0 OR INSTR(c$,":RETURN ")>0 OR INSTR(c$," RETURN") = (LineLength%-6)OR INSTR(c$,":RETURN") = (LineLength%-6)
                ITEM_ADD 21, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF     
END_SUB
' ------------------------------------------------------------------------------
SUB DisplaySub()
        IF INSTR(c$,"SUB ")>0
            IF INSTR(c$,"SUB ")=1 OR INSTR(c$," SUB ")>0 OR INSTR(c$,":SUB ")>0
                ITEM_ADD 22, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_SUB")>0
            IF INSTR(c$,"EXIT_SUB")=1 OR INSTR(c$," EXIT_SUB")>0 OR INSTR(c$,":EXIT_SUB")>0
                ITEM_ADD 22, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_SUB")>0
            IF INSTR(c$,"END_SUB")=1 OR INSTR(c$," END_SUB")>0 OR INSTR(c$,":END_SUB")>0
                ITEM_ADD 22, d$+" "+b$
                ITEM_ADD 22, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayIf()
        IF INSTR(c$,"IF ")>0 
            IF INSTR(c$,"IF ")=1 OR INSTR(c$," IF ")>0 OR INSTR(c$,":IF ")>0
                ITEM_ADD 23, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        z$=" THEN "
        IF AlreadyExistingLine%=0
            IF INSTR(c$,z$)>0
                ITEM_ADD 23, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"ELSE")>0
            IF INSTR(c$,"ELSE")=1 OR INSTR(c$," ELSE ")>0 OR INSTR(c$,":ELSE:")>0 OR INSTR(c$,":ELSE :")>0 OR INSTR(c$,": ELSE:")>0 OR INSTR(c$," ELSE") = (LineLength%-4)
                ITEM_ADD 23, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_IF")>0
            IF INSTR(c$,"END_IF")=1 OR INSTR(c$," END_IF")>0 OR INSTR(c$,":END_IF")>0
                ITEM_ADD 23, d$+" "+b$
                ITEM_ADD 23, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayDim()
        IF INSTR(c$,"DIM ")>0
            IF INSTR(c$,"DIM ")=1 OR INSTR(c$," DIM ")>0 OR INSTR(c$,":DIM ")>0
                ITEM_ADD 24, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF INSTR(c$,"LOCAL_DIM ")>0
            IF INSTR(c$,"LOCAL_DIM ")=1 OR INSTR(c$," LOCAL_DIM ")>0 OR INSTR(c$,":LOCAL_DIM ")>0
                ITEM_ADD 24, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayFor()
        IF INSTR(c$,"FOR ")>0
            IF INSTR(c$,"FOR ")=1 OR INSTR(c$," FOR ")>0 OR INSTR(c$,":FOR ")>0
                ITEM_ADD 25, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$," TO ")>0 THEN ITEM_ADD 25, d$+" "+b$ : AlreadyExistingLine%=1
        IF AlreadyExistingLine%=0 AND INSTR(c$," STEP ")>0 THEN ITEM_ADD 25, d$+" "+b$ : AlreadyExistingLine%=1
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_FOR")>0
            IF INSTR(c$,"EXIT_FOR")=1 OR INSTR(c$," EXIT_FOR")>0 OR INSTR(c$,":EXIT_FOR")>0
                ITEM_ADD 25, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"NEXT ")>0
            IF INSTR(c$,"NEXT ")=1 OR INSTR(c$," NEXT ")>0 OR INSTR(c$,":NEXT ")>0
                ITEM_ADD 25, d$+" "+b$
                ITEM_ADD 25,""
                AlreadyExistingLine%=1
            END_IF
        END_IF   
END_SUB
' ------------------------------------------------------------------------------
SUB DisplayWhile()
        IF INSTR(c$,"WHILE ")>0
            IF INSTR(c$,"WHILE ")=1 OR INSTR(c$," WHILE ")>0 OR INSTR(c$,":WHILE ")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF INSTR(c$,"REPEAT ")>0
            IF INSTR(c$,"REPEAT ")=1 OR INSTR(c$," REPEAT ")>0 OR INSTR(c$,":REPEAT ")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_WHILE")>0
            IF INSTR(c$,"EXIT_WHILE")=1 OR INSTR(c$," EXIT_WHILE")>0 OR INSTR(c$,":EXIT_WHILE")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"EXIT_REPEAT")>0
            IF INSTR(c$,"EXIT_REPEAT")=1 OR INSTR(c$," EXIT_REPEAT")>0 OR INSTR(c$,":EXIT_REPEAT")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_WHILE")>0
            IF INSTR(c$,"END_WHILE")=1 OR INSTR(c$," END_WHILE")>0 OR INSTR(c$,":END_WHILE")>0
                ITEM_ADD 26, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"UNTIL")>0
            IF INSTR(c$,"UNTIL")=1 OR INSTR(c$," UNTIL")>0 OR INSTR(c$,":UNTIL")>0
                ITEM_ADD 26, d$+" "+b$
                ITEM_ADD 26, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
SUB DisplaySelect()
        IF INSTR(c$,"SELECT ")>0
            IF INSTR(c$,"SELECT ")=1 OR INSTR(c$," SELECT ")>0 OR INSTR(c$,":SELECT ")>0
                ITEM_ADD 27, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF INSTR(c$,"CASE ")>0
            IF INSTR(c$,"CASE ")=1 OR INSTR(c$," CASE ")>0 OR INSTR(c$,":CASE ")>0
                ITEM_ADD 27, d$+" "+b$
                AlreadyExistingLine%=1
            END_IF   
        END_IF
        IF AlreadyExistingLine%=0 AND INSTR(c$,"END_SELECT")>0
            IF INSTR(c$,"END_SELECT")=1 OR INSTR(c$," END_SELECT")>0 OR INSTR(c$,":END_SELECT")>0
                ITEM_ADD 27, d$+" "+b$
                ITEM_ADD 27, ""
                AlreadyExistingLine%=1
            END_IF   
        END_IF
END_SUB
' ------------------------------------------------------------------------------
Integral:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 20
    MemoInUse% = 20
RETURN
' ------------------------------------------------------------------------------
AllLabel:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 21
    MemoInUse% = 21
RETURN
' ------------------------------------------------------------------------------
AllSub:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 22
    MemoInUse% = 22
RETURN
' ------------------------------------------------------------------------------
AllIf:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 23
    MemoInUse% = 23
RETURN
' ------------------------------------------------------------------------------
AllDim:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 24
    MemoInUse% = 24
RETURN
' ------------------------------------------------------------------------------
AllForNext:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 25
    MemoInUse% = 25
RETURN
' ------------------------------------------------------------------------------
AllWhile:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 26
    MemoInUse% = 26
RETURN
' ------------------------------------------------------------------------------
AllSelect:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 27
    MemoInUse% = 27
RETURN
' ------------------------------------------------------------------------------
About:
    FOR i%=20 TO 28
        HIDE i%
    NEXT i%
    SHOW 28
    MemoInUse% = 28
RETURN
' ------------------------------------------------------------------------------
Resize:
    FOR i% = 20 TO 28
        WIDTH i%, (WIDTH(0)-100)
        HEIGHT i%, (HEIGHT(0)-60)
    NEXT i%
RETURN
' ------------------------------------------------------------------------------
Bigger:
    FontSize%=FontSize% + 1
    IF FontSize% > 16 THEN FontSize% = 16 : RETURN
    FOR i% = 20 TO 28
        FONT_SIZE i%, FontSize%
    NEXT i%
    HIDE MemoInUse% : SHOW MemoInUse%
RETURN
' ------------------------------------------------------------------------------
Smaller:
    FontSize%=FontSize% - 1
    IF FontSize% < 8 THEN FontSize% = 8 : RETURN
    FOR i% = 20 TO 28
        FONT_SIZE i%, FontSize%
    NEXT i%
    HIDE MemoInUse% : SHOW MemoInUse%
RETURN
' ------------------------------------------------------------------------------
SUB Mask()
    WIDTH 0, 1000
        HEIGHT 0, 710
        LEFT 0,(SCREEN_X-WIDTH(0))/2
        TOP 0,(SCREEN_Y-HEIGHT(0))/2
    BUTTON 1
        LEFT 1,10
        TOP 1,10
        CAPTION 1, "&Open"
    BUTTON 2
        LEFT 2,10
        TOP 2, 634
        CAPTION 2, "&Quit"
    BUTTON 3
        LEFT 3,10
        TOP 3, 594
        CAPTION 3, "&About"
    CREATE_HIDE
    BUTTON 4
        LEFT 4,10
        TOP 4, 554
        CAPTION 4, "&Bigger"
    BUTTON 5
        LEFT 5,10
        TOP 5,514   
        CAPTION 5, "S&maller" 
    FOR i% = 6 to 13
        BUTTON i%
        LEFT i%, 10
        TOP i%, i%*40-120
    NEXT i%
    for i% = 1 to 13 : font_bold i% : next i%
    CAPTION 6, "&Integral"
    CAPTION 7, "&LABEL"
    HINT 7, "Label, Gosub, Return"
    CAPTION 8, "&SUB"
    HINT 8, "Sub, Exit_Sub, End_sub"
    CAPTION 9, "I&F"
    HINT 9, "If, Then, Else, End_if"
    CAPTION 10, "&DIM"
    HINT 10, "Dim, Local_Dim"
    CAPTION 11, "FO&R"
    Hint 11, "For, To, Step, Exit_For, Next"
    CAPTION 12, "&WHILE"
    Hint 12, "While, Exit_While, End_While, Repeat, Exit_Repeat, Until" 
    CAPTION 13, "SELEC&T"
    Hint 13, "Select, Case, End_Select" 
    FOR i%= 20 TO 28
        LIST i%
        LEFT i%, 100
        TOP i%,10
        WIDTH i%, 870
        HEIGHT i%, 650
        FONT_NAME i%,"Courier New"
        FONT_SIZE i%,10
    NEXT i%
    SHOW 20
    TextAbout()
    MessageBox()
END_SUB
' ------------------------------------------------------------------------------
SUB MessageBox()
    PANEL 100
        WIDTH 100,300
        HEIGHT 100,200
        FONT_NAME 100,"Arial"
        FONT_SIZE 100,14
    COMMAND_TARGET_IS 100
    ALPHA 101
        TOP 101, 60
        LEFT 101, 100
        CAPTION 101, "Please wait"
    ALPHA 102
        TOP 102, 110
        LEFT 102, 60
        CAPTION 102, "Analysis in progress..."
    COMMAND_TARGET_IS 0
    SHOW 101
    SHOW 102
END_SUB
' ------------------------------------------------------------------------------
SUB WaitingMessage()
    TOP 100, (HEIGHT_CLIENT(0)-200)/2
    LEFT 100, (WIDTH_CLIENT(0)-300)/2
    SHOW 100
END_SUB
' ------------------------------------------------------------------------------
SUB TextAbout()
    ITEM_ADD 28,""
    b$="                      PANORAMIC FILE ANALYSER"
    ITEM_ADD 28, b$
    b$="          MARC37 - November 2017 - Panoramic v0.9.28.i12"
    ITEM_ADD 28, b$
    b$="  http://panoramic-language.pagesperso-orange.fr/French/index.html"
    ITEM_ADD 28, b$
    b$="                http://panoramic.top-forum.net"
    ITEM_ADD 28, b$
END_SUB
' ------------------------------------------------------------------------------
Quit:
    TERMINATE
RETURN




Dernière édition par Marc 37 le Lun 13 Nov 2017 - 17:35, édité 2 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Pedro Alvarez

avatar

Nombre de messages : 863
Date d'inscription : 19/01/2014

MessageSujet: Analyser un code Panoramic.   Lun 13 Nov 2017 - 11:17

Bonjour.

Je suis en train de tester l'analyseur sur mon programme principal, qui comporte maintenant plus de 50.000 lignes.

La durée du test est rédhibitoire, elle dure plus d'une heure.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 12:39

@Pédro:
Citation :
La durée du test est rédhibitoire, elle dure plus d'une heure.
A côté de la durée de l'indexation du dictionnaire...

@Marc37:
Ca a l'air de fonctionner parfaitement. Le résultat est clair et facilement exploitable. Je garde. Merci !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
pascal10000

avatar

Nombre de messages : 549
Localisation : Troyes
Date d'inscription : 05/02/2011

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 13:25

merci Marc
cool ton p'tit programme
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 14:27

Bonjour à tous !

Merci à tous de vos retours.

@Pedro:
50000 lignes ! ! affraid
Un objet LIST peut-il contenir autant de lignes ?
Citation :
La durée du test est rédhibitoire, elle dure plus d'une heure.

Désolé Pedro ! je vais voir s'il est possible d'améliorer la structure du code pour réduire le temps d'analyse.
Tu peux inhiber les analyses que tu ne souhaites pas effectuer en mettant en REM certaines lignes de 161 à 167 :




@JL35
Je suis allé voir et lire toute l'évolution de ton programme de 2010. (je n'étais pas né, je suis arrivé en 2014  Very Happy )
Félicitations !
Effectivement, nous avons deux approches totalement différentes, avec à la fin, des résultats similaires. Mais j'avoue que le tien est bien plus complet.
Voilà qui me donne de nouvelles idées qui risquent de ralentir encore l’exécution de mon programme.... Je réfléchis...
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



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

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 14:51

Et moi j'avoue que le mien je ne m'en suis pas servi beaucoup, c'était surtout le plaisir de l'écrire !
Et c'est vrai aussi qu'il y a toujours des améliorations à apporter, c'est ce qui en fait le charme.
Comme disait Boileau:
Hâtez-vous lentement, et, sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage :
Polissez-le sans cesse et le repolissez ;
Ajoutez quelquefois, et souvent effacez. [...]


Je trouve que ça s'applique bien à la programmation Smile

Ceci dit ton programme est très bien fait et sera fort utile.
Une petite remarque personnelle: j'aurais peut-être ajouté les ELSE éventuels entre IF et END_IF ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Jean Claude

avatar

Nombre de messages : 5062
Age : 63
Localisation : 83 Var
Date d'inscription : 07/05/2009

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 15:07

Oui, je trouve aussi que cette citation est bien adaptée aux programmeurs. Very Happy

@Marc37,

Pour la question de durée de mise en place du programme, jusqu'à 5000 lignes je penses que c'est raisonnable de faire le test, au-delà c'est assez long. De plus il m'a semblé (mais je n'ai pas chronométré) que la SUB filter() a ralenti la mise en place.
D'ailleurs le nom de cette SUB me semble critique car c'est un mot-clé de Panoramic, et je pense que ça pourrait être un problème pour compiler le code avec le futur compilateur que Jack essai de concocter.

Pour en revenir à la question de durée de mise en place du programme, le compilateur sera la solution (je crois).

A+
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 15:38

Citation :
50000 lignes !
Un objet LIST peut-il contenir autant de lignes ?
Oui, sans problème. Le nombre de lignes dans un DLIST n'est virtuellement pas limité. Au besoin, Windows utilise la pagination pour charger les parties utiles en mémoire en laissant le reste dans le fichier swap, mais c'est totalement transparent pour l'utilisateur et toujours plus rapide que des lectures dans un fichier physique.

Citation :
Con D'ailleurs le nom de cette SUB me semble critique car c'est un mot-clé de Panoramic, et je pense que ça pourrait être un problème pour compiler le code avec le futur compilateur que Jack essai de concocter.
C'est une remarque judicieuse !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Pedro Alvarez

avatar

Nombre de messages : 863
Date d'inscription : 19/01/2014

MessageSujet: Analyser un code Panoramic.   Lun 13 Nov 2017 - 16:00

Bonjour.

@Marc37.

Loin de moi l'idée de critiquer ton travail.
Je voulais juste signaler la lenteur relative de l'exécution.

Bon courage pour la suite.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



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

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 16:12

@Marc,
Je disais plus haut que ce serait bien d'ajouter les ELSE dans les IF/END_IF, mais je vois que c'est déjà fait.
Malencontreusement j'essayais un programme où le ELSE n'est pas détecté, j'ai extrait la partie en cause:
Code:
WIDTH 0,100
END
' ==============================================================================
SUB Crop(f1$,f2$,x%,y%,w%,h%)
  ' Découper une zone x,y,w,h dans l'image f1$ (JPG ou BMP), sauvegarder
  ' dans f2$ (impérativement BMP), ou dans le clipboard si f2$ = "".
  DIM_LOCAL s2d%,p%,i%
  s2d% = NUMBER_2D_TARGET: ' save
  p%=1000: WHILE OBJECT_EXISTS(p%)=1: p%=p%+1: END_WHILE
  i%=p%+1: WHILE OBJECT_EXISTS(i%)=1: i%=i%+1: END_WHILE
  PICTURE p%: HIDE p%: IMAGE i%
  FILE_LOAD p%,f1$: 2D_TARGET_IS p%: 2D_IMAGE_COPY i%,x%,y%,x%+w%-1,y%+h%-1
  WIDTH p%,w%-1: HEIGHT p%,h%-1
  2D_IMAGE_PASTE i%,0,0
  IF f2$<>""
      FILE_SAVE p%,f2$: ' résultat dans un fichier bmp
  ELSE
      CLIPBOARD_COPY p%: ' résultat dans le clipboard
  END_IF
  2D_TARGET_IS s2d%: ' restore
  DELETE i%: DELETE p%
END_SUB
le ELSE de la ligne 17 n'est pas détecté.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 17:09

Merci JL35 !
Bien vu !
Le code est rectifié ! Il manquait une condition qui est passée à travers tous mes tests.
J'espère qu'il n'y en pas d'autres...
Je recommence quand même une batterie de tests...

@Pedro
Pas de problème Pedro, je ne l'ai pas pris comme un reproche.
Au contraire, c'est une remarque utile qui me pousse à essayer d'optimiser mon code.

@Jean-Claude
Bien vu et très bonne remarque. C'est rectifié : Filter() est devenu QuoteFilter()
Merci !

@Klaus
Merci pour l'explication technique de l'espace mémoire.

A tous : Donc allons-y ! Codons ! Il y a plein de place dans la mémoire !
Et encore MERCI pour tous vos retours !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

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

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 17:33

La nouvelle version n'est pas encore en ligne, non ?
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Marc



Nombre de messages : 515
Localisation : TOURS
Date d'inscription : 18/03/2014

MessageSujet: Re: Analyser un code Panoramic   Lun 13 Nov 2017 - 17:34

@Klaus
Si, en principe tout est à jour, Webdav compris. Je vérifie de suite.

EDIT : mon webdav est bien à jour, le premier post aussi, mais le post de cette nuit à 3h43 n'y était pas. C'est fait ! Merci Klaus !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Analyser un code Panoramic   

Revenir en haut Aller en bas
 
Analyser un code Panoramic
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» RESOLU : petit code à tester, trouver l'erreur^^
» code pour inséré les anime (Fond transparent)
» manuel de code e-anim
» J'ai 2 code pour avoir 6 razoirs Shick Induition DÉJÀ DONNÉ
» Vidéos - générateur de code pour vidéo et player

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: