2016-12-17 4 views
0

Я пытаюсь работать над программой, которая принимает математическое выражение от пользовательского ввода (2 + 2, 3 * 1, 4-2, 2 + 3 * 1 и т. Д.). Я получил его для работы с простым , одна операция, но она еще не работает с несколькими. Мне было предложено маркировать и оценивать строку, и пока мне удалось ее подделать, пособие, которое я читаю, не объясняет, как оценивать (я пытаюсь учиться самостоятельно, без работы для меня) и google hasn ' Было очень полезно.Как оценить токены в C?

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

} 

Это то, что я имею в коде до сих пор. ЛЮБАЯ помощь была бы высоко оценена, спасибо.

+0

Исследуйте рекурсивные парные анализаторы. –

ответ

0

Вы должны реализовать парсер для выражений, проанализировать вход и оценить порядок уравнений так, чтобы, например, 2 + 2 * 2 равно 6, а не 8.

Итак, давайте рассмотрим пример 2 + 2 * 2. Представьте себе, что математические операции могут быть выражены двумя способами, так что a*b - *(a,b) и c+d - +(c,d). Поэтому, если у вас есть выражение a+b*c, оно будет оценено как +(a,*(b,c)). Это один из способов добиться этого.

Вы также можете найти хорошее объяснение на LR parser wiki page (тип анализатора снизу вверх).

Если вики-страница недостаточно, просто найдите top-down и bottom-up парсеры.

Смежные вопросы