Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - leogtz

#191
Programación General / Re: Algoritmia
10 Enero 2012, 10:57 AM
Sería muy interesante ver dichas soluciones, no dudes en compartirlas. :D
#192
Scripting / Re: [Batch] Comando For / F
10 Enero 2012, 10:46 AM
Lee lo siguiente, es algo que escribí hace mucho tiempo:

http://www.portalhacker.net/index.php?topic=86033.0

Saludos.
#193
De nada, saludos.
#194
Son simples, solo checa que el usuario haya introducido algo en la variable nombre y demás variables, algo así:

:menu
set /p nombre=
if not defined nombre (goto:menu)


Además, no necesitas llamar a la etiqueta color, ya que el código seguirá automáticamente a la etiqueta color, es innecesaria.
#195
Foro Libre / Re: ¿Donde está Alex?
9 Enero 2012, 10:14 AM
Ya les había dicho que Alex se fue y no regresará....

http://foro.elhacker.net/foro_libre/que_fue_de_vertex-t348954.0.html
#196
Programación General / Re: Algoritmia
9 Enero 2012, 02:48 AM
Sí, aquí en esta sección está bien. :D
#197
Está bueno, hay algunas pequeñas mejoras que se le pueden hacer, pero está bueno.  ;)
#198
Hola a todos.

Hola a todos, bueno, les cuento, como parte de un trabajo en la universidad, tuve que crear un "compilador", o por lo menos avanzarlo, sin utilizar flex, lex, bison, yacc y todo eso, desde 0 totalmente. Pues bueno, quería compartirles el código.

El compilador no tiene mucho, pero algo es algo  :P

Tiene su analizador léxico, analizador sintáctico, unas pequeñas comprobaciones de tipos de datos y demás..., el compilador crea correctamente su propio árbol sintáctico para el código fuente dado, que ya es un avance, y para ver si funcionaba la lectura del árbol sintáctico, hice un poco de generación de código intermedio para las expresiones aritméticas básicas, genera código P y pseudocódigo ensamblador (un código artesanal que hace movimientos con registros con nombres de tipo R[0-9]), pero solo para expresiones aritméticas sencillas.

Quiero compartirlos con ustedes y si quieren unirse a mi, adelante, son bienvenidos, ya que creanme que para mi no ha sido nada fácil, me ha resultado bastante complejo esto, y eso que aún no llego plenamente a la generación de código. En fin.

El "compilador" está hecho en Java, con la ayuda de NetBeans. ¿por qué en Java? porque tenía que hacer esto lo más pronto posible, en menos de 3 meses :s y en periodo escolar, por lo que no tenía mucho tiempo de dedicarle tiempo exclusivamente a esto :s, Java provee un fácil manejo con Strings, además de estructuras de datos que no iba a tener que armas desde 0, como las listas y las tablas de dispersión, además que es con lo que más se llevan mis compañeros.

Bueno, les comento un poco cómo se estructura el lenguaje, algunos ejemplos:

inicio miPrimerProgramaEnGLHBR
entero x = 3;
leer(x)
fin;


El código debe empezar por inicio ID sentencias fin;, siempre.

inicio Hello_Shit
entero x = 123;
inc(x, 2 * 3)
fin;


inicio X
entero x = 1;
write(x);
repetir
x = x + 5;
x = x - 4
hasta x == 10
fin;


inicio X
entero z = 1234 + 234 + 56 + 78;
infinito hacer
z = z + 12
porsiempre
fin;


El compilador procesa las operaciones aritméticas (obviamente las operaciones aritméticas se hacen checando precedencia de operadores) y hace el cálculo, por ejemplo esto:

inicio X
entero x = (3 * 69 - (5 * 85 - 14))
fin;


Y el código que se genera:

Código P:

;Código P para las sentencias enteras sencilla para el programa final.glhbr
ldc 3
ldc 69
mpi
ldc 5
ldc 85
mpi
ldc 14
sbi
sbi


Y el pseudocódigo ensamblador:

; Código ensamblador para el programa "final.glhbr"
MOV R0,#3 ; Cargamos 3
MOV R1,#69 ; Cargamos 69
MUL R0,R1     ;  Multiplicamos
MOV R1,#5 ; Cargamos 5
MOV R2,#85 ; Cargamos 85
MUL R1,R2     ;  Multiplicamos
MOV R2,#14 ; Cargamos 14
SUB R1,R2        ; Restamos
SUB R0,R1        ; Restamos
MOV x,R0    ; fin de la sentencia de asignación
; Rutina para mostrar el resultado de x
;        R = -204.0


