Indentador para Bennu

Started by DCelso, September 30, 2008, 08:13:43 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DCelso

Ok, gracias por la aclaración l1nk3rn3l.
Por cierto he creado una herramienta de auto indentado (sangrado de bloques) y me sería interesante poder ejecutarla desde los editores tal y como veo que haces con el crimson editor.
La adjunto aquí para compartirla de camino ya con vosotros y a cer si alguien me ayuda a integrarla en los editores.
El formato es muy simple nombre_ejecutable nombre_prg_origen nombre_prg_destino.
Podría mejorarla para que trabajase con los std in y std out pero no se sí sería ventajoso para integrarla luego así que no me puse con ello.

También invito a todos a que la probeis y le encontréis errores en vuestros prgs.
Esta es la versión windows, está en formato zip y luego en 7z para poder llegar a los 128k maximos permitidos.
Bueno ya me contareis.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

DCelso

esta es la versión linux (compilada en una Debian)
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

Quote from: dcelso on September 30, 2008, 08:13:43 AM
Ok, gracias por la aclaración l1nk3rn3l.
Por cierto he creado una herramienta de auto indentado (sangrado de bloques) y me sería interesante poder ejecutarla desde los editores tal y como veo que haces con el crimson editor.
La adjunto aquí para compartirla de camino ya con vosotros y a cer si alguien me ayuda a integrarla en los editores.
El formato es muy simple nombre_ejecutable nombre_prg_origen nombre_prg_destino.
Podría mejorarla para que trabajase con los std in y std out pero no se sí sería ventajoso para integrarla luego así que no me puse con ello.

También invito a todos a que la probeis y le encontréis errores en vuestros prgs.
Esta es la versión windows, está en formato zip y luego en 7z para poder llegar a los 128k maximos permitidos.
Bueno ya me contareis.

fantastico, no sabes lo util que me es esto... yo uso para codigo C el astyle, pero me faltaba uno para bennu... gracias, lo probare, creo que deberias abrir un thread para esto...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

fantastico, probado y encontrado ciertos errores... si el archivo input no existe te da un error no muy amigable... un error de runtime...

si tenes una linea de este estilo...

IF (key(_right)) x+=5; END

no la divide

otra cosa, usa tabs en vez de espacio...

estas ultimas cosas no son errores, pero seria lindo poder modificarlas a justo, podrias incluir el fuente, asi se podria adaptar segun necesidad?

quizas te convendria estudiar el astyle y darle soporte a bennu... es fantastico... ademas seria un gran aporte...

gracias...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Uff, chungo cubata.
A ver, mi primera opción fué esa me empapé el código del astyle para c++ y el de gnu-indent para c.
Ambos muy complejos, empezé a tocar el del indent que parecía mas fácil, pero que va, no encontré resultados y lo abandoné como opción, probé lo mismo con astyle que esta como más organizado pero me perdía con la gerarquía de clases que usa, necesitaría mucho más tiempo de análisis y entendimiento de sendos códigos para poder adaptarlos a la sintaxis de bennugd, además al ser mezcla de pascal y c, se hacen la pixa un lío actualmente los indentadores de c aunque intentes usar la forma más parecida de c en bennuGD.
La última opción fué analizar como lo hizo izubiaurre en flamebird. Me abrió los ojos, es mucho más facil de implementar el sistema pero tiene muchas limitaciones debido a que no analiza la sintaxis, únicamente se dedica a avanzar o retroceder una tabulación en el indentado a medida se encuentra palabras clave .Usando como base algorítmica el .pas he podido pasarlo a c++ usando las std.

El sistema trabaja analizando la primera palabra de cada linea, si es una palabra clave mira si hay que avanzar en el sangrado o no después de ésta, y en caso de ser tipo "if" mira la última palabra de la línea para ver si tiene un end y así no avanzar en el sangrado.
Esto hace que sea muy rápido el algoritmo pero complica el poder romper la línea "IF (key(_right)) x+=5; END" en tres nuevas líneas. A mi también me gustaría que pudiera hacer eso, además abrí un post en el foro de divsite en la sección del flamebird para señalar ese bug y no le hicieron mucho caso, según entendí en lo leído es correcto que no rompa la línea en tres nuevas. Si quieres tres líneas puedes poner un return en cada una y luego ya lo indenta bién. Ejemplo:
"IF (key(_right))
x+=5;
end"
Otra falta que le ví al flamebird es que si pones "if(" no encuentra la palabra clave "if", puesto que el limitador de palabra es el espacio o fin de línea, yo le he añadido también el '('.
Estoy investigando en intentar detectar las líneas del tipo comentado y romperlas para indentarlas, quizá en próximas versiones esté.
También tengo en mente poder usar el código fuente de bennu donde se definen las "keyword" para aprobecharme de éste y que el indentador detecte las mismas keys que bennu. Actualmente pilla las mismas que ví que hacía flamebird (que es la sinstasis más parecida a pascal), mas algunas que uso en mis códigos prg  y no lo detectaba flamebird como public, private o elsif.
En cuanto al código fuente está muy feo para publicarlo, sin comentarios, variables tipo var1, var2, etc, indentación un poco ofuscada para yo ver dependencias en ors y ands, algunos bloques no muy intuitivos pero eficientes, en fin un montón de cosas que debería solucionar antes de mostrarlo al público :D.
Lo de que no exista el archivo de entrada ni lo controlé, no pensé que nadie pusiera de entrada un archivo que no vaya a existir :D, lo pondré para la siguiente.
También quiero cambiarlo para analizar en vez de línea a línea, palabra a palabra, puesto que en c soy el típico que escribe todo en una línea y luego le doy a formatear para que el ordenador ponga el código bonito y sería interesante poder también hacerlo con bennu, puesto que actualmente si hay dos palabras clave en una línea se cree que la segunda no vale para nada y no la baja a una nueva línea ni indenta en adelante.


