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 originalvar cc = new Compiler();
cc
.var( '$cells' , cells )
.var( '$flag' , true )
.var( '$bgClass', 'bg-red')
.var( '$i', '$j', '$prev', '$cur' )
.action(
// accion nula
)
.for( "$i=0", "$i < 4", "++$i" )
.for( "$j = 0", "$j < 4", "++$j" )
.calc( "$cur = $cells[$i][$j]" )
.if( "$flag" )
.action(
["$prev", removeClass, ["$bgClass"] ],
["$cur" , addClass , ["$bgClass"] ]
)
.if( "$cur.classList.contains('bg-blue')" )
.action(
["$cur", removeClass, ["$bgClass"] ]
)
.calc(
"$bgClass = alternate($bgClass, 'bg-red', 'bg-green')",
"$flag = false"
)
.action(
["$cur", addClass, ["$bgClass"] ]
)
.end()
.calc( "$prev = $cur" )
.else()
.calc( "$flag = true" )
.end()
.end()
.end()
.action(
["$prev", removeClass, ["$bgClass"] ]
);
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!