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?

È stato utile?

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:

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top