2016-12-17 75 views
0

我试图从一个程序,需要从用户输入(2 + 2,3 * 1,4-2,2 + 3 * 1等)的数学表达式我已经得到它与简单,一个操作,但它不适用于多个。我被建议标记和评估字符串,当我设法标记它时,我正在阅读的手册没有解释如何评估(我试图自己学习,没有为我做功课),谷歌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-downbottom-up解析器。