MODIFICAR EL CODIGO FUENTE DEL NUEVO COMPILADOR





Veamos tenemos el codigo fuente del freepascal... pero necesitamos generar uno nuevo.

Bueno yo trabaja en el directorio d:\bailalo\s6 por razones que no vienen a cuento...
y en d:\bailalo\s6\pp tenía el codigo fuente del freepascal.

Así lo que hize fue hacerme una copia al pp2.
(¿Por qué no pp2... el segundo... rapido de escribir?)

Así que así estamos.

d:\bailalo\s6\pp
d:\bailalo\s6\pp2

Bueno... todo empezo como decía con el tokens.pas...
 

PONERLO AL PRINCIPIO DEL MODIFICAR EL CODIGO....
=====

Antes de todo.
Vamos a ver los buenos programadores como los del freepascal conforme van cambiando el codigo fuente
lo ponen en forma de comentario abajo del codigo... como yo creía que en dos días estaba hecho no
lo hize. Así que estos cambios conforme me acuerde estarán en estos html o txt si no los
llego a pasar a html.

=== FIN DE PONERLO AL ....

De momento todos los cambios que comente son cambios ya realizados... cuando no estén
realizados se especificará ad hoc.

Aunque creía que todos los cambios los había realizado en pp2 la cosa es que los cambios
relativos al compilador están hechos en pp\source\compiler y todo lo relativo al rtl
está hecho en pp2\source ... um... quizas en el futuro haya que cambiarlo pero por
ahora no merece la pena... porque si lo hice así sería por algo.

pp\source\compiler\tokens.pas

El tokens.pas tiene 3 o mas cambios:

1) Tiene una matriz con palabras reservadas en ingles (las que no están con un _ al principio)
están hay que traducirse al español cuidando dos cosas:

 a) Han de estar en orden, primero en tamaño y luego por igual tamaño en orden alfabetico.
Es decir primero se ordena segun la longitud de la palabra y ante dos palabras de la misma longitud
se pone primero la que iría antes en una ordenación alfabetica.

 b) Las palabras reservadas tal cual las vemos en pascal equivalen a una matriz más arriba, que
son las palabras tal cual pero con un _ delante de ellas. Por ejemplo, no sé, function tendrá su
equivalente como: _function.
Está matriz superior habrá que ordenarla de tal manera que concuerde con la inferior (palabras
tal cual) que en el apartado anterior hemos ordenado.

2) y 3) Cuando se definen las matrices en el tokens.pas original hay dos lineas que especifican
desde 2 hasta el "la maxima longitud de palabra reservada". Bueno pues como en Español tenemos
las conjunciones o e y, que son las que vamos a usar en vez de OR y AND. Así que esos 2 hay que
cambiarlos a 1.
 

4) Si os fijais bien hay unos comentarios primero con unos numeros sin orden y otros con orden...
son claro para no perder el orden de correspondencia entre las dos matrices citadas anteriormente. Hay además una traducción explicita en cada linea cambiada. (Por
ejemplo: GOTO --> VESA)

5)  Introduje una función o una serie de instrucciones para comprobar que el tokens.pas iba
bien, crea un fichero que no sirve para nada. Estas instrucciones son:

=== Instrucciones

procedure create_tokenidx;
{ create an index with the first and last token for every possible token
  length, so a search only will be done in that small part }
var
  t : ttoken;

  miarchivo : text; (*file of string[tokenidlen];*)

begin
assign(miarchivo,'reserva.txt');
rewrite(miarchivo);

  fillchar(tokenidx^,sizeof(tokenidx^),0);
  for t:=low(ttoken) to high(ttoken) do
   begin
     if not arraytokeninfo[t].special then
      begin
        if ord(tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].first)=0 then
         begin(* Para que solo escriba con el if*)
         tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].first:=t;
         write(miarchivo,(arraytokeninfo[t].str));
         writeln(miarchivo,'');
         end;(* Para que solo escriba con el if *)

        tokenidx^[length(arraytokeninfo[t].str),arraytokeninfo[t].str[1]].last:=t;
      end;
   end;
 

close(miarchivo);

end;

=== Fin de instrucciones

===Estas instrucciones hay que compararlas con el tokens.pas no vaya a ser que hayamos
borrado una cosa que estaba bien del tokens.pas y la hayamos "cagado".
===

===Esto ponerlo con el color "Te estoy contando una historia"
No tarde en darme cuenta que aunque cambiase todo el rtl a las nuevas palabras reservadas
el tokens.pas no era el unico que influia.

=== Esto ponerlo... fin

Nota: La correspondencia de las palabras claves del Pascal al Hispascal están en los archivos
antes.txt(Para Pascal) y despues.txt (Su equivalente en Hispascal) del directorio s6\cambiar tokens

