Tarea:
Debe crear un intérprete que pueda analizar fragmentos de un lenguaje de programación. El lenguaje no necesita ser complejo, pero debe incluir los siguientes elementos sintácticos:
- Posibilidad de asignar y leer las variables (podría ser tan simple como
a
-z
siendo las variables prefabricados) - Si las declaraciones (elseif y else no son necesarias)
- Bucles (contando a un número arbitrario, no se requiere acceso de usuario al contador)
- Matemáticas simples con variables (suma, resta, multiplicación, división, mayor / menor que, igual)
- Imprimir declaraciones
Reglas:
- No puede copiar la sintaxis de otro idioma popular.
- Necesita escribir su propio intérprete, no la modificación de otro intérprete.
- Puede escribir su intérprete en cualquier idioma.
- Escriba un programa de ejemplo de 99 botellas de cerveza en su idioma (ver aquí )
- Este es un concurso de popularidad , por lo que gana la respuesta más votada.
popularity-contest
interpreter
parsing
TheDoctor
fuente
fuente
Respuestas:
DogeScript
El programa de 99 botellas de cerveza:
El intérprete PHP:
La sintaxis tal como está actualmente:
Probarlo aquí .
Cualquier sugerencia de mejora es bienvenida.
fuente
BrainBack: un lenguaje compilado basado en pila que se ejecuta en BrainFuck
Nota: Las especificaciones se cambiaron de "crear un analizador" a "crear un intérprete" después de publicar esta respuesta. Esta respuesta es un compilador que también analiza el código fuente.
El nombre es un juego de palabras con Back, que es lo opuesto a un lenguaje basado en pila bien conocido y Brain indica su naturaleza esotérica. Se parece un poco a BrainFuck (aunque no lo es), pero su compilador se ejecuta en BrainFuck y su código de objeto compilado termina como binarios de BrainFuck.
El lenguaje: * == destruye sus argumentos
"constant"
impresiones constantes#
imprime la parte superior de la pila como número>
duplica la parte superior de la pila<num>
empujar un número constante<num>
como valor a la parte superior de la pila<
quitar la parte superior de la pila-
restar más arriba del segundo más alto *+
agregar de arriba al segundo de arriba *!
no alterna positivo / cero *[ ... ]
hace un tiempo la parte superior de la pila no es cero, muy similar a BrainFuck99 botellas de cerveza con la letra correcta en BrainBack:
El compilador BrainBack, escrito en Extended BrainFuck
Para compilar BrainBack:
Para compilar un programa BrainBack:
Ejecute el binario:
Aquí uso bf que está disponible en la mayoría de las distribuciones de Debian.
beef
y otros pueden ser utilizados también. Tanto el compilador EBF, BrainBack como su código objeto se convierten en binarios BrainFuck bastante compatibles.Probablemente debería extenderse para imprimir una celda como ascii
.
, poder leer un byte,
y tener variasswap
operaciones para que sea más útil. Es absolutamente necesario para hacer un compilador o intérprete BrainBack en BrainBack.fuente
€
Paso la mayor parte de mi tiempo en scripts PHP y me trajo una pregunta: ¿por qué me veo obligado a usar
$
mis nombres de variables?€
es mi moneda local, ¡así que usémosla! Como € se usa en muchos países, utilicé algunas palabras de los idiomas de la UE como palabras clave.Palabras claves:
gleich
es igual en alemánmientras
es mientras en españoltopo
es mayor en portugués (actualización: debería ser mayor en su lugar, gracias a daHugLenny por el consejo)odejmowanie
es restar en polacoafficher
se imprime en francésnl
, y el TLD deNETHERLANDS
esnl
, así queNETHERLANDS
definí una constante para mostrar nuevas líneasHice trampa un poco ya que no hay una
if
palabra clave, elegí imprimir directamente las últimas dos líneas.Intérprete en Python
El intérprete no hará más que ejecutar el guión para mostrar 99 botellas de cervezas.
Para ejecutarlo, guarde ambos archivos y luego ejecute el archivo Python con el
.eu
script como argumento:fuente
topo
es el mejor en portugués1Lang
1Lang es un lenguaje de prefijo funcional como LISP o Scheme, pero sin paréntesis, lo que hace que sea un poco más difícil de leer cuando se eliminan todos los espacios en blanco innecesarios. Los paréntesis se pueden eliminar ya que todas las funciones y operadores toman un número conocido de parámetros.
Se requieren llaves para delimitar el cuerpo de la función y las consecuencias condicionales y bloques de código alternativos que pueden consistir en una lista de declaraciones.
En LISP, Factorial podría definirse así:
en 1Lang esto sería
que puede reducirse a
1Lang actualmente no admite efectos secundarios.
1Lang está escrito en bash, por lo que actualmente comparte algunas limitaciones de bash, como el rango de enteros.
NB: las listas no están completamente implementadas.
Los enteros son enteros bash (creo que hasta -2 ^ 32 a 2 ^ 31-1). Los números negativos no se pueden usar directamente. Para ingresar un negativo, restarlo de cero. p.ej. -5 se ingresaría como -0 5. Esta limitación se debe a que 1Lang es un trabajo en progreso y no se necesitaban números negativos para esta aplicación. Estoy considerando usar ~ como operador negativo unario que permitiría que -5 se ingrese como ~ 5.
Se requiere espacio en blanco para delinear enteros. p.ej. +2 3
Los nombres de parámetros de función pueden sobrecargar las variables de los llamadores. Todas las variables asignadas dentro de una función son locales.
La impresión no es necesaria (aunque podría ser útil) porque, al igual que LISP, cada declaración devuelve un valor y se imprime el último valor devuelto.
Un comportamiento inesperado de la notación de prefijo sin paréntesis es que la concatenación de cadenas puede ser realmente fácil de escribir. Digamos que quieres concatenar
"a" " quick" " brown" " fox"
, uno podría escribir:Pero un método más legible y menos propenso a errores es este:
o
99 botellas de código de cerveza:
La función B devuelve "No más botellas" o "1 botella" o "botellas" dependiendo de x.
La función F devuelve versos normales o verso final. Un verso normal se concatena con el siguiente verso recursivamente llamando a F con -x1. Cuando x es 0, F devuelve el verso final.
Esto genera (para F5 lo que significa comenzar con 5 botellas de cerveza ...):
1 Intérprete de lenguaje (escrito en bash) en menos de 500 líneas.
fuente
@Mfxy{fxy}M+3 4
funcionara, pero luego debes unir la función y el espacio de nombres variable. Tomó un tiempo calcular 99 cervezas: pcons
puedamap
M\x{*x2}C1C2C3C4/ => (2 4 6 8)
Mitad (intérprete / traductor en Windows Batch)
No sé por qué estoy respondiendo tantos rompecabezas en el lote de Windows, por alguna razón enferma creo que lo estoy disfrutando: P De todos modos, esto es similar a algo en lo que trabajé por diversión hace un tiempo, un lenguaje básico que es traducido al lote de Windows por un script que también está escrito en el lote de Windows. No es particularmente sorprendente, pero funciona.
99 botellas de cerveza
Sintaxis
Solo se reconocen tres fichas en cada línea, separadas por espacios.
# es un comentario.
En la mayoría de los casos donde se necesita un valor, a
$
en el segundo token significa que el tercero debe tratarse como un nombre de variable, mientras que a~
denota un valor literal. Instrucciones generales toman la forma<instruction> [$~] <name>
. Establecer una variable toma la misma forma, pero se implementa cuando no se reconoce.Comandos definidos:
print
ywrite
ambos escriben salida, perowrite
no agrega una nueva línea. Necesita $ o ~.mark
crea un punto que se puede saltar o llamar como una subrutina.jump
equivalente de goto en lote (o cualquier idioma para el caso).proc
llama a una subrutina. Equivalentecall :label
.return
regresa de una subrutina. Saldrá del programa cuando no esté dentro de uno.if
instrucción condicional Toma una comparación de la siguiente línea, en el formulario<var1> <operator> <var2>
. Los operadores son los mismos queif
en lote, es decir.EQU, NEQ, LSS, LEQ, GTR, GEQ
. Ejecutará instrucciones después de eso solo si la comparación es verdadera.endif
termina una declaración if.cat
concatena dos variables.cat a b
almacenará el valor de ab en a.Cuando no se encuentra ninguno de estos comandos, la expresión se trata como una asignación de variable, utilizando el primer token como el nombre de la variable.
$
y se~
comportan igual que enprint
, pero también hay un@
identificador. Esto trata el último token como una expresión matemática, pasada aset /a
. Incluye a la mayoría de los operadores. Si no se encuentra ninguno de los tres identificadores, se trata de un error de sintaxis y el intérprete sale.Intérprete (lote de Windows)
El intérprete en realidad traduce el código en lotes de Windows, lo coloca en un archivo temporal y lo ejecuta. Si bien reconoce los errores de sintaxis en el medio idioma, el script por lotes resultante puede causar problemas, especialmente con caracteres especiales como paréntesis, barras verticales, etc.
fuente
Bisonte Flex
Asignar variable, si no, bloque de condición y alguna otra operación de suma, resta.
Archivo laxical
lex.l
Archivo analizador
com.y
Compilar
correr
compilador in.txt ou.txt
Fichero de entrada
a = 3 + (4 * 7) -9; imprimir a; c = a + 45; imprimir c;
** Este es el comentario guardar c;
** guardar c en el archivo imprimir c * (a + 32);
Archivo de salida 67
fuente
Interprete
Para obtener instrucciones sobre cómo ejecutar este código, eche un vistazo a mi otra respuesta: /codegolf//a/19935/13186
99 botellas de cerveza
El programa
fuente
99ISC
99ISC utiliza una memoria orientada a enteros de tamaño arbitrario. La memoria está indexada por un entero no negativo. Todos los valores en la memoria se inicializan con su dirección. P.ej. En tiempo de ejecución, la dirección 0 contiene el valor 0 y la dirección 9 contiene el valor 9.
99ISC tiene dos instrucciones. El primero imprime la rutina de 99 Botellas de cerveza en la pared. Su sintaxis es una sola línea, como se muestra a continuación. La ejecución continúa con la siguiente línea del programa.
La segunda instrucción es una instrucción "restar y ramificar si no es igual a cero". Su sintaxis es una sola línea, como se muestra a continuación.
x
es la dirección del número a ser operado,y
es la dirección del número que se resta yz
es la siguiente línea a ejecutar si el resultado de la resta no es cero. De lo contrario, la ejecución continúa con la siguiente línea.La presencia de la instrucción "restar y bifurcar si no es cero" convierte al 99ISC en un OISC (One Instruction Set Computer) y, por lo tanto, Turing se completa.
Aquí hay un programa que borra los primeros 10 valores en la memoria y luego imprime la rutina 99 Botellas de cerveza en la pared.
Y aquí hay un intérprete 99ISC, en Python.
fuente
Te doy:
Pequeño intérprete de conjunto de instrucciones (SISI)
La sintaxis se basa en BASIC y ensamblaje. Tiene cuatro declaraciones:
set
,print
,jump
(Goto incondicional), yjumpif
(Goto condicional). Cada declaración debe estar precedida por un número de línea. Los tipos de datos admitidos son enteros y cadenas.El intérprete en sí se puede encontrar en Python 3 en Github (sisi.py). El programa de 99 botellas de cerveza también está allí, pero lo reproduciré aquí:
fuente
Pogo
https://github.com/nrubin29/Pogo
fuente
i
y lo configuro igual a 99. Luego, mientras i es mayor que 0, imprimoi bottles of beer on the wall
y resto uno dei
. Si el problema es que me faltan algunas de las letras, puedo agregar más.