c - 如何评估C中的token?

标签 c token c-strings evaluate

我正在尝试开发一个程序,该程序从用户输入中获取数学表达式(2+2、3*1、4-2、2+3*1 等),我已经让它可以使用简单,一次操作,但还不能同时进行多个操作。有人建议我对字符串进行标记和评估,虽然我设法对它进行标记,但我正在阅读的手册没有解释如何评估(我正在尝试自己学习,没有给我做作业),而谷歌还没有解释如何评估非常有帮助。

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

}

这是我到目前为止所拥有的代码。任何帮助将不胜感激,谢谢。

最佳答案

您必须为表达式实现一个解析器,分析输入并评估方程的顺序,以便例如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 上找到很好的解释。 (一种自下而上的解析器)。

如果 wiki 页面不够,只需查找 top-downbottom-up解析器。

关于c - 如何评估C中的token?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41199192/

相关文章:

c# - ASP.net - Azure AD - Request.IsAuthenticated 总是 false 为什么?下一个

c固定内存池实现

c++ - 整型变量的奇数 C/C++ 初始化语法

c - YUV420 到 RGB 颜色转换错误

计算 C 中 txt 文件中字符串出现的次数(0-9)

c - 当在其条件中使用赋值和后缀运算符时,while 循环如何工作

c - 标记字符串并将其作为数组返回

c - 如何检测最后一个额外的空行并在 C 中忽略它(使用 getc)

django-rest-auth 重置密码 uid 和 token

laravel - 为什么Laravel 4 CSRF token 不起作用?