2016-12-17 1 views
0

Ich versuche, an einem Programm zu arbeiten, das einen mathematischen Ausdruck von Benutzereingaben nimmt (2 + 2, 3 * 1, 4-2, 2 + 3 * 1, usw.) Ich habe es mit einfach zu arbeiten , eine Operation, aber es funktioniert noch nicht mit mehreren. Ich wurde vorgeschlagen, die Zeichenfolge zu tokenisieren und zu bewerten, und während ich es geschafft habe, sie zu tokenisieren, erklärt das Handbuch, das ich lese, nicht, wie man es bewertet (ich versuche alleine zu lernen, keine Schulaufgaben für mich) und google hasn ' t war super hilfreich.Wie Token in C zu bewerten?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() { 
    char conta[255]; 
    int n1; 
    int n2; 
    int result; 
    char op; 

    printf("Introduza uma expressao numerica: "); 
    gets(conta); 
    sscanf(conta, "%d %c %d", &n1, &op, &n2); 
    char* token = strtok(conta, "+-*/"); 
    while (token) { 
    printf("token: %s\n", token); 
    token = strtok(NULL, "+-*/"); 
    } 
    if(op == '+'){ 
    printf("%d", result=n1+n2); 
    }else if(op == '-'){ 
    printf("%d", result=n1-n2); 
    }else if(op == '*'){ 
    printf("%d", result=n1*n2); 
    }else if(op == '/'){ 
    printf("%d", result=n1/n2); 
    } 

} 

Dies ist, was ich bisher von dem Code habe. Eine Hilfe wäre sehr willkommen, danke.

+0

Untersuchung über rekursive Abstiegsparser. –

Antwort

0

Sie müssen einen Parser für Ausdrücke implementieren, die Eingabe analysieren und die Reihenfolge der Gleichungen so auswerten, dass z. 2 + 2 * 2 ist 6 und nicht 8.

Also lasst uns das 2 + 2 * 2 Beispiel untersuchen. Stellen Sie sich vor, dass mathematische Operationen auf zwei Arten ausgedrückt werden können, so dass a*b*(a,b) und c+d+(c,d) ist. Also, wenn Sie den Ausdruck a+b*c haben, würde es zu +(a,*(b,c)) ausgewertet werden. Dies ist eine Möglichkeit, dies zu erreichen.

Sie können auch eine nette Erklärung zu einem LR parser wiki page (eine Art Bottom-Up-Parser) finden. Wenn die Wiki-Seite nicht ausreicht, suchen Sie einfach nach top-down und bottom-up Parsern.