JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Mise en forme de source Panoramic Mar 15 Sep 2009 - 21:17 | |
| Pour ma part, j'aime bien dans un source avoir les mots de code du langage en majuscules, pour bien les distinguer du reste. Comme je les écris au départ en minuscules pour aller plus vite, voici un petit programme qui fait la conversion. Remarques: - les noms de fichier indiqués: fp$ = fichier source à mettre en forme, fc$ = fichier des mots-clé, fo$ = fichier résultat sont évidemment à changer en fonction des ressources et des besoins. - le fichier fc$ des mots-clé Panoramic: MclePano.txt a été obtenu à partir de la liste du 'Manuel de Référence' Panoramic: http://pagesperso-orange.fr/panoramic-language/French/ , récupérée par copier/coller dans un fichier puis expurgée des commentaires, lettres seules et espaces (par programme évidemment). - le programme est extrêmement long à l'exécution (près d'une minute pour le code ci-dessous). Il manque cruellement une fonction Instr, ce qui oblige à faire appel à un sous-programme. De plus, le fait que par exemple LEFT$(a$, 0) ou RIGHT$(a$, 0) ou MID$(a$, k, 0) partent en erreur au lieu de renvoyer une chaîne vide (comme en Basic) oblige à des tests acrobatiques pour éviter l'erreur Pour la durée d'exécution, on se croirait revenu au vieux temps du Basic interprété des débuts. Je ne conseillerais pas de lancer ce programme sur les derniers sources de Jean-Claude (CFP) !!!! à moins d'avoir quelques heures à perdre. Pour info, j'ai codé à peu près la même chose dans un autre basic, et là ça va à la vitesse de l'éclair... On pourrait faire quelque chose du même genre pour générer l'indentation automatique. EDIT de minuit: allez, je rajoute le sous-programme Mcl qui constitue le fichier des mots-clé à partir du 'Manuel de référence' Voici le code: - Code:
-
REM MefPano.bas Mise en majuscules des mots-clé d'un source Panoramic DIM mcl$(500) DIM fp$, fc$, fo$, fmc$, ncl, a$, s$, j, ls, k, k1, k2, u, um, ch$, trv, nbl DIM pr$ LABEL Reb, Instr, Mcl, record
fp$ = "C:\Langages\Panorami\MefPano.bas": Rem fichier source à mettre en forme fc$ = "C:\Langages\Panorami\MclePano.txt": Rem fichier des mots-clé Panoramic fo$ = "C:\Temp\MefPano.bas": Rem fichier résultat, mis en forme fmc$ = "Z:\mcl.txt": Rem fichier copié/collé depuis le 'Manuel de Référence'
IF FILE_EXISTS(fc$) = 0 THEN GOSUB Mcl: Rem création du fichier des mots-clé ncl = 0: REM 352 mots-clé (09/09) FILE_OPEN_READ 1,fc$ WHILE FILE_EOF(1) = 0 ncl = ncl + 1: FILE_READLN 1, mcl$(ncl) END_WHILE FILE_CLOSE 1
FILE_OPEN_READ 1,fp$: nbl = 0 FILE_OPEN_WRITE 2, fo$ WHILE FILE_EOF(1) = 0 FILE_READLN 1, a$: nbl = nbl + 1 um = LEN(a$): s$ = "REM": ch$ = upper$(a$): u = 1: gosub Instr IF k>0 THEN um = k+3 s$ = CHR$(34): ch$ = a$: u = 1 : REM pour ignorer les mots entre quotes GOSUB Instr: k1 = k IF k1 > 0 u = k1+1: GOSUB Instr: k2 = k ELSE k1 = LEN(a$): k2 = 0 END_IF FOR j = 1 TO ncl s$ = mcl$(j): ls = LEN(s$) u = 1 Reb: ch$ = UPPER$(a$): GOSUB Instr IF k > 0 AND k < um IF k < k1 OR k > k2 IF k > 1 IF k = LEN(a$) - ls + 1 a$ = LEFT$(a$, k-1) + s$ ELSE a$ = LEFT$(a$, k-1) + s$ + RIGHT$(a$, LEN(a$)-k-ls+1) END_IF ELSE IF LEN(a$) > ls a$ = s$ + RIGHT$(a$, LEN(a$)-ls) ELSE a$ = s$ END_IF END_IF u = k+ls: GOTO Reb END_IF END_IF NEXT j FILE_WRITELN 2, a$ END_WHILE FILE_CLOSE 1 FILE_CLOSE 2 PRINT "Terminé !" TERMINATE
Instr: REM recherche de la séquence s$ dans ch$, à partir de la position u REM position rendue dans k (ou 0: non trouvé) trv = 0 IF LEN(ch$) >= LEN(s$) FOR k = u TO LEN(ch$)-LEN(s$)+1 IF MID$(ch$, k, LEN(s$)) = s$ THEN trv = k: EXIT_FOR NEXT k END_IF k = trv RETURN
Mcl: Rem Mise en forme du fichier des mots-clé de Panoramic, récupéré par Rem copier/coller du Manuel de Référence dans Z:\mcl.txt, mis en forme Rem dans C:\Langages\Panorami\MclePano.txt FILE_OPEN_READ 1, fmc$ FILE_OPEN_WRITE 2, fc$ pr$ = "" WHILE FILE_EOF(1) = 0: FILE_READLN 1, a$ a$ = TRIM$(a$) IF LEN(a$) > 1 IF LEFT$(a$, 9) = "IF C ELSE" THEN a$ = "ELSE": GOTO record IF LEFT$(a$, 9) = "(FOR V=S " THEN a$ = "STEP": GOTO record IF LEFT$(a$, 9) = "(FOR V=S)" THEN a$ = "TO": GOTO record ch$ = a$: s$ = " ": u = 1: GOSUB Instr: if k>0 THEN a$ = LEFT$(a$, k-1) ch$ = a$: s$ = "(": u = 1: GOSUB Instr: if k>0 THEN a$ = LEFT$(a$, k-1) record: IF a$ <> pr$ THEN FILE_WRITELN 2, a$: pr$ = a$ END_IF END_WHILE FILE_CLOSE 1: FILE_CLOSE 2 RETURN | |
|