Hm, esto es independiente del idioma, preferiría hacerlo en C# o F #, pero esta vez me interesa más la pregunta "¿Cómo funcionaría eso de todos modos?".¿Cómo codificaría un analizador de fórmulas complejas manualmente?
Lo que quiero lograr ist:
a) quiero aprender que - se trata de mi ego esta vez, es para un proyecto divertido donde quiero mostrar mi mismo que soy una muy buena en este cosas
b) Sé un poquito acerca de EBNF (aunque todavía no sé cómo funciona la precedencia del operador en EBNF - Irony.NET lo hace bien, he comprobado los ejemplos, pero esto es un poco ominoso para yo)
c) Mi analizador debería ser capaz de tomar esto: 5 * (3 + (2 - 9 * (5/7)) + 9) por ejemplo y darme los resultados correctos
d) Para ser franco, este parece ser el mayor problema al escribir un compilador o incluso un intérprete para mí. No tendría problemas para generar código de ensamblador de 64 bits (PUEDO escribir el ensamblador manualmente), pero el analizador de fórmulas ...
e) Otra idea: incluso computadoras simples (como mi antiguo Sharp 1246S con solo 2kB de RAM)) puede hacer eso ... no puede ser tan difícil, ¿verdad? E incluso muy, muy viejos lenguajes de programación tienen evaluación de fórmula ... BASIC es de 1964 y ya podían calcular el tipo de fórmula que presenté como ejemplo
f) Algunas ideas, algunas inspiraciones serían realmente suficientes - Simplemente no tengo ni idea de cómo hacer la precedencia del operador y los paréntesis, SÍ, SÍ, sé que implica un AST y que muchas personas usan una pila
Entonces, ¿qué opinas?
¡Oh, eso ayuda mucho! No estoy del todo seguro acerca de "más fácil" todavía, pero ... ;-) – StormianRootSolver
Code golf no es la mejor manera de aprender a hacer algo como esto. O, de hecho, para aprender cualquier cosa que no sea código de golf. Pero tienes razón en que el análisis de expresiones no es la parte más difícil. –
En general, el código de golf no lo es. Sin embargo, varias de las respuestas están codificadas con bastante claridad, y como no son muy largas, se puede aprender mucho de ellas. –