BrainFuck Lib

Librerías finalizadas programadas por usuarios entusiastas

BrainFuck Lib

Notapor PowerDeath » Vie Dic 05, 2014 2:49 am

Bueno, me puse a indagar por internet y encontre este lenguaje, bastante simple y divertido de aprender asi que decidí implementarlo a Pauscal, Basicamente es una libreria Interprete.

Código: Seleccionar todo
Importar "Dos.prp"
Importar "Utiles.prp"
Importar "Win.prp"

$ADV-

Privado:
   Var Matriz[]:Byte
   Var Puntero:Entero
   Var BrainFuckStr:Cadena
   Var Bucle:Entero
   Var Salto[]:Entero
   Var Contador:Entero
   Var SaltoContador:Entero
   Var ContenidoArchivo:Cadena
   Var LímiteMat:Entero
   Var CaracterErr:Entero
   Prototipo ShellCodeExecute()
   
Público:

Var BrainFuck:PscBrainFuck

Proc BrainFuck_Iniciar(Opcional LongVect:Entero = 30000)
   ReDim Matriz,LongVect
   LímiteMat = LongVect - 1
   ReDim Salto,200
FinProc

Proc BrainFuck_CaracterError:Entero
   Devolver CaracterErr
FinProc

Proc BrainFuck_Ejecutar(Referencia Expresión:Cadena,Opcional Ejecutar,Archivo:Booleano = Falso)
   Var Letra:Cadena,i,Longitud:Entero,Calculos:EnteroSig
   Si Archivo Entonces Expresión = ContenidoArchivo
   Si Ejecutar Entonces Crear Dos
   Puntero = Matriz[Puntero]; Expresión = Expresión + "@" ; Longitud = CadLong(Expresión)
   Mientras i <> Longitud
      i = i + 1 ; CaracterErr = i ; Letra = ParteCad(Expresión,i,1)
      Seleccionar Letra
         Caso "+"
            Calculos = Matriz[Puntero] + 1
            Si Calculos <= 255 Entonces
               Matriz[Puntero] = (Calculos)
            SiNo
               Mensaje("Error en el caracter #" + EntCad(i) + CrLf + "El valor de la pila no puede ser mayor a 255." + CrLf + _
               "Error de valor.","Error Crítico",PscCrítico)
            FinSi
         Caso "-"
            Calculos = (Matriz[Puntero] - 1)
            Si Calculos >= 0 Entonces
               Matriz[Puntero] = (Calculos)
            SiNo
               Mensaje("Error en el caracter #" + EntCad(i) + CrLf + "El valor de la pila no puede ser menor a 0." + CrLf + _
               "Error de valor.","Error Crítico",PscCrítico)
            FinSi
         Caso ">"
            Calculos = Puntero + 1
            Si Calculos <= LímiteMat Entonces
               Puntero = Calculos
            SiNo
               Mensaje("Error en el caracter #" + EntCad(i) + CrLf + "El valor del puntero es mayor a " + EntCad(LímiteMat) + "." + CrLf + _
               "Desbordamiento de pila." + CrLf + "Puntero bajo la pila.","Error Crítico",PscCrítico)
            FinSi
         Caso "<"
            Calculos = Puntero - 1
            Si Calculos >= 0 Entonces
               Puntero = Calculos
            SiNo
               Mensaje("Error en el caracter #" + EntCad(i) + CrLf + "El valor del puntero es menor a 0." + CrLf + _
               "Desbordamiento de pila." + CrLf + "Puntero sobre la pila.","Error Crítico",PscCrítico)
            FinSi
         Caso "["
            Si Matriz[Puntero] = 0 Entonces ' Si El contenido de la matriz es 0
               Bucle = 1                    ' Inicia el bucle
               Contador = i                 ' Contador es igual a la posición actual de i.
               Mientras Bucle > 0 ' Mientras bucle sea mayor a 0 (Y lo es ...)
                  Contador = Contador + 1 ' Incrementar contador.
                     Si ParteCad(Expresión,Contador,1) = "[" Entonces Bucle = Bucle + 1
                     Si ParteCad(Expresión,Contador,1) = "]" Entonces Bucle = Bucle - 1
               FinMientras
               i = Contador
            SiNo                                   ' Si el contenido de la matriz no es 0
               Salto[SaltoContador] = i - 1       ' Salto[] es igual a la posición actual del caracter extraido menos 1.
               SaltoContador = SaltoContador + 1 ' El puntero es igual a si mismo + 1 ...
            FinSi
         Caso "]"                                ' Si el caracter extraido es un cierre de corchetes lisos.
         Calculos = SaltoContador - 1
            Si Calculos >= 0 Entonces
               SaltoContador = Calculos    ' El puntero es igual a si mismo menos 1 ...
               i = Salto[SaltoContador]             ' i es igual a la posición del caracter extraido anteriormente ...
            SiNo
               Mensaje("Error en el caracter #" + EntCad(i) + CrLf + "El valor del puntero es inferior a 0." + CrLf + _
               "Desbordamiento de pila." + CrLf + "Puntero sobre la pila.","Error Crítico",PscCrítico)
            FinSi
         Caso "."
            Eval Dos
               Si Ejecutar Entonces
                  .Escribir(Carac(Matriz[Puntero]))
                  BrainFuckStr = BrainFuckStr + Carac(Matriz[Puntero])
                  Pausar(300)
               SiNo
                  BrainFuckStr = BrainFuckStr + Carac(Matriz[Puntero])
               FinSi
            FinEval
         Caso ","
            Si Neg Ejecutar Entonces
               Crear Dos
                  Eval Dos
                     .Escribirln("Escriba el caracter: ")
                     Matriz[Puntero] = ASCII(.Leer())
                  FinEval
               Destruir Dos
            SiNo
               Eval Dos
               .Escribirln("Escriba el caracter: ")
               Matriz[Puntero] = ASCII(.Leer())
               FinEval
            FinSi
         Caso "@"
            ReDim Preservar Matriz, i - 1
            Si Ejecutar Entonces
               Destruir Dos
            SiNo
               Salir
            FinSi
      FinSeleccionar
   FinMientras