Por cierto, usabas el ultraedit no?, como puedo integrar el indentador en este?, gracias y si sabes para el pspad también mejor que mejor :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

bien, el proyecto realmente me gusta, estaria bueno meter modificadores (parametros) que definan como se comporta el programa, por ejemplo, espacios en vez de tabs, tamaño de las tabulaciones, si agrega espacio antes o despues de los operadores, etc...
luego paso a paso, no hay problema, repito, me encanta la idea...

con respecto a integrarlo al ultraedit, fijate en "avanzado", "tools configuration..."
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Añadido control de errores en lectura de archivos.
Añadido soporte para insertar espacios en vez de tabs.
Corregido error que insertaba una línea nueva vaciá al final del archivo de salida.
Creado script para lanzarlo desde pspad. ( http://forum.bennugd.org/index.php?topic=173.0 )
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

me olvide comentarte, con respecto a reutilizar el parseador del compilador bennu, yo te diria que busques otra opcion, es muy rebuscado el parseador...
mi sugerencia es que trabajes en base a listas (configurables) de palabras que agregan espaciado y otras que quitan... teniendo en cuenta comentarios y strings... con eso creo que podes armar un buen identador...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

ok, gracias, aunque la idea era usar solo el .h donde vienen definidas las keywords o equivalente, y no el parser entero. Estoy liado ahora con el algoritmo de ir palabra a palabra, lo veo complejo no se si posponerlo para otro momento, le echaré un rato más a ver si lo veo menos complicado.

Por cierto veo que has reiterado varias veces en la palabra identador, al principio creía que te habías equivocado pero ya como van varias veces no se si es que se usa allí o que pero no he encontrado el término por ningún lado "indent" se traduce como marcar o sangrar. Yo a veces había escuchado indentar (ojo tiene una n en la segunda letra)  pero no existe en la drae, asi debe ser un anglicismo coloquial (no oficial) de "indent", es curioso pero en la informática aqui en españa pasa con muchísimas palabras esto mismo, por ejemplo: debugear (de debug), deployar(de deploy), repositorio (de repository) y un sin fín de más, ninguna existe en la drae, la más curiosa es librería (de library) cuando es biblioteca, esta está ya tan arraigada que todos los libros de programación y páginas la usan como si fuera correctísima :D.

http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=identar
http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&LEMA=indentar
http://www.wordreference.com/es/translation.asp?tranword=indent&dict=enes&B10=Search
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

los keywords no estan definidos en ningun .h, vienen en un .c... si queres saber las keywords definidas tenes que usar algunos de los archivos de sintaxis de colores usados para el IDE...

tengo un serio problema con la palabra "indentar", a pesar de saber como se escribe siempre la escribo "identar"... y la escribi tantas veces sin "n" que me cuesta escribirla bien... pero bueno, va con "n", no te hagas problemas... es un problema mio de costumbrismo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Nueva versión con soporte para listado de palabras clave.
Ya no entra en 128k asi que lo he subido a megaupload.

El formato de entrada del fichero de palabras clave no es verificado así que no cambiar al del ejemplo adjunto, no soporta ni comentarios ni cambio de orden de las secciones ni líneas en blanco entre keywords ni final de sección ni final de fichero.

http://www.megaupload.com/?d=5T9AKGMI
A ver que os parece. Saludos.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

Bien, sigue asi que no falta mucho... buen trabajo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

izubiaurre

Ta,bién existe el autoidentador en FBMX. Ctrl + I. La única pega que tiene es que le falta analizar algunas nuevas sentencias (Elif, Elsif, ...). Por lo demás, funciona bien.

blostec

Va de lujo, gracias dcelso.

Por cierto izubiaurre, como esta el desarrollo de FBMX, sigues con el?