===El antes.txt y despues.txt hay que ponerlos como dos html y diferentes y luego en forma
de tabla en un solo html======
 

Aquí adjunto "copiado y pegado" el antes.txt y el despues.txt

antes.txt
==========

OR
AND
IN
IS
XOR
MOD
AS
AT
OR
AND
OF
IN
IS
NOT
XOR
IF
WITH
ASM
END
DO
READ
MOD
USES
CASE
AS
NIL
ELSE
TYPE
GOTO
FOR
DOWNTO
NEAR
CLASS
FAIL
FALSE
TO
FAR
STRING
NEW
SET
EXIT
ON
FORWARD
INDEX
BEGIN
NAME
OBJECT
REPEAT
BREAK
UNIT
ARRAY
TRUE
FILE
DEFAULT
WRITE
EXCEPT
EXPORTS
EXTERNAL
FINALLY
FUNCTION
MESSAGE
PRIVATE
PUBLIC
SELF
SYSTEM
ABSOLUTE
CPPCLASS
CONTINUE
DYNAMIC
THEN
LABEL
EXPORT
STORED
UNTIL
INHERITED
INTERFACE
LIBRARY
SYSCALL
STDCALL
WHILE
OPERATOR
PROGRAM
RECORD
REGISTER
ABSTRACT
IOCHECK
NODEFAULT
ASMNAME
OTHERWISE
PROPERTY
PROTECTED
PUBLISHED
RESIDENT
RESULT
OVERLOAD
ASSEMBLER
INLINE
INTERRUPT
SAFECALL
INTERNPROC
FINALIZATION
RESOURCESTRING
PROCEDURE
OPENSTRING
IMPLEMENTATION
INITIALIZATION
SAVEREGISTERS
STATIC
TRY
WRITE
WRITELN
ASSIGNED
READ
READLN
OFS
SIZEOF
TYPEOF
LOW
HIGH
SUCC
EXCLUDE
INCLUDE
BREAK
CONTINUE
STR
ASSERT
ADDR
void
word
ulong
longint
qword
int64
char
widechar
shortstring
longstring
ansistring
widestring
openshortstring
boolean
void_pointer
char_pointer
void_farpointer
openchararray
file
s32real
s64real
s80real
parent
length
mlength
SINGLE
DOUBLE
EXTENDED
POINTER
FARPOINTER
SHORTSTRING
LONGSTRING
STRINGANSI
WIDESTRING
BOOLEAN
BYTEBOOL
WORDBOOL
LONGBOOL
CHAR
WIDECHAR
TEXT
INT64
TYPEDFILE
openchararray
DWORD
NEAR
FAR
LABEL
LLABEL
INTEGER
shortint
smallInt
longword

===Fin del antes.txt ====

despues.txt
===========

O
Y
EN
ES
OR
RES
COMO
A
O
Y
DE
EN
ES
NO
OR
SI
CON
ENS
FIN
HAZ
LEE
RES
USA
CASO
COMO
NULO
SINO
TIPO
VESA
PARA
BAJAA
CERCA
CLASE
FALLO
FALSO
HASTA
LEJOS
LINEA
NUEVO
PONER
SALIR
SOBRE
EMPUJA
INDICE
INICIO
NOMBRE
OBJETO
REPITE
ROMPER
UNIDAD
VECTOR
VERDAD
ARCHIVO
DEFECTO
ESCRIBE
EXCEPTO
EXPORTA
EXTERNO
FINALME
FUNCION
MENSAJE
PRIVADO
PUBLICO
SIMISMO
SISTEMA
ABSOLUTO
CLASECPP
CONTINUA
DINAMICO
ENTONCES
ETIQUETA
EXPORTAR
GUARDADO
HASTAQUE
HEREDADO
INTERFAZ
LIBRERIA
LLAMASIS
LLAMASTD
MIENTRAS
OPERADOR
PROGRAMA
REGISTRO
REGISTRAR
ABSTRACTO
CHEQUEOES
NODEFECTO
NOMBREENS
OTRAFORMA
PROPIEDAD
PROTEGIDO
PUBLICADO
RESIDENTE
RESULTADO
SOBRECARGA
ENSAMBLADOR
ENTRELINEAS
INTERRUMPIR
LLAMASEGURA
PROCINTERNO
FINALIZACION
STRINGFUENTE
PROCEDIMIENTO
STRINGABIERTO
IMPLEMENTACION
INICIALIZACION
SALVAREGISTROS
ESTATICO
PRUEBA
ESCRIBE
ESCRIBELN
ASIGNADO
LEE
LEELN
DES
DETAMANO
DETIPO
BAJO
ALTO
SUC
EXCLUYE
INCLUYE
ROMPER
CONTINUA
LIN
ASERT
DIREC
vacio
palabra
largou
entlargo
palq
ent64
car
caramplio
lincorta
linlarga
linansi
linamplia
lincortaabierta
booleano
puntero_vacio
puntero_car
punterolejano_vacio
vectorcarabierto
archivo
reals32
reals64
reals80
padre
longitud
mlongitud
SIMPLE
DOBLE
EXTENDIDO
PUNTERO
PUNTEROLEJANO
LINCORTA
LINLARGA
LINANSI
LINAMPLIA
BOOLEANO
BOOLBYTE
BOOLPAL
BOOLLARGO
CAR
CARAMPLIO
TEXTO
ENT64
ARCHIVOTIPADO
vectorcarabierto
PALD
CERCA
LEJOS
ETIQUETA
ETIQUETAL
ENTERO
entcorto
Entpequeno
pallarga

