Índice de entradas del conversor
Comenzamos con el analizador léxico, esta lo divido en dos partes para simplificar, por un lado la lectura de líneas y por otro su descomposición en Tokens.
Partimos de que el programa de origen será un fichero de texto guardado en el Microdriver (o equivalentes como las unidades con una SD, un disquete, un disco duro, o desde un emulador un directorio en el equipo). El resultado serán líneas completas que pasaremos a la rutina que la descompone en Tokens. En esta entrada presentaré las rutinas de lectura del fichero fuente y las de escritura del fichero de destino, que son bastante sencillas realmente.
Para las pruebas el programa simplemente copiar la línea leída en el fichero de origen y la guardará tal cual en el fichero de destino. En otras entradas iré desarrollando esta parte.
En esta primera versión del programa incluyo la base del sistema, compuesta de una serie de procedimientos y funciones que iré llamando, usando este procedimiento:
1170 DEFine PROCedure Main
1180 Init : REMark Inicializar variables globales
1190 Pantalla : REMark Pantalla de petición de datos
1200 :
1210 REMark Preparar una ventana para ver los resultados
1220 :
1230 OPEN#cCon,con
1240 WINDOW #cCon,400,140,50,70 : BORDER #cCon; 2,2
1250 :
1260 Proceso : REMark procesar el fichero de entrada
1270 :
1280 INK #cCon;6 : PRINT #cCon;LF$;"Finalizado"
1290 CLOSE #cCon
1300 END DEFine
- Init: Este procedimiento inicializa las variables globales que usaremos. Al no existir contantes en SuperBASIC, usaremos variables para simularlas, por haber programado en C tengo la costumbre de que las contantes se escriban con nombres en Mayúsculas siempre.
- Pantalla: Este procedimiento presenta la pantalla inicial, y solicita los nombres de los ficheros de origen y destino.
- El OPEN y WINDOW crea una ventana para ir presentando las líneas leidas y las generadas
- Proceso: Este es el procedimeinto que realizará todo el proceso de conversión, en este momento lo único que hace es copìar la entrada sobre la salida para las pruebas de lectura y escritura de ficheros.
- Luego se presenta el mensaje de fin.
Veamos los procesos principales, comenzando por el denominado Proceso que es el que hace todo el trabajo de dirección:
1850 DEFine PROCedure Proceso
1860 LOCal fin,salida$
1870 :
1880 OPEN_IN #cIn, fIn$
1890 OPEN_NEW #cOut, fOut$
1900 CLS #0 : REMark Por si hay un mensaje de sobreescribir
1910 :
1920 REMark --- Lectura del fichero de entrada
1930 :
1940 REPeat BucleLectura
1950 :
1960 fin = LeerFichero
1970 linea$=Trim$(linea$)
1980 IF (linea$ <> "") THEN
1990 nrl = nrl + 1
2000 Mostrar_Entrada linea$
2010 salida$=Montar$(linea$)
2020 Mostrar_Salida salida$
2030 Guardar(salida$)
2040 END IF
2050 IF fin THEN EXIT BucleLectura
2060 :
2070 END REPeat BucleLectura
2080 :
2090 REMark Finalizar el proceso
2100 :
2110 CLOSE #cIn
2120 CLOSE #cOut
2130 END DEFine Proceso
Este proceso comienza abriendo los canales para lectura y escritura asociandolos a los ficheros que usaremos, al llegar a la línea 1890, si el sistema encuentra que el fichero de salida ya existe nos pregunta si deseamos sobre-escribirlo. si usamos Minerva o algún Toolkit existe la posibilidad de evitar esto indicando que deseamos sobre-escribir siempre, pero yo prefiero usar la ROM estándar únicamente en estas entradas.
Luego llamará al procedimiento que lee el fichero línea a línea, presentando la línea en la pantalla, llama al proceso que Montará la línea de salida (repito en este momento solo copia origen a destino), y nos presenta la línea generada.
Al final cierra los canales de entrada y salida.
2530 DEFine FuNction LeerFichero
2540 LOCal car$
2550 :
2560 linea$=""
2570 REPeat Bucle_Lectura
2580 IF (EOF(#cIn)) THEN RETurn TRUE
2590 :
2600 car$=INKEY$(#cIn)
2610 :
2620 IF (car$ <> CR$) AND (car$ <> LF$) THEN
2630 linea$ = linea$ & car$
2640 ELSE
2650 IF (linea$<>"") THEN
2660 EXIT Bucle_Lectura
2670 END IF
2680 END IF
2690 END REPeat Bucle_Lectura
2700 RETurn FALSE
2710 :
2720 END DEFine LeerFichero
2760 DEFine PROCedure Guardar(s$)
2770 PRINT #cOut, s$
2780 END DEFine
Como de momento el proceso solo copia tal cual, si se ejecuta con un fichero de prueba la pantalla que aparece será como esta:
Vemos que se solicita los nombres de los ficheros de origen y destino, y el proceso va presentando las líneas, el primer número en color blanco es el contador de líneas leídas. Luego en verde está la línea que ha leído, marcada como "L:", debajo y en color rojo la línea que ha convertido (repito que nuevamente en esta fase solo es copia de la leída) marcada como "C:".
El módulo completo lo podéis descargar desde este enlace
No hay comentarios:
Publicar un comentario