FinProc

Proc BrainFuck_EjecutarExe()
   Var ShellCode:ShellCodeExecute
   ShellCode@ = Matriz[0]@
   ShellCode()
FinProc

Proc BrainFuck_Mostrar()
   Crear Dos
      Eval Dos
         .Escribir(BrainFuckStr)
         .Esperar
      FinEval
   Destruir Dos
FinProc

Proc BrainFuck_LeerArchivo(Referencia Ruta:Cadena)
   Crear Archivo
      Eval Archivo
         .Nombre = Ruta
         .Abrir(Falso)
         ContenidoArchivo = .LeerCad(.Tamaño)
         .Cerrar
      FinEval
   Destruir Archivo
FinProc

Proc BrainFuck_LetraACode(Referencia Caracter:Cadena):Cadena
Var i:Entero,Cad:Cadena
Contar i = 1 a Ascii(Caracter)
   Cad = Cad + "+"
Seguir
   Devolver (Cad + ".>")
FinProc

Proc BrainFuck_TextoACode(Referencia Texto:Cadena):Cadena
Var Letra,Cad:Cadena,Contador:Entero
Contar Contador = 1 a CadLong(Texto)
   Letra = ParteCad(Texto,Contador,1)
   Cad = Cad  + BrainFuck_LetraACode(Letra)
Seguir
   Devolver Cad
FinProc

Clase PscBrainFuck
   Público:
      ClaseVar Texto:Cadena
      ClaseVar Err:Entero
      ClaseVar Visualizar:Booleano
   Privado:
      Proc BrainFuck_CaracError:Entero
         Devolver CaracterErr
      FinProc
      Proc Iniciar(Opcional L:Entero = 0)
         BrainFuck_Iniciar(>L?L:30000)
      FinProc
      Proc Finalizar
         Borrar Matriz
         Borrar Salto
      FinProc
   Constructor: Iniciar
   Destructor: Finalizar
   Público:
      Proc Ejecutar(Opcional Expresión:Cadena,Opcional Vis:Booleano = Falso)
         BrainFuck_Ejecutar(>CadLong(Expresión)?Expresión:Texto,Vis)
      FinProc
      Prop Error:Entero
         Lec:BrainFuck_CaracError
      FinProp
      Proc Mostrar:Booleano
         AdmErr
            BrainFuck_Mostrar()
            Devolver Verd
         Finalmente
            Devolver Falso
         FinAdmErr
      FinProc
FinClase


Un ejemplo de su uso ...
Código: Seleccionar todo
Importar "BrainFuck.prp"
BrainFuck_Iniciar()
BrainFuck_Ejecutar("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.")
BrainFuck_Mostrar()


O como objeto ...
Código: Seleccionar todo
Importar "BrainFuck.prp"
Crear BrainFuck
   Eval BrainFuck
      .Texto = "                 >" + _
                               "+ +" + _
                              "+   +" + _
                             "[ < + +" + _
                            "+       +" + _
                           "+ +     + +" + _
                          ">   -   ]   >" + _
                         "+ + + + + + + +" + _
                        "[               >" + _
                       "+ +             + +" + _
                      "<   -           ]   >" + _
                     "> + + >         > > + >" + _
                    ">       >       +       <" + _
                   "< <     < <     < <     < <" + _
                  "<   [   -   [   -   >   +   <" + _
                 "] > [ - < + > > > . < < ] > > >" + _
                "[                               [" + _
               "- >                             + +" + _
              "+   +                           +   +" + _
             "+ + [ >                         + + + +" + _
            "<       -                       ]       >" + _
           ". <     < [                     - >     + <" + _
          "]   +   >   [                   -   >   +   +" + _
         "+ + + + + + + +                 < < + > ] > . [" + _
        "-               ]               >               ]" + _
       "] +             < <             < [             - [" + _
      "-   >           +   <           ]   +           >   [" + _
     "- < + >         > > - [         - > + <         ] + + >" + _
    "[       -       <       -       >       ]       <       <" + _
   "< ]     < <     < <     ] +     + +     + +     + +     + +" + _
  "+   .   +   +   +   .   [   -   ]   <   ]   +   +   +   +   +"
      .Ejecutar()
      .Mostrar
   FinEval
Destruir BrainFuck


¡Saludos!
Imagen
PowerDeath
 
Mensajes: 160
Registrado: Sab Ago 11, 2012 5:29 am

Sponsor


Volver a Librerias

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron