Ver Mensaje Individual
  #3 (permalink)  
Antiguo 21/01/2014, 14:19
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: Sobrescribir palabras clave como métodos

Cita:
Iniciado por marlanga
El autómata que has hecho concatenando órdenes mediante chaining marea con sólo verlo xd.
jaja, pues comparado con mis anteriores prototipos yo lo veo bastante leíble. Supongo que será porque lo he hecho yo y ya me he acostumbrado... De todas formas lo he mejorado un poco incluyendo el for entre otras cosas:
Código Javascript:
Ver original
  1. var cc = new Compiler();
  2.  
  3.     cc
  4.     .var( '$cells'  , cells   )
  5.     .var( '$flag'   , true    )
  6.     .var( '$bgClass', 'bg-red')
  7.     .var( '$i', '$j', '$prev', '$cur' )
  8.     .action(
  9.         // accion nula
  10.     )
  11.     .for( "$i=0", "$i < 4", "++$i" )
  12.         .for( "$j = 0", "$j < 4", "++$j" )
  13.             .calc( "$cur = $cells[$i][$j]" )
  14.             .if( "$flag" )
  15.                 .action(
  16.                     ["$prev", removeClass, ["$bgClass"] ],
  17.                     ["$cur" , addClass   , ["$bgClass"] ]
  18.                 )
  19.                 .if( "$cur.classList.contains('bg-blue')" )
  20.                     .action(
  21.                         ["$cur", removeClass, ["$bgClass"] ]
  22.                     )
  23.                     .calc(
  24.                         "$bgClass = alternate($bgClass, 'bg-red', 'bg-green')",
  25.                         "$flag = false"
  26.                     )
  27.                     .action(
  28.                         ["$cur", addClass, ["$bgClass"] ]
  29.                     )
  30.                 .end()
  31.                 .calc( "$prev = $cur" )
  32.             .else()
  33.                 .calc( "$flag = true" )
  34.             .end()
  35.         .end()
  36.     .end()
  37.     .action(
  38.         ["$prev", removeClass, ["$bgClass"] ]
  39.     );
http://jsfiddle.net/jefebrondem/ny7Ky/1/

Cita:
Iniciado por marlanga
En cuanto a eval y Function, son las dos únicas formas que conocía de interpretar una cadena como si fuera código real de forma automática. Quedaría como ya sabrás la tercera vía: Trocear y evaluar manualmente la cadena.
Esto es lo que me temía. El problema es que si las instrucciones las paso a través de un string para luego parsearlo, el código en un editor de código será monocolor, no habrá control de cierre de paréntesis, cosa que no facilita la escritura de código para el autómata.

Otra cosa que se me ocurre es hacer un programa preprocesador que lea un texto pseudojavascript con la escritura del código del autómata y lo convierta en un código javascript listo para funcionar.

Las dos me dan un poco de palo, porque es ponerse en el meollo de hacer una especie de compilador medianamente serio para un nuevo lenguaje. Así que si no hay más alternativas creo que de momento me quedaré con el encadenamiento de funciones que, así, sólo tendré que parsear pequeñas cadenas y olvidare de gramáticas libres de contexto.

Un saludo y gracias!
__________________
github.com/xgbuils | npm/xgbuils

Última edición por Pantaláimon; 21/01/2014 a las 14:28