2010-02-18 41 views
9

Estoy escribiendo una aplicación que permite a un usuario ingresar una expresión booleana. Necesito la capacidad de evaluar la expresión booleana ingresada en tiempo de ejecución y estoy buscando tanto un analizador como un validador expressoin.Boolean y Math Expression Parser

Analizador
El analizador tiene que tomar una expresión booleana como una cadena y devolver verdadero/falso.

Ejemplo:

 
string expression = "(1 == 1) && (1 > 0)"; 
Parser parser = new Parser(); 
boolean result = parser.parse(expression); // Result should be True. 

Además de manejar expresiones booleanas también lo necesito para manejar Math.

 
expression = "((1 + 1 * 2) == 1)"; 
result = parser.parse(expression); // Result should be False. 

Validar
De modo que pueda indicar al usuario si hay un problema con la frase siendo entré También necesito una manera de validar la sintaxis.

Estoy trabajando en C# utilizando .NET Compact Framework, pero si conoce algo escrito en otro idioma que puede ser útil.

Gracias por cualquier ayuda que pueda proporcionar. Tom

Respuesta

3

http://www.antlr.org

gramáticas Antlr pueden ser diseñados para permitir tanto el análisis y la evaluación.

He aquí un ejemplo: http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator

+0

+1 para ANTLR. Si miras esto y lo descartas, pensando que esto es demasiada molestia, reconsidera. Te recomiendo que uses ANTLRworks como una herramienta de desarrollo de gramática y que emita sus clases lexer y analizador en tu árbol de proyectos de Visual Studio. Es relativamente sencillo y es fácil ajustar de forma iterativa tu gramática y ver rápidamente sus efectos en tu mundo .NET. –

+0

Al decir "usted" arriba, me refiero a Thomas, el OP. –

+0

@ Chris Farmer: Este es el objetivo de C# Compact Framework ... podría ser un poco pesado para eso ... – t0mm13b

0

No conozco ninguna biblioteca que lo facilite, pero aquí solo tiene dos subproblemas. Necesitas construir un convertidor infijo a postfix, luego escribir una calculadora básica para las operaciones booleanas y matemáticas.

Una vez que haya construido su árbol booleano/pila, comience a realizar operaciones. Si tiene algo que no es un número, evalúelo enviando la cadena/expresión a la calculadora aritmética que realiza la conversión infijo-> postfijo y luego devuelve un valor.

Si busca en google "infix to postfix" y "stack rpn calculator", probablemente pueda encontrar más recursos.

+2

Sin embargo, si puede pagar en un idioma con "eval", el problema está resuelto. Busca verdadero o falso, y para todo lo demás, sabe que es inválido. –

+0

Creo que "eval" es completamente el camino equivocado. Es potencialmente fácil, pero es arriesgado permitir que las personas escriban cualquier código que sea legal en su idioma. Es mejor, en mi humilde opinión, tener una gramática distinta y limitada que esté disponible para estas expresiones. –

0

Puede usar la biblioteca dotMath para hacer esto.

0

Aquí es un excelente analizador de evaluación sobre Codeproject, que utiliza el método eval y no se basa en CodeDOM ni nada de eso. He aquí un excelente artículo sobre la construcción de una expression evaluator usando Antlr, también en el mismo sitio ..

Espero que esto ayude, Saludos cordiales, Tom .

0

Este es el pan y la mantequilla de F #. Puede intentarlo. Para el análisis, use el descenso recursivo, luego puede ejecutar el árbol resultante. Si tiene control del idioma de entrada, puede salir adelante con una operación de cotización.

2

Suponiendo que usted puede cambiar su sintaxis ligeramente, dejó una base de datos integrada haga el trabajo por usted con una consulta como la siguiente T-SQL:

select case when <Expression> then 1 else 0 end as Result 

Usando su ejemplo:

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result 
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result 
+1

De acuerdo con la pregunta, la expresión es realmente ingresada por el usuario. Por lo tanto, su solución es propensa a la inyección SQL. –

6

Nuestro proyecto está usando NCalc (con ANTLR debajo para leer/analizar) y estamos muy contentos con él.

NCalc es un evaluador de expresiones matemáticas en .NET. NCalc puede analizar cualquier expresión y evaluar el resultado, incluyendo los parámetros estáticos o dinámicos y funciones personalizadas.

Nuestra aplicación requiere que se compile de forma cruzada para marcos completos y compactos. Con ajustes relativamente simples, pudimos hacer que NCalc y ANTLR funcionaran para ambos sabores de framework.