Valutazione delle espressioni in C ++
-
20-08-2019 - |
Domanda
Sto scrivendo qualche app console C ++ simile a Excel per i compiti. La mia app dovrebbe essere in grado di accettare formule per le sue celle, ad esempio dovrebbe valutare qualcosa del genere:
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)
qualcosa del genere. le funzioni sono Sum, Ave, Sin, Cos, Tan, Cot, Mul, Div, Pow, Log (10), Ln, Mod
È patetico, lo so, ma sono i miei compiti: '(
Quindi qualcuno conosce un trucco per valutare qualcosa del genere?
Soluzione
Ok, bella domanda a casa comunque.
Dipende davvero da quanto pesante vuoi che sia. È possibile creare un parser di espressioni complete (che è divertente ma anche che richiede tempo).
Per fare ciò, devi descrivere la grammatica completa e scrivere un frontend (dai un'occhiata a lex e yacc o flexx e bison.
Ma quando vedo la tua domanda puoi limitarti a tre sottotasi:
- un valore semplice
- una ricerca (possibilmente su un'altra tabella)
- una funzione i cui input sono ricerche
Penso che un po 'di design OO possa aiutarti qui.
Non sono sicuro che tu debba occuparti dei controlli di aggiornamento circolare e delle dipendenze in tempo reale. Altrimenti possono anche essere difficili.
Altri suggerimenti
Per l'analisi, guarderei l'analisi della discesa ricorsiva. Quindi disponi di una tabella che associa tutti i possibili nomi di funzioni ai puntatori di funzione:
struct FunctionTableEntry {
string name;
double (*f)(double);
};
Dovresti scrivere un parser. Il parser dovrebbe prendere l'espressione cioè ogni riga e dovrebbe identificare il comando e costruire l'albero di analisi. Questa è la prima fase. Nella seconda fase è possibile valutare l'albero sostituendo i dati per ciascun elemento del comando.
I rispondenti precedenti l'hanno colpito in testa: devi analizzare i contenuti della cella e interpretarli .
StackOverflow ha già una serie di domande sulla costruzione di compilatori e interpreti in cui è possibile trovare puntatori alle risorse. Alcuni di essi sono:
- Imparare a scrivere un compilatore (# 1669 persone!)
- Risorse di apprendimento su parser, interpreti e compilatori
- Quali sono le buone risorse per la compilazione?
- Riferimenti necessari per l'implementazione di un interprete in C / C ++
- ...
e così via.
A parte: non ho mai l'energia per collegarli tutti insieme, né provo nemmeno a costruire un elenco completo.
Suppongo che non sia possibile utilizzare yacc / lex (o simili), quindi è necessario analizzare "manualmente":
Scorrere la stringa e dividerla nelle sue parti. Qual è una parte dipende dalla tua grammatica (sintassi). In questo modo è possibile trovare i nomi delle funzioni e i parametri. La difficoltà dipende dalla complessità della sintassi.
Forse dovresti leggere un po 'di analisi lessicale .