J'essaie de faire une calculatrice en C ou de l'objectif-C qui accepte une chaîne le long des lignes de et renvoie la réponse 2920. Je préférerais ne pas utiliser de générateur comme Lex ou Yacc, donc je veux la coder de la terre. Comment devrais-je faire ça? Outre le livre de dragon, existe-t-il des textes recommandés qui couvrent ce sujet? P> P>
7 Réponses :
Je pense que cela se rapproche de ce que vous voulez: http://www.codeproject.com/kb/recipes/alxparser.aspx p>
Si je me souviens bien, vous pouvez résoudre ce problème avec deux piles, une pour les opérateurs, l'autre pour les opérandes.
// OPTR stack: store operators // OPND stack: store operands // OP: predefined set of operators OperandType EvaluateExpression(){ InitStack(OPET);Push(OPTR,'#'); initStack(OPND);c=getchar(); while(c!='#'||GetTop(OPTR)!='#'){ if(!In(c,OP)){Push((OPND,c);c=getchar();} //Push to stack if not operator else switch(Precede(GetTop(OPTR),c){ //Top element in stack has a lower priority case '<': Push(OPTR,c); c=getch(); break; case '=': Pop(OPTR,x); c=getch(); break; //Pop top element and push back the calculated result case '>': Pop(OPTR,theta); Pop(OPND,b); Pop(OPND,a); Push(OPND,Operate(a,theta,b)); break; } } return GetTop(OPND); }
Je l'ai fait dans la CSE340: Introduction à la programmation de languines dans ma junior Année de CS au collège. Donc, si vous vraiment em> voulez coder un analyseur à partir de zéro, soyez prêt que cela pourrait être «un projet de semestre long». p>
Vous aurez besoin de goûter, d'analyser, de construire un arbre d'expression abstrait, d'évaluer, etc. p>
Dave Delong's La classe DDMathathParser peut vous faire gagner beaucoup de temps et problème. p>
L'algorithme de coureurs de courage a déjà été mentionné. L'autre classique est une descente récursive simple. Voici un assez court que j'ai écrit il y a de nombreuses années:
#include <stdio.h> #include <string.h> #include <stdlib.h> void expression(void); void show(int ch) { putchar(ch); putchar(' '); } int token() { int ch; while (isspace(ch=getchar())) ; return ch; } void factor() { int ch = token(); if (ch == '(') { expression(); ch = token(); if (ch != ')') { fprintf(stderr, "Syntax error. Expected close paren, found: %c\n", ch); exit(EXIT_FAILURE); } } else show(ch); } void term() { int ch; factor(); ch = token(); if (ch == '*' || ch == '/') { term(); show(ch); } else ungetc(ch, stdin); } void expression() { int ch; term(); ch = token(); if (ch == '-' || ch=='+') { expression(); show(ch); } else ungetc(ch, stdin); } int main(int argc, char **argv) { expression(); return 0; }
La cour et les recdes ne sont pas mutuellement exclusives. En fait, ils sont généralement combinés. La cour de la courage est utilisée pour les expressions (où les recdes sont inefficaces) et des recdes pour tout le reste (puisqu'il est plus puissant et général)
Utilisation de l'objectif-C Nslinguisticicger peut être une bonne solution
Veuillez éditer votre message et formater un peu pour le rendre lisible (essayé mais perdut perdu ;-)