Question

J'écris pour la maison des applications de console C ++ similaires à Excel. Mon application devrait pouvoir accepter des formules pour ses cellules. Par exemple, elle devrait évaluer quelque chose comme ceci:

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

ou

Sin(fieldname[recordnumber])

ou

anotherfieldname[recordnumber]

ou

"10" // (simply a number)

quelque chose comme ça. les fonctions sont Sum, Ave, Sin, Cos, Tan, Cot, Mul, Div, Pow, Log (10), Ln, Mod

C'est pathétique, je sais, mais c'est mon devoir: '(

Alors, est-ce que quelqu'un connaît un truc pour évaluer quelque chose comme ça?

Était-ce utile?

La solution

Ok, bonne question de devoirs au fait.

Cela dépend vraiment du poids que vous souhaitez que cela soit. Vous pouvez créer un analyseur d'expression complet (ce qui est amusant mais prend beaucoup de temps).

Pour ce faire, vous devez décrire la grammaire complète et écrire une interface (consultez Lex et Yacc ou Flexx et Bison.

Mais comme je vois votre question, vous pouvez vous limiter à trois sous-cas:

  • une valeur simple
  • une recherche (éventuellement vers une autre table)
  • une fonction dont les entrées sont des recherches

Je pense qu'un peu de design OO peut vous aider ici.

Je ne sais pas si vous devez gérer l'actualisation en temps réel et les contrôles de dépendance circulaires. Sinon, ils peuvent être difficiles aussi.

Autres conseils

Pour l'analyse, je regarderais l'analyse de la descente récursive. Ensuite, ayez une table qui mappe tous les noms de fonction possibles aux pointeurs de fonction:

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

Vous devriez écrire un analyseur. L’analyseur doit prendre l’expression, c’est-à-dire chaque ligne, et doit identifier la commande et construire l’arbre d’analyse. C'est la première phase. Dans la deuxième phase, vous pouvez évaluer l’arbre en substituant les données pour chaque élément de la commande.

Les répondants précédents l'ont frappé: vous devez analyser le contenu des cellules et les interpréter .

StackOverflow a déjà toute une série de questions sur la construction de compilateurs et d'interperteurs dans lesquels vous pouvez trouver des pointeurs sur des ressources. Certains d'entre eux sont:

et ainsi de suite.

A part: je n'ai jamais l'énergie de les relier tous, ni même de tenter de construire une liste complète.

Je suppose que vous ne pouvez pas utiliser yacc / lex (ou autre), vous devez donc analyser "manuellement":

Itérer sur la chaîne et la diviser en ses parties. Ce qu’une partie dépend de votre grammaire (syntaxe). De cette façon, vous pouvez trouver les noms de fonction et les paramètres. La difficulté de ceci dépend de la complexité de votre syntaxe.

Peut-être devriez-vous en savoir plus sur la l'analyse lexicale .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top