Calculador (Mini) en Java

MiniCalculus… :P
Pues con la novedad que hoy tuve un poco de tiempo y viendo el post de @JaimeItlzc

Me decidí a jugar un poquito y crear mi propia calculadora.

¿Cómo se usa? Para declara una nueva variable usamos ‘rd’ seguido de un espacio en blanco y una palabra como ‘a’ y finalizando con ‘;’ o el carácter que más te guste : ). Toma el valor de 0 por omisión:
 
Para asignar un valor a ‘a’ puede ser otra variable o un número:

 

 

Para imprimir el valor de una variable usamos 'wr' y las mismas reglas.

Se le asigna el valor de retorno a la variable de la izquierda, incluso puedes asignar un número como variable algo como.
 

 

Soporta las operaciones {+, -, *, /}
Dejo el código y luego espero comentarlo bien y arreglar un poco el desorden.

 

 

 

 

 

 

 
@OscarRyz un parecido con Ryz es mera coincidencia jejejejeje hasta en las mejores familias pasa el plagio : P

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de rodrigo salado anaya

: ( Tiempo

Espero tener tiempo para hacerlo más bonito y re-factorizar como loco y ... y .. casi casi llegar a esto

En realidad solo fue un taller de practica, NO LO USES COMO TAREA jajaja o tu profe te va a regañar por lo feo del código...
Los nombre y todo lo demás esta muy improvisado y no deja claro que hace cada clase y los métodos ( lo hice en muy poco tiempo ... se nota no?).

Ahhh vaya ya entendí.. .. a

Ahhh vaya ya entendí.. .. a ver... si le movemos aquí...
y luego por acáaaaa..

tenemos. que...

a ver ahista para que sea interactivo "REPL" ( read , evaluete, print loop )

Ahí va el cambio:

 

Así ya lee de la entrada estándar y se comporta de forma interactiva.

:) :)

Je je está divertido.

Ja ja ja que onda con tu

Ja ja ja que onda con tu stack:

 

jejej estaba buscando donde estaba el push y el pop y mira nomás... :) :)

Me pregunto si...

Nap, no pude, me falta mucho

Nap, no pude, me falta mucho para traducirlo a Ryz :P

Chau!

Imagen de rodrigo salado anaya

Stack?

Jajaja ja si que chafis no? La idea en un inicio era hacer una pila.... Pero pues luego se me van las cabras.

:O súper Osacar y modificaste muy poquito :), gracias por darle un ratito y si fue divertido hacer esta calculadolla.
:)

Si me imagino que así

Si me imagino que así empezaste y luego... Ahh.. que diablos

Está muy bien, estoy leyendo la parte de "tables de símbolos" justo para algo como lo que estás haciendo y se oye requete fácil.

Luego que empiece a hacer algo más "correcto" posteo.

¿Que onda con tu otro proyecto?

Saludos.

Imagen de rodrigo salado anaya

Si súper por ...

Si súper por lo de la tabla de símbolos y hacerca de mi abbidb ammmm pues espero meterle mas galleta y dejar la flojera :S pero aun sumamente inmaduro :( .

Si estaría padre saber que tienes planeado para las tablas de símbolos.

Esto va en otro hilo pero será luego. Como le hacen los desarrolladores de lenguajes como scala para pasar su código a bytecode que entienda la JVM? Busque en Google pero no encuentro mucho ... Solo es por curiosidad.

Pues si tienes un AST que es

Pues si tienes un AST que es un representación en memoria de tu programa, puedes reescribir eso en cualquier cosa, lo puedes escribir en otro lenguaje ( ejemplo CofeeScript escribe JavaScript ) O en bytecode ( como Java ) o directamente en ensamblador como C.

Por ejemplo ( y por decir algo porque no lo conozco ) para declarar un entero llamado i escribirias en byte code:

 

Poooooor decir algo, para saber exactamente que instrucción corresponde checa esto:

Esto es lo que hacen las herramientas como javassist, y etc.

Cuando sepa más escribo sobre esto.

:)

Imagen de greeneyed

Para hacerlo más formal...

Para hacerlo algo más formal que usar expresiones regulares que identifiquen las cadenas, puedes usar algo como ANTLR o similares para obtener el AST. De hecho el típico ejemplo con el que explican los analizadores lexicos/sintácticos suele ser una mini-calculadora :)

S!

Exacto. En ANTRL ( y supongo

+1 por el link

Exacto.

En ANTRL ( y supongo que en todos los contexto de lenguajes ) se les llama "reglas de producción" definidas en una gramática. Difieren de la expresiones regulares en que... ¬¬ la verdad no sé exactamente ( como explicarlo pues ), quizá en que pueden no ser regulares.

Por ejemplo un AST para la expresion:

 

Sería algo tipo:

 

Porque el operador "*" tiene precedencia ( alguién tiene idea de ¿POR QUE le dieron más precedencia a estos simbolos? )

Tabién se puede representar la operación pensandola como llamadas a funciones:

 

O si se mueve el primer parentesis a la izq y se reemplaza el nombre de la funcion por el token correspondiente se tendría algo similar a la sintaxis de LISP.

 

En el libro Language Implementation Patterns ( aquí está el prefacio si alguien le interesa ) escrito por el autor de ANTLR, explica como construir el AST a partir de las reglas de producción usando ANTLR o a manita. Esta muy interesante.

Imagen de rodrigo salado anaya

Gracias a ambos...

Gracias a ambos por la información, intente un ejemplo con ANTLR pero no me salio (: ( ) aun así me doy una idea (cultura general) de como funciona todo esto.

Bueno no queda más que intentar de nuevo.

Ciao : )

Por cierto IntellJ IDEA tiene

Por cierto IntellJ IDEA tiene un plugin que se llama "ANTRL works" que es una herramienta para visualizar tus gramática y todo eso:

Ejemplo:

Pero claro, para poder sacarle provecho a todo eso hay que tener la teoría primero y al menos saber como funciona un Parser hecho a mano.

Imagen de greeneyed

Si te sirve de algo...

Definir una gramática de un lenguaje es parecido a definir un DTD, por si alguna vez has trabajado con eso (de hecho un DTD es la definicion de un mini-lenguaje en XML). Es basicamente descomponer las sentencias en trozos que a su vez se descomponen en más trozos... recursivamente hasta llegar a los elementos finales.

La "complicación" para entenderlo está normalmente en la parte de recursividad que tiene, ya que definir una operacion de suma, por ejemplo, no es simplemente definir a + b, ya que hay poder reconocer a + (b *c), por ejemplo, y a su vez (d-e) + (b+c), y a su vez ((d-e) + (b+c)) + (f % g) etc. etc. Es una especie de expresiones regulares + recusividad.

Y como dice OscarRyz, esa es "solo" la parte de leer el código fuente y obtener el AST (Abstract Syntax Tree, de ahí lo del arbol). Luego del AST puedes generar código (bytecode, por ejemplo) o puedes ejecutarlo directamente (caso de un intérprete). Tambien se le pueden hacer optimizaciones, dado el caso.

En mis tiempos me tocó hacer un pseudo-pascal en castellano, para hacerlo diferente del Pascal normal :), pero me tocó hacerlo en ADA, ¡toma esa!, con unas herramientas parecidas.

Otra opción más "cool" hoy en día para algunas cosas es hacerse un DSL (lenguaje específico de dominio...o de dominio específico según a quien le preguntes :D). Pero para eso van mejor los lenguajes dinámicos como por ejemplo Groovy, en lugar de Java.

S!