8
votes

Comment puis-je écrire un analyseur dans C ou Objective-C sans générateur d'analyseur?

J'essaie de faire une calculatrice en C ou de l'objectif-C qui accepte une chaîne le long des lignes de xxx

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?


0 commentaires

7 Réponses :


1
votes

Je pense que cela se rapproche de ce que vous voulez: http://www.codeproject.com/kb/recipes/alxparser.aspx


0 commentaires

2
votes

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);
   }


0 commentaires

0
votes

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 voulez coder un analyseur à partir de zéro, soyez prêt que cela pourrait être «un projet de semestre long».

Vous aurez besoin de goûter, d'analyser, de construire un arbre d'expression abstrait, d'évaluer, etc.

Nous avons utilisé Langues de programmation de Louden: Principes et pratiques . Je l'ai aimé. Bien que cela ne soit pas fait le meilleur travail de vous promener dans le processus de mise en œuvre.

Bien sûr, cela serait plus que "coding à partir de zéro". Vous auriez besoin de faire une grammaire, puis de construire un analyseur pour traiter les règles ... Mis à part une activité d'apprentissage, je ne sais pas pourquoi vous voulez faire cela.


0 commentaires


4
votes

Dave Delong's La classe DDMathathParser peut vous faire gagner beaucoup de temps et problème.


0 commentaires

2
votes

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;
}


1 commentaires

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)



0
votes

Utilisation de l'objectif-C Nslinguisticicger peut être une bonne solution xxx


1 commentaires

Veuillez éditer votre message et formater un peu pour le rendre lisible (essayé mais perdut perdu ;-)