从抽象语法树将字母字符更改为数学符号

Changing from letter characters to mathematical symbols from an Abstract Syntax Tree

对于我的 C class 最终项目,我们要将反向波兰表示法等式从反向波兰表示法更改为其相应的中缀形式。我目前遇到的问题是我正在尝试兼顾字符和整数,因为 +、-、/ 和 * 等参数分别作为 A、S、D 和 X 传递。

我相当确定我对我的类型做了一些非常愚蠢的事情,这导致了这个问题,但是目前当我输入 ./rpcalc 5 4 A it returns 0 5 4 时。虽然我在技术上希望它返回 A 5 4,我的最终目标是将 A 作为加法符号返回。但是,我似乎无法让它通过当前测试,因为我给它的所有字母都返回为 0。我做错了什么?

下面是我用来表示堆栈和树的两个结构节点:

struct snode{
  int datum;
  struct snode* bottom;
};

struct tnode
{
  int datum;
  struct tnode* left;
  struct tnode* right;
};

我还使用相当标准的推送、查看和弹出功能,如下所示:

int
peek(struct snode *stack){
  return stack -> datum;
}

struct snode*
pop(struct snode*stack){
  struct snode* tmp = NULL;
  if(stack == NULL){
    return NULL;
  }else{
    tmp = stack -> bottom;
    stack -> bottom = NULL;
    free(stack);
    stack = tmp;
    return stack;
  }
}

struct snode*
push(struct snode *stack, int x){
  struct snode* tmp = NULL;
  tmp = (struct snode*)malloc(sizeof(struct snode));
  tmp -> bottom = stack;
  tmp -> datum = x;
  stack = tmp;
  return stack;
}

为了构建抽象语法树,我使用了 2 个函数,create_node 和 gen_tree,如下所示。

struct tnode*
create_node(int x){
  struct tnode* tmp;
  tmp = (struct tnode*)malloc(sizeof(struct tnode));
  tmp -> datum = x;
  tmp -> right = NULL;
  tmp -> left = NULL;
  return tmp;
}


struct tnode*
gen_tree(struct snode *S){
  if(S==NULL){
    return NULL;
  }else{
    int top;
    top = peek(S);
    if(isdigit(top)){
      S = pop(S);
      return create_node(top);
    }else{
      struct tnode *root = create_node(top);
      S = pop(S);
      root -> right = gen_tree(S);
      S = pop(S);
      root -> left = gen_tree(S);
      return root;
    }
  }
}

最后,我的 main final 从 argv 获取参数并将它们放入堆栈。一旦完全生成此堆栈(已读取 argv 的所有参数),它就会使用它们生成树。之后,出于测试目的,在我尝试编写函数以使用此树生成中缀函数之前,我使用 print_table 函数打印 table。

int main(int argc, char*argv[]){
  int i = 1;
  struct snode*stack;
  struct tnode *AST;

  while(argv[i] != NULL){
    stack = push(stack, atol(argv[i]));
    i++
  }

  AST = gen_tree(stack);
  print_table(AST);

  return 0;
}

void
print_table(struct tnode*AST){
  if(AST != NULL){
  print_table(AST->left);
  printf("%d", AST->datum);
  print_table(AST->right);
}

就像我说的,我很确定我只是在用我的类型做一些非常愚蠢的事情,我只是不确定如何正确地传递信息。我应该做什么?非常感谢!

如果您要存储整数或运算符,那么 int 肯定不是 datum 的正确数据类型。也许有两个成员 intvalopval?另外你不应该盲目地将 argv[i] 传递给 atol 因为 atol returns 0 如果它没有找到任何数字(例如当你传递它时 "A") .