Java - Analizador gramatical para evitar excepciones

 
Vista:

Analizador gramatical para evitar excepciones

Publicado por Rakan (43 intervenciones) el 21/12/2018 23:37:33
El titulo de esto asusta un poco haha,
nada, que quería preguntar a los que tengais más experiencia en esto de la programación, si veis viable el proyecto que tengo en mente para estas navidades.

Tengo un programa que recibe un hashmap, como key el nombre de un valor en formato de string, y como valor un decimal.
Luego, una clase usará esos valores, y en caso de que se salgan de ciertos rangos, o que tengan ciertos valores específicos (osea, si cumplen unas condiciones), se lanzará una SomethingWrongException.

Mi objetivo está en, leyendo el texto del archivo que se va a compilar para operar con los valores, poder saber denrto de que rangos tienen que estar esto. La gracia estaría en que un cliente pueda tratar los datos como quiera, y que yo, mediante el programa pueda saber dentro de que rangos generar valores aleatorios de prueba.

Este archivo que opera con los valores que se pasan dentro del hashmap, haría uso de los componentes de sintaxis más básicos, como + - * / == < > = ( ) != if else { } ; para no complicar demasiado las cosas.

Creeis que estoy siendo demasiado ambicioso?
Alguien conoce alguna técnica o libreria que pueda serme de utilidad, para no reinventar la rueda?

Gracias y felices fiestas!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Analizador gramatical para evitar excepciones

Publicado por Agustin (170 intervenciones) el 22/12/2018 00:51:40
Como casi todo en la vida, java es la solución incorrecta para tu problema.

Hay muchas maneras de encarar lo que planteaste. Lo primero que se me viene a la mente es usar un type system más fuerte, empezando por eliminar el uso del HashMap que basicamente es string typing.

Otra posibilidad sería usar APIs de análisis de código. Si entiendo bien tu planteo, lo que vos queres hacer es en tiempo de diseño darle feedback al consumidor de tu librería respecto del resultado posible de su propio código. Es correcto? Si es el caso, te recomiendo usar C# y Roslyn.

Seguramente hay otras formas de hacer lo que planteás, pero estaria bueno que des un ejemplo de cómo sería el "proceso" completo de uso como para tener una idea más acabada de hacia donde apuntás.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-3
Comentar

Analizador gramatical para evitar excepciones

Publicado por Rakan (43 intervenciones) el 22/12/2018 01:20:41
Gracias por la respuesta,
sobre el lenguaje, el analizador sería en Java que es el lenguaje que domino, pero los archivos que el cliente va a tener, donde va a procesar los datos, estarán en una sintaxis como la que menciono anteriormente.
Te dejo un ejemplo en el que la variable A puede ser 5 o entre 10-20, la variable B tiene que ser 1 o 3 o 5 o 10 o 35 y donde la variable C tiene que ser inferior a A. También está una variable que no es de entrada, que complica un poco las cosas, pero se tendría que tener en cuenta igualmente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
A = leerEntradaDeA;
B = leerEntradaDeB;
C = leerEntradaDeC;
 
foo = 0;
final = 0;
 
