Comencemos por "while". Un bloque como
while condicion do
  begin
  bloque1
  end
restoDeProgramaSe podría reescribir como
inicioWhile:
if not condicion then goto inicioRestoDePrograma;
  bloque1
  goto inicioWhile; 
inicioRestoDePrograma: 
  restoDeProgramaQue, al igual que ocurría con "if", ya tiene una traducción casi directa a ensamblador (y, por tanto, a código máquina).
El caso de "repeat..until" es aún más sencillo. El código fuente sería
repeat
  bloque1
until condicion;
restoDeProgramaSe podría reescribir en forma muy cercana al ensamblador como
inicioRepeat:
  bloque1
if not condicion then goto inicioRepeat; 
restoDeProgramaMientras que el bucle "for" es apenas ligeramente más complicado:
for variable := valorInicial to valorFinal do
  begin
  bloque1
  end
restoDeProgramaQuedaría como
variable := valorInicial;
inicioFor:
if variable > valorFinal then goto inicioRestoDePrograma;
  bloque1
  inc(variable)
  goto inicioFor; 
inicioRestoDePrograma: 
  restoDePrograma(ignoramos por ahora el caso de usar "downto" en vez de "to").
Aun así, hay cosas que mejorar (en una versión posterior). Unas son fallos claros de la versión actual y otras son mejoras necesarias. La primera y más evidente es que nuestro analizador léxico no reconoce operadores de formados por dos letras: ni "<=", ni ">=", ni "<>". Tampoco se crea correctamente el código objetivo para estas comparaciones. Por supuesto, tampoco permite AND, OR y NOT para formar condiciones más complejas. Tampoco sabemos analizar expresiones matemáticas más elaboradas, de modo que no podemos hacer cosas como "if a > x+1 then ..."
Todo irá llegando... ;-)
Como siempre, para más detalles, todo el código está en la página del proyecto en Google Code:
http://code.google.com/p/cpcpachi/
 
 
 Entradas
Entradas
 
 
No hay comentarios:
Publicar un comentario