2010-04-01 92 views
10

Quiero evaluar una expresión en C++. Para evaluarlo, quiero que la expresión se convierta a formato de prefijo.Infijo de C++ a conversión de prefijo para condiciones lógicas

Aquí es un ejemplo

wstring expression = "Feature1 And Feature2"; 

Éstos son posibles maneras.

expression = "Feature1 And (Feature2 Or Feature3)"; 

expression = "Not Feature1 Or Feature3"; 

Aquí Y, O, palabras y paréntesis ("(", )) No están reservados se utilizan para el alcance

No tiene mayor precedencia

Y es s et al lado precedencia a no

O se establece en la próxima prioridad a Y

ESPACIO BLANCO utilizado para delimitador. Expresión tiene no otros elementos como TAB, NEWLINE

I No necesitan aritméticas expresiones. Puedo hacer la evaluación, pero ¿alguien puede ayudarme a convertir las cadenas en notación de prefijo?

+0

Por convención TAB y nueva línea se han tipos de espacios en blanco. ¿Realmente quisiste decir el personaje SPACE? Por favor aclare su pregunta con esa información. –

+0

La conversión de infix a prefix es una tarea ordenada, pero inútil en el mundo real.Opciones: (A) Parche infijo e ir (B) Parse infijo, traducir al prefijo, producir prefijo, parsear prefijo, ir. Incluso si el prefijo de análisis es más fácil, el proceso _conversion_ es más lento. –

Respuesta

-1

Utilice un generador de analizador como el par Lex/Yacc.

+0

Tengo más miedo del tipo de analizadores Lex/Yacc. Sabía que existen, pero no sé cómo usarlos de manera eficiente. –

3

Tendrá que construir la gramática por adelantado. Entonces, ¿por qué hacer todo el análisis a mano? En su lugar, use una biblioteca de compilador de analizador como Boost-Spirit. O lex/yacc o flex/bison.

Luego use el AST generado por el creador del analizador para mostrar los datos de la forma que mejor le parezca. Tales como infijo a prefijo o postfijo, ... etc.

1

Supongo que su intención es evaluar la condición. por lo tanto, no necesita un analizador completo.

Antes que nada, no necesita trabajar con cadenas aquí. 1. Convertir "Característica 1" quiere decir un ID (Número entero que representa una característica)

Por lo tanto, la declaración "Feature1 And (Feature2 Or Feature3)"; decir (1 & (2 | 3) A partir de aquí ... se puede utilizar el estándar Infijo para prefijar la conversión y evaluar la notación del prefijo th.

Aquí es el algoritmo para convertir infija para prefijar http://www.c4swimmers.esmartguy.com/in2pre.htm http://www.programmersheaven.com/2/Art_Expressions_p1

+1

para evaluar una condición, debe analizar el texto ... por lo tanto, se necesita un analizador de algún tipo ... Además, la conversión de infijo a prefijo requiere un análisis ya que se deben conocer las reglas de asociatividad y la precedencia de los operadores para hacer ti. correctamente ... –

+1

No digamos que no necesitamos analizar. Dije que no necesitamos un analizador completo como lex/yacc. hacer un infijo para prefijar la conversión usando esto es una broma. es decir, no necesitamos construir AST en este caso. – SysAdmin