Todo esto recorriendo el nodo de árbol sintáctico correspondiente a una operación aritmética en postorden y luego la evaluación por medio de una pila.

Quizá alguien que sepa assembly pueda ayudar a traducir el pseudocódigo ensamblador a assembly real.

Son algunos de los usos, por supuesto, como ya les he dicho, no se ejecuta nada, porque no hay generación de código.... y para eso pido su ayuda, si alguno quiere unirse y aportar ideas, bienvenido! así aprendemos todos.

Bueno, les dejo el link el link y una captura:



El proyecto está en github por si quieren ver ahí los cambios que he hecho:
https://github.com/leogtzr/glhbr

Saludos.
#199
Listo, terminé, resultó una solución demasiado artesanal. En parte porque en Windows carece de utilidades para procesar flujos, de expresiones regulares, en fin...

Antes que nada comentarte algo, batch es muy arcaico y simple, no tiene soporte para operaciones con decimales, así que hice un pequeño código en C solamente para la parte de sacar el precio unitario, es muy simple:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
    if(argc != 3)
        return EXIT_FAILURE;
    printf("%.2f\n", atof(argv[1]) / atof(argv[2]));
    return EXIT_SUCCESS;
}


Esto es lo único que tendrás que utilizar, ahora el batch.

Teniendo el ticket.txt:

C:\Users\leo\batch>type ticket.txt
Ticket Nro. 12
Fecha: 05/01/12 Hora: 02:20




  3  AMARILLO LEDERNIL E - EURO    $27,00
  1  AMARILLO LEDERNIL RP - EURO   $13,00
  1  AMARILLO LEDERNIL L - EURO    $10,40

                                  -------
TOTAL                              $50,40
C:\Users\leo\batch>


Luego de ejecutar el script me genera esto en "factura.txt":


C:\Users\leo\batch>code.cmd

C:\Users\leo\batch>type factura.txt
@ A S
B AMARILLO LEDERNIL E - EURO 3.0 9.00 21.0 M 0.0 0 b
B AMARILLO LEDERNIL RP - EURO 1.0 13.00 21.0 M 0.0 0 b
B AMARILLO LEDERNIL L - EURO 1.0 10.40 21.0 M 0.0 0 b
C P Subtotal 0
D Efectivo 100.00 T 0
E

C:\Users\leo\batch>


Este es el código del archivo batch:
Código (bash) [Seleccionar]

@echo off
setlocal enabledelayedexpansion
set /a count=0
for /f "tokens=*" %%_ in ('type "ticket.txt" ^| findstr /r "^..[0-9].*$"') do (set "productos[!count!]=%%_" & set /a count+=1)
set /a count-=1
for /l %%_ in (0, 1, %count%) do (
for /f "tokens=1 delims= " %%# in ("!productos[%%_]!") do (
set "descripcion_final[%%_]=%%#"
)
)
for /l %%_ in (0, 1, !count!) do (
for /f "tokens=1* delims=$" %%a in ("!productos[%%_]!") do (call:process %%a)
set "descripcion_final[%%_]=!descripcion_final[%%_]!;!s!;"
set /a i+=1
)
for /l %%_ in (0, 1, %count%) do (
for /f "tokens=2 delims=$" %%a in ("!productos[%%_]!") do (set "precio=%%a")
set "descripcion_final[%%_]=!descripcion_final[%%_]!!precio:,=.!"
)
:: Generar "factura.txt"
echo @ A S > "factura.txt"
for /l %%_ in (0, 1, %count%) do (
for /f "tokens=1,2,3 delims=;" %%a in ("!descripcion_final[%%_]!") do (
for /f "tokens=*" %%x in ('div %%c %%a') do echo B %%b %%a.0 %%x 21.0 M 0.0 0 b >> "factura.txt"
)
)
echo C P Subtotal 0 >> "factura.txt"
echo D Efectivo 100.00 T 0 >> "factura.txt"
echo E >> "factura.txt"
goto:eof
:process
for /f "tokens=1*" %%a in ("%*") do (set "s=%%b")
goto:eof


El ejecutable en C que hice lo llamé "div.exe" y lo uso aquí:
for /f "tokens=*" %%x in ('div %%c %%a') do echo B %%b %%a.0

Sólo se encarga de dividir, por ejemplo
div.exe 10.0 2.0
Devolvería 5.0

Aquí lo puedes descargar:

http://www.megaupload.com/?d=OWC2YJSN

O sino puedes compilarlo tu mismo con el código fuente que te dejé arriba, si lo compilas tu mismo, no olvides llamar al ejecutable generado div.exe, sino el batch fallará.


Saludos, cualquier duda me dices.
#200
Bien, dame un momento, ya estoy en ello.