Pregunta

Estoy escribiendo alguna aplicación de consola C ++ de Excel para la tarea. Mi aplicación debería poder aceptar fórmulas para sus celdas, por ejemplo, debería evaluar algo como esto:

Sum(tablename\fieldname[recordnumber], fieldname[recordnumber], ...)

tablename\fieldname[recordnumber] points to a cell in another table, 
fieldname[recordnumber] points to a cell in current table

o

Sin(fieldname[recordnumber])

o

anotherfieldname[recordnumber]

o

"10" // (simply a number)

algo así. las funciones son Sum, Ave, Sin, Cos, Tan, Cot, Mul, Div, Pow, Log (10), Ln, Mod

Es patético, lo sé, pero es mi tarea: '(

Entonces, ¿alguien sabe un truco para evaluar algo como esto?

¿Fue útil?

Solución

Ok, buena pregunta de tarea por cierto.

Realmente depende de qué tan pesado quieras que sea. Puede crear un analizador de expresiones completas (que es divertido pero también consume mucho tiempo).

Para hacer eso, debe describir la gramática completa y escribir una interfaz (eche un vistazo a lex y yacc o flexx y bison.

Pero como veo su pregunta, puede limitarse a tres subcajas:

  • un valor simple
  • una búsqueda (posiblemente a otra tabla)
  • una función cuyas entradas son búsquedas

Creo que un pequeño diseño OO puede ayudarte aquí.

No estoy seguro de si tiene que lidiar con actualizaciones en tiempo real y comprobaciones de dependencia circulares. De lo contrario, también pueden ser complicados.

Otros consejos

Para el análisis, miraría el análisis de descenso recursivo. Luego, tenga una tabla que asigne todos los nombres de funciones posibles a punteros de función:

struct FunctionTableEntry {
    string name;
    double (*f)(double);
};

Deberías escribir un analizador. El analizador debe tomar la expresión, es decir, cada línea y debe identificar el comando y construir el árbol de análisis. Esta es la primera fase. En la segunda fase, puede evaluar el árbol sustituyendo los datos de cada elemento del comando.

Los respondedores anteriores lo han golpeado en la cabeza: necesita analizar el contenido de la celda e interpretarlos .

StackOverflow ya tiene una gran cantidad de preguntas sobre cómo compilar compiladores e interpertores donde puede encontrar punteros a los recursos. Algunos de ellos son:

y así sucesivamente.

Aparte: nunca tengo la energía para vincularlos a todos, o incluso tratar de crear una lista completa.

Supongo que no puede usar yacc / lex (o similar), por lo que debe analizar " manualmente " ;:
Iterar sobre la cuerda y dividirla en sus partes. Lo que es una parte depende de su gramática (sintaxis). De esa manera puede encontrar los nombres de las funciones y los parámetros. La dificultad de esto depende de la complejidad de su sintaxis.

Tal vez debería leer un poco sobre análisis léxico .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top