====Fin de despues.txt====
 
 

Vamos a ver a parte del tokens.pas tambien modifique otros archivos, lo que como no estoy
seguro cogeré los que me parezcan que no serán seguramente todos. De momento veo que en el
directorio:
bailalo\s6\ppesp hay de esos archivos que son como copias de seguridad de archivos que seguramente haya modificado.

Estos son: scanner.pas ra386att.pas ra386dir.pas psystem.pas symtable.pas
 

==== bailalo\s6\pp\source\compiler\scanner.pas
 

Este archivo creo que comprueba la sintaxis o al menos la traduce a tokens para que el
freepascal la pueda entender.
 

En la función: function is_keyword(const s:string):boolean;

if not (length(s) in [1..tokenidlen]) then
        (* Cambio el 1 por el 2 para que admita tokens de 1 char *)

En la función: {****************************************************************************
                               Token Scanner
****************************************************************************}

    procedure tscannerfile.readtoken;

           if (pattern[1]<>'_') and (length(pattern) in [1..tokenidlen]) then
           (* Cambio el 2 por el 1 para que admita tokens de 1 char *)
 
 

scanner.pas se podría usar para sustituto del pashis. Pero eso más en adelante.
 

==== bailalo\s6\pp\source\compiler\ra386att.pas

En: const cambio:

  token2str : array[tasmtoken] of tasmkeyword=(
  (* Cambio .word por .palabra *)
  (* Cambio .text por .texto *)
  (* Cambio integer por entero *)
    '','Label','LLabel','string','entero',
    'float',',','(',
    ')',':','.','+','-','*',
    ';','identifier','register','opcode','/','$',
    '.byte','.palabra','.long','.quad','.globl',
    '.align','.balign','.p2align','.ascii',
    '.asciz','.lcomm','.comm','.single','.double','.tfloat',
    '.data','.texto','FIN',
    (* Cambio por end por fin y type por tipo *)
    'TIPO','%','<<','>>','!','&','|','^','~');
 
 

Ojo con el FIN que está en mayusculas habrá que mirar como estaba el end en el archivo original
y si estaba en minusculas este pasarlo a minusculas.

Podríamos cambiar algunos de estos strings para que concidan con los del tokens.pas es decir
que "los cojan" de ahí para que luego para traducir a otros lenguajes sea más fácil.

En ra386att.pas probablemente haya más cambios, pero mirandolo por encima no he encontrado nada.
 

=== bailalo\s6\pp\source\compiler\ra386dir.pas

Aparentemente este no está modificado. Habrá que mirar en el directorio
ppesp si se hizo alguna modificación y... lo miro y aparentemente nada. Pero otro
día hay que mirarlo con mayor detenimiento.

=== bailalo\s6\pp\source\compiler\psystem.pas
 

Aqui la fecha está cambiada así que seguro que hay algún cambio
 

Viendo el archivo se ve claramente lo que he cambiado, muchas palabras claves han cambiado.

Habrá que preguntar en la lista de correo si al cambiar el psystem.pas que es el que interpreta
la unidad system estamos obligando a traducir todo el rtl a hispascal cuando no hace falta.
 
 

=== bailalo\s6\pp\source\compiler\symtable.pas
 

Estas lineas hay que ver si se han de cambiar y cambiarlas en su caso:
    const
       overloaded_names : array [first_overloaded..last_overloaded] of string[16] =
         ('plus','minus','star','slash','equal',
          'greater','lower','greater_or_equal',
          'lower_or_equal',
          'sym_diff','starstar',
          'as','is','in','or',
          'and','div','mod','not','shl','shr','xor',
          'assign');
Además:
No encuentro nada cambiado en un futuro hay que mirar porque seguro que hay algo cambiado