Bienvenido a la página del lenguaje de programación M#++
Este es un lenguaje amateur un poco parecido a C pero con significativas diferencias. Una de ellas es que no te tienes que preocupar por puntos y comas. ¿Cómo se logra esto? En vez de revisar el final de una expresion para delimitarla, usamos el principio, que además nos indica el tipo de expresión que esta es.
Algunos tipos de expresión son:
[# INICIO (equivalente al main de C, cierra con SALIDA #] )
<@ (equivalente a un printf, se pueden usar llaves para imprimir varias cosas)
@> (equivalente a una asignación -en C se utiliza el caracter igual-, tambien equivalente a un scanf usando {STDIN}, en fin es guardar un valor en una variable)
$NAT, $REL y $REA se usan para declarar variables de esos tipos (NAT es equivalente a int, REA a float y REL son numeros relacionales o fracciones, los cuales no existen en C y aqui se representan como [numerador|denominador] ). Tambien acepta arreglos de una, dos y tres dimensiones.
REGRESA (equivalente a return; de C)
[# (se usa para declarar una funcion, cierra con #] )
[: (se usa para llamar una funcion, cierra con ] )
[! un ciclo (incluye while y do-while)
[? una condicion (incluye IF, IF-ELSE, y SWITCH-CASE)
=p! Ejemplo de comentario !=p
Por si fuera poco diferencia variables globales de locales, realiza operaciones anidadas y ADMITE RECURSION!!!!!! (ver último ejemplo)
Aqui unos ejemplos de códigos:
| =p! Carlos Madrazo P !=p =p! archivo: prueba0.txt !=p[# INICIO <@ { [2|4] {43} [3|6] {61} [2|4]+[3|6] {10} } SALIDA #] |
| =p! Carlos Madrazo P !=p =p! archivo: prueba1.txt !=p$NAT x $REL f [#CAR par_impar {$NAT x} $NAT f @>f x-x/2*2 [? f EQ 0 ? REGRESA ‘P’ :: REGRESA ‘I’ ?] #] [#REL factorial {$NAT x} |
| =p! Carlos Madrazo P !=p =p! archivo: prueba2.txt !=p$NAT valor[100] $CAR pares_o_nones[100] $REL resultado[100] $NAT x i y $REL f [#CAR par_impar {$NAT x} $NAT f @>f x-x/2*2 [? f EQ 0 ? REGRESA ‘P’ :: REGRESA ‘I’ ?] #] [#REL factorial {$NAT x} SALIDA #] |
| =p! Carlos Madrazo P !=p =p! archivo: prueba3.txt !=p$CAR letra[5%10] $NAT vocales numeros i j $NAT s[3] [# INICIO @>i 0 [! i<5 ? -> @>j 0 [! j<10 ? -> =p!<@ {10*(i)+j} linea a capturar !=p @>letra[i%j] { STDIN } =p! <@ {letra[i%j]} !=p @>j j+1 ] @>i i+1 ] @>vocales 0 @>numeros vocales =p! <@ {vocales numeros} 0 0 !=p @>i 0 [! i<3 ? -> @>s[i] 0 @>i i+1 ] @>i 0 [! i<5 ? -> @>j 0 [! j<10 ? -> [? letra[i%j] :: ‘A’ ? @>vocales vocales+1 @>s[0] s[0]+(letra[i%j]-64) :: ‘1’ ? @>numeros numeros+1 @>s[1]=s[1]+(letra[i%j]-48) :: DE_PERDIS ? @>s[2] s[2]+1 ?] @>j j+1 ] @>i i+1 ] <@ {s[0] s[1] s[2]} <@ {vocales numeros} @>i 0 [! i<5 ? -> @>j 0 [! j<10 ? -> <@ {letra[i%j]} @>j j+1 ] <@ {i} @>i i+1 ] SALIDA #] |
| =p! Carlos Madrazo P !=p =p! archivo: prueba4.txt !=p$NAT valores[5%5] $NAT i j $REL s[5] [# INICIO SALIDA #] |
| =p! Carlos Madrazo P !=p =p! archivo: factorial.txt !=p[#NAT factorial {$NAT n} [? n EQ 0 ? REGRESA 1 :: REGRESA n*[:factorial n-1] ?] #] [# INICIO $NAT x @>x {STDIN} <@ { [:factorial x] } SALIDA #] |
Se utilizaron PCYACC y PCLEX para que generara un codigo intermedio y una tabla de variables, y posteriormente en una segunda fase código ensamblador para nasm, el cual necesita un archivo de macros para ensamblar (ver tutoriales).
Ejemplo de un .bat para construir y compilar todo:
pcyacc -d proy3py.y
pclex proy3pl.l
cl /FePROY3P proy3pl.c proy3py.c
pcyacc -d cfinaly.y
pclex cfinall.l
cl /FeCFINAL cfinall.c cfinaly.c
pcyacc -d cfinal2y.y
pclex cfinal2l.l
cl /FeCFINAL2 cfinal2l.c cfinal2y.c
PROY3P < factorial.txt
CFINAL < codint.txt
CFINAL2 < codint.txt
nasmw codfin.asm -fwin32
cl /Fefactorial codfin_main.cpp codfin.obj
echo TERMINO COMPILACION