SUX 01
From Movaxes
SUX Lenguaje Esoterico
Creado el 21 de Marzo del 2007
SUX 0.1 es un lenguaje de programación esoterico creado por Movaxes (aka P.R.) con la influencia del famoso lenguaje de programación esoterico Brainfuck, espero lograr en la versión 1 un lenguaje esotérico que sea turing completo.
Tutorial de SUX 0.1
SUX opera sobre un arreglo (buffer) de caracteres (al igual que BrainFuck) usando un puntero que al iniciar apunta buffer[0].
Los instrucciones de SUX son los siguientes:
/ inicia y termina un comentario, ejemplo /este es un comentario/ > mueve el puntero hacia adelante (i++) < mueve el puntero hacia atrás (i--) $ mueve el puntero a la posición indicada, ejemplo = $10 % muestra la posición del puntero en pantalla + incrementa en 1 el carácter (buffer[i]+1) - decrementa en 1 el carácter (buffer[i]+1) _ pone en la posición apuntada el carácter de espacio ' ' @ pone en la posición apuntada el carácter de salto de linea '\ ' & muestra en pantalla el valor ASCII del carácter apuntado . muestra en pantalla el carácter apuntado ! muestra en pantalla el valor real de un dígito apuntado, si no es dígito muestra: ? ( muestra el numero indicado de caracteres en pantalla mientras mueve el puntero hacia adelante ) muestra el numero indicado de caracteres en pantalla mientras mueve el puntero hacia atras { copia en el buffer (arreglo) la cadena literalmente hasta encontrar } excepto que @ = '\ ' no copia saltos de linea ni tabuladores ? obtiene un carácter, dígito, etc. desde el teclado y la guarda en la posición apuntada = pone el contador especial con el número indicado, ejemplos: =10, =&, =! [ repite las instrucciones hasta ] el número de veces indicado en el contador especial " muestra una cadena en pantalla hasta encontrar la otra comilla " sin alterar el buffer # termina el programa. Si no se encuentra el programa termina al final del archivo
Ejemplos de programas
Aquí hay algunos ejemplos de programas sencillos en SUX.
Ejemplo 1 (Hola Mundo)
Usando nuestra instrucción de salida de cadena ":
"Hola Mundo"@.#
Primero mostramos en pantalla la cadena "Hola Mundo!!!" luego almacenamos en el buffer[0] el carácter de salto de línea usando la instrucción @, por último mostramos el salto de línea en pantalla.
Ejemplo 2 (Hola Mundo)
Utilizando solo la primera posición del buffer[0] para escribir Hola Mundo:
H.O.L.A._.M.U.N.D.O.@.#
Este ejemplo escribe cada carácter en buffer[0] y lo pone en pantalla, repite hasta terminar.
Ejemplo 3 (Hola Mundo)
Ahora utilizando el apuntador del buffer para almacenar y mostrar los caracteres:
H>O>L>A>_>M>U>N>D>O>@<<<<<<<<<<.>.>.>.>.>.>.>.>.>.>.>.#
Primero ponemos H en el indice 0 del buffer, continuamos hasta terminar de copiar @ para que el buffer quede buffer[H,O,L,A,_,M,U,N,D,O,@]. Luego regresamos al indice 0 del buffer y ponemos en pantalla cada caracter.
Ejemplo 4 (Hola Mundo)
Otra forma más sencilla es utilizando la instrucción $ y la instrucción (:
$0H>O>L>A>_>M>U>N>D>O>@$0(11#
Primer vamos al indice cero $0 del buffer, luego copiamos la cadena en el buffer, regresamos al principio del buffer con $0 y ponemos en pantalla 11 caracteres usando (11.
también podemos hacerlo en reversa de esta forma:
$0@>O>D>N>U>M>_>A>L>O>H)11#
Ejemplo 5 (Hola Mundo)
Otra forma de hacerlo es usando la instrucción {...}:
$0{HOLA MUNDO!!!@}$0(14#
Esta instrucción nos permite ingresar caracteres que de otra forma no sería posible (excepto utilizando +,-), en este caso se pondrá en pantalla "HOLA MUNDO!!!"..
Ejemplo 6 (Valor ASCII de un caracter)
Este ejemplo muestra el valor ASCII de A, luego le suma uno y muestra B:
$0A." = "&>@."66 = "<+.>.#
Ejemplo 7 (Suma y resta de 2 numeros)
Este ejemplo suma 1+8 y muestra el resultado:
$0"1+8 = "1++++++++!@.#
Otra forma de sumar es usando la instrucción []:
$0"5+4 = "5=4[+]!@.#
Esto pone en el indice 0 el valor 5, pone en el contador especial 4 y repite 4 veces la instrucción +, luego muestra el resultado.
Este ejemplo resta 8-1 y muestra el resultado:
$0"8-2 = "8--!@.#
Ejemplo 8 (Multiplicación de 2 numeros)
En este ejemplo se multiplica 2*3 y se muestra el resultado:
$0"2*3 = "0=2[+++]!@.#
Primero se puso en el indice 0 el valor decimal 0, luego se puso el contador especial a 2 y se repitió 6 veces la instrucción +, que da como resultado 6 el total de la multiplicación.
Ejemplo 9 (Ingreso desde el teclado)
Este ejemplo pide al usuario que presione una tecla y luego le muestra su valor decimal en ASCII:
"Presione una tecla: "$0? "Su valor ASCII es "&@.# >/pre> ===Ejemplo 10 (Suma de numeros ingresados desde el teclado)=== Este ejemplo suma dos dígitos ingresados por el usuario y muestra el resultado: <pre> "Ingrese primer numero: "$0? "Ingrese segundo numero: "$1? "SUMA "$0!"+"$1!" = "$0=!$1[+]!@.#
Código Fuente del Interprete
El interprete es un programa sencillo, no está totalmente optimizado, por ejemplo podría utilizar punteros, ajustar el tamaño del buffer y del arreglo que contiene el programa para que no tenga límite (excepto la memoria de la computadora), etc. Poco a poco iré ajustando el interprete hasta obtener la versión 1.0
Este programa usa la licencia GPL.
SUX 0.1 Código
sux01.c:
/* Programa: SUX version 0.1 Autor: movaxes 2007 Licencia: GPL */ #include <stdlib.h> #include <stdio.h> #include <ctype.h> #define MAX_PROGRAMA 1000 #define MAX_BUFFER 1000 FILE *archivo; unsigned char programa[MAX_PROGRAMA]; unsigned char c; char get = 0; int loop = 0; int siguiente = 0; int ptr = 0; int linea = 1; void terminar(char *str) { printf("ERROR (%i): %s\ ", linea, str); exit(0); } int numero(void) { int num = 0; c = programa[ptr++]; if(isdigit(c)) { while(isdigit(c)) { num = 10*num+c-'0'; c = programa[ptr++]; } } else terminar("se esperaba numero"); get = 0; if(num>=0 && num<=MAX_BUFFER) return num; else terminar("numero excede el buffer"); return 0; } int main(int argc, char *argv[]) { char buffer[MAX_BUFFER]; int i = 0; if(argc!=2) terminar("Uso: sux <archivo.sx>"); if(!(archivo = fopen(argv[1], "rb"))) terminar("No se pudo abrir archivo X("); while(!feof(archivo) && i<=MAX_PROGRAMA) { c = getc(archivo); programa[i++] = c; } programa[i] = '\\0'; i = 0; c = programa[ptr++]; while(c!='#' && i>=0 && i<MAX_BUFFER && ptr>=0 && ptr<=MAX_PROGRAMA) { if(get) c = programa[ptr++]; else get = 1; if(c=='>') { if(i>=0) i++; } else if(c=='<') { if(i>0) i--; } else if(isalpha(c) || isdigit(c)) buffer[i] = c; else if(c=='_') buffer[i] = ' '; else if(c=='@') buffer[i] = '\ '; else if(c=='.') printf("%c",buffer[i]); else if(c=='&') printf("%i",(int)buffer[i]); else if(c=='%') printf("%i",i); else if(c=='$') i = numero(); else if(c=='+') buffer[i] += 1; else if(c=='-') buffer[i] -= 1; else if(c=='=') { c = programa[ptr++]; if(isdigit(c)) { ptr -=1; buffer[MAX_BUFFER] = numero()-1; } else if(c=='&') buffer[MAX_BUFFER] = (int)buffer[i]; else if(c=='!') { if(isdigit(buffer[i])) buffer[MAX_BUFFER] = (buffer[i]-'0')-1; else buffer[MAX_BUFFER] = 0; } } else if(c=='[') siguiente = ptr; else if(c==']') { if(buffer[MAX_BUFFER]>0) { buffer[MAX_BUFFER]--; ptr = siguiente; } } else if(c=='!') { if(isdigit(buffer[i])) printf("%i",buffer[i]-'0'); else printf("?"); } else if(c=='?') { buffer[i] = getchar(); while((c=getchar())!='\ '); } else if(c=='(') { int temp = numero(); while(temp>0) { printf("%c",buffer[i++]); temp--; } } else if(c==')') { int temp = numero(); while(temp>0) { printf("%c",buffer[i]); if(i>0) i--; temp--; } } else if(c=='{') { c = programa[ptr++]; while(c!='}') { if(c=='@') buffer[i++] = '\ '; else if(c=='\ ' || c=='\\t'); else buffer[i++] = c; c = programa[ptr++]; } } else if(c=='/') { c = programa[ptr++]; while(c!='/') c = programa[ptr++];; } else if(c=='"') { c = programa[ptr++]; while(c!='"') { printf("%c",c); c = programa[ptr++]; } } else if(c=='\ ') linea++; } return 0; }
Este es un programa de ejemplo en SUX (test.sx):
; SUX v0.1 AUTOR: MOVAXES 2007 LICENCIA: GPL ; "------------------------- EJEMPLOS: -------------------------"@. "HOLA MUNDO"@. H.O.L.A._.M.U.N.D.O.@. H>O>L>A>_>M>U>N>D>O>@<<<<<<<<<<.>.>.>.>.>.>.>.>.>.>.>. $0H>O>L>A>_>M>U>N>D>O>@$0(11 $0@>O>D>N>U>M>_>A>L>O>H)11 $0{HOLA MUNDO!!!@}$0(14 $0A." = "&>@."66 = "<+.>. $0"1+8 = "1++++++++!@. $0"8-2 = "8--!@. $0"5+4 = "5=4[+]!@. $0"2*3 = "0=2[+++]!@. "Presione una tecla: " $0?"Su valor ASCII es "&@. "Ingrese primer numero: "$0? "Ingrese segundo numero: "$1? "SUMA "$0!"+"$1!" = "$0=!$1[+]!@.
Para compilar en GCC sobre GNU/Linux usa:
$gcc -Wall -O sux01.c -o sux01
Para ejecutar utiliza:
$./sux01 test.sx