if (A != 5 && (A < 10 || A > 20) {
	throw SomethingWrongException();
} else {
	foo = 15;
}
 
if (B != 1 && B != 3 && B != 5 && B != 10 && B != 35) {
	throw SomethingWrongException();
} else {
	if (A > 13) {
		foo = foo / 2;
	} else {
		foo = foo + A;
	}
}
 
if (C > A || C = A && foo < 42) {
	throw SomethingWrongException();
} else {
	if (foo + B == 40) {
		final = foo - 1;
	} else {
		final = foo;
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Analizador gramatical para evitar excepciones

Publicado por Agustin (170 intervenciones) el 22/12/2018 02:42:34
Si estás empecinado en hacerlo en un lenguaje tan inadecuado y horrendo como java, lo lamento por vos. Que te sea leve.

si querés te muestro como lo resuelvo en 5 minutos usando C# y una libreria para parsear javascript. Ya que el ejemplo que pusiste es terriblemente similar a javascript.

El approach mas "naive" que podes hacer en 5 minutos es justamente parsearlo y ejecutarlo, proveyendo parametros de entrada en un loop (del 1 al XXXXX para cada parametro de entrada). Obviamente eso no es tan eficaz como analizar el codigo y tirar la justa, pero es mejor que nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-2
Comentar

Analizador gramatical para evitar excepciones

Publicado por Rakan (43 intervenciones) el 22/12/2018 10:10:01
Uau, si puede hacerse con C# tan facilmente, pues entonces vale la pena.
La librería para esto es Roslyn, verdad?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-1
Comentar

Analizador gramatical para evitar excepciones

Publicado por Tom (1831 intervenciones) el 22/12/2018 12:31:07
Si te estoy entendiendo creo que lo estás orientando mal.
En mi opinión, de entrada no tienes forma de saber si lo que ha escrito el cliente corresponde realmente con lo que quiere conseguir. La única manera sería que el propio cliente te proporcionase ya una tabla de valores correctos y otra de valores incorrectos y tú te limitases a pasársela a ese "código" que te ha proporcionado y comprobar que coincide.

Dicho de otra manera. Si tu escribieses un programita que generase un resultado numérico en base a un valor de entrada y quisieras saber si lo has hecho bien ¿ no necesitarías como primera medida una serie de valores de comprobación ?
Si sacaras estos valores de prueba analizando tu propio programa ... no te servirían.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Analizador gramatical para evitar excepciones

Publicado por Rakan (43 intervenciones) el 22/12/2018 16:25:10
Lo que estoy intentando, es obtener los valores y patrones que tienen que cumplir las variables, dentro del código que genera el cliente, para que no se lance una excepción.
Por ejemplo, la fecha de nacimiento y la fecha de hoy, suponiendo que el cliente haga una condición que lanza excepción si la fecha de nacimiento es superior a la fecha actual, para la variable FECHANACIMIENTO aparecería como rango, < HOY, y si además la separación entre la fecha de nacimiento y hoy no puede exceder los 200 años, el rango sería HOY-200 <---> HOY
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Analizador gramatical para evitar excepciones

Publicado por Tom (1831 intervenciones) el 23/12/2018 09:15:43
SI más o menos creo que te entendí, lo que te quise transmitir es que te metes en un fregado que posiblemente no resulte demasiado útil.
Está claro que tu proceso no puede limitarse a un análisis de gramática, debe continuar hasta la semántica y eso es lo complejo.
Si eres capaz de idear un proceso que convierta
(A != 5 && (A < 10 || A > 20)
en algo como:
[,4][6,]
[,9]
[21,]
y luego consigues reducir los rangos a
[,4][6,9][21,] => ERROR
tendrías hecha una parte del trabajo.
Pero créeme, con un lenguaje complejo como el que has usado de ejemplo, la cosa se te va a complicar, y mucho.
Librerias y programas para "parsear" y hacer el análisis gramatical hay bastantes, desde lex y yacc hasta antlr.
Pero estas librerías no van a ir mucho más allá de darte las cosas desglosadas:
conditional (if), expression: word(A) binary_op(!=) expression: word(A) binary_op(<) ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 973
Bronce
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Analizador gramatical para evitar excepciones

Publicado por Agustin (170 intervenciones) el 22/12/2018 19:07:31
Bueno, acá tenés:

Ejemplo 1: parseo "naive" (ingenuo) de codigo javascript usando F#.

https://github.com/agleiva/EjemploParserJs

39 líneas de codigo (incluyendo espacios y comentarios): https://github.com/agleiva/EjemploParserJs/blob/master/Program.fs

Estas 39 lineas de codigo hacen lo siguiente:

1 - parsea la linea de comando y la tranforma en una instancia de un union type.
2 - lee un archivo .js, cuya ruta es provista mediante un parámetro de la linea de comando
3 - ejecuta el código en el archivo .js, pasándo determinados valores y generando errores en caso de que haya fallas.

A partir de eso podés seguir trabajando, por ejemplo para tomar los valores (A, B, C, etc) de otro archivo o pedirlo mediante la linea de comando, etc.

postdata: Invito a todos los noobs y fanboys de este foro a que me muestren una solución similar en java, que tenga las mismas o menos líneas de código y legibilidad que mi solución, y cumpla los mismos 3 pasos que ésta.

Después si tengo tiempo te doy otra alternativa más compleja usando Roslyn.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
-2
Comentar