Digamos que he escrito una función para evaluar una operación matemática simple, y tengo alguna entrada del usuario en una cadena como: "1 + [2 + [3 + 4]]" ¿Cómo puedo analizar estos corchetes y extraer primero el texto más interno (3 + 4), evaluarlo y luego analizar las llaves externas (2 + 7)? Tengo una comprensión rudimentaria de la búsqueda y reemplazo de Regex, pero sé que no harán recursiones como esta. Me gustaría un código java básico para hacer esto, no otro jarrón/API más si puedo evitarlo.método de java para analizar expresiones anidadas
Respuesta
La manera más limpia de lograr su objetivo es escribir un Lexer y un analizador para este fin. Escribir un recursive descent parser no es tan difícil de hacer desde el principio para las expresiones aritméticas.
Existen numerosos ejemplos de código en la web. This is an example que podrías usar como inspiración.
El Lexer está allí para normalizar su entrada y para resumirla en una secuencia de tokens. De esta forma, su analizador solo necesita trabajar con tokens en lugar de tener que lidiar además con problemas de espacio en blanco y otras cosas molestas.
Twoexamples para algoritmos de alto nivel que se basan en la pila, another example que muestra un enfoque de descenso recursivo.
creo expresión regular no es una buena opción para conseguir esta funcionalidad
Debe convertir la expresión usuario de sufijo o prefijo de notación y luego construir un árbol de expresión de ellos. Este es un enfoque estándar en CS (idioma en realidad no importa aquí) para resolver este problema de una manera limpia
recursividad funciona bien para ellos:
int parse(String expression){
//use a regex to find an instance of [ followed by numbers/operators, followed by ]
//replace it with parse(whatever's inside the brackets)
//continue until there are none left
//evaluate the string (which should be a sequence of numbers and operators without brackets)
}
uso de una pila. Cuando encuentre un corchete abierto, inserte lo que esté trabajando en la pila y comience la nueva expresión. Cuando tocas un corchete de cierre, abre la pila y usa la expresión que acabas de calcular como el siguiente elemento. O, como han dicho los carteles anteriores, usa recursividad o un árbol.
Para Java, puede usar JavaCC para analizador sintáctico/lexer. Lo he usado en numerosos proyectos. Es bastante fácil de usar. Uno de los ejemplos, creo, incluye un análisis aritmético. JavaCC construirá el árbol de sintaxis por el que podría pasar.
Probar la aritmética usando JavaCC daría una buena introducción a la Gramática sin contexto y al concepto de Árbol de sintaxis abstracta. Si está aprendiendo, entonces es un buen paso tomar después de probar lo que @emboss sugirió
- 1. Java: cómo analizar doble de expresiones regulares
- 2. de expresiones regulares para analizar Hashtags en Java
- 3. ¿Cómo puedo usar pyparsing para analizar expresiones anidadas que tienen múltiples tipos de apertura/cierre?
- 4. ¿Cómo usar expresiones regulares para analizar HTML en Java?
- 5. Usando Parsec para analizar expresiones regulares
- 6. Cómo analizar una cadena sin expresiones regulares
- 7. expresiones regulares para analizar los números de coma flotante internacionales
- 8. Usar expresiones regulares para analizar HTML: ¿por qué no?
- 9. ¿Cuál es el algoritmo para analizar expresiones en notación infija?
- 10. ¿Hay alguna biblioteca para analizar "expresiones numéricas" como 1,2-9,33- en Java
- 11. ¿Patrón de Java para devoluciones de llamada anidadas?
- 12. Coincidencia de estructuras anidadas con expresiones regulares en Python
- 13. Árboles de expresiones Java
- 14. analizador de expresiones booleanas en java
- 15. Java: clases anidadas no estáticas y instance.super()
- 16. Java expresiones regulares reemplazar
- 17. Evaluador de expresiones recursivas usando Java
- 18. Argumentos Java expresiones regulares
- 19. Reflexión para clases anidadas
- 20. Assembly.GetTypes() para clases anidadas
- 21. Método sin bloqueo para analizar XML en python
- 22. Método para analizar el documento HTML en Ruby?
- 23. analizar los objetos JSON anidadas con Marco JSON para Objective-C
- 24. Cómo analizar WSDL en Java?
- 25. API Java para analizar el archivo de esquema XSD
- 26. Herramienta para analizar grandes volcados de heap Java
- 27. Recorrer un método C# y analizar el cuerpo del método
- 28. analizar una cadena que contiene caracteres de escape utilizando Java
- 29. Java: Spring Framework: Declarar anidadas Mapas
- 30. ¿Cómo cargar clases anidadas en Java?
Relacionado: https://stackoverflow.com/questions/3422673/evaluating-a-math-expression-given-in-string -formar – Boann