c - 在标记的联盟上 dispatch

标签 c struct switch-statement unions

我正在使用 C 标记 union 样式结构来表示 AST 节点。它们看起来像这样:

struct A_var_ {
  enum {
    A_simpleVar,
    A_fieldVar,
    A_subscriptVar
  } kind;

  A_pos pos;

  union {
    S_symbol simple;

    struct {
      A_var var;
      S_symbol sym;
    } field;

    struct {
      A_var var;
      A_exp exp;
    } subscript;
  } u;
};

现在,我正在尝试按节点类型进行分派(dispatch),如下所示:

switch(node->kind) {
  case A_simpleVar:
    ...
}

但是,我收到类似无法解析变量 A_simpleVar 的错误。我怎样才能做到这一点?我在 Windows 上使用 Cmake,编译器是 gcc。

对于以下代码,我遇到的具体错误:

struct expty transExp(S_table venv, S_table tenv, A_exp a)
{
  switch (a->kind) {
    case A_letExp:
      struct expty exp;
      A_decList d;
      S_beginScope(venv);
      S_beginScope(tenv);
      for (d = a->u.let.decs; d; d=d->tail) {
        transDec(venv, tenv, d->head);
      }
      exp = transExp(venv, tenv, a->u.let.body);
      S_endScope(tenv);
      S_endScope(venv);
      return exp;

    case A_opExp:
      A_oper oper = a->u.op.oper;
      struct expty left = transExp(venv, tenv, a->u.op.left);
      struct expty right = transExp(venv, tenv, a->u.op.right);
      if (oper == A_plusOp) {
        if (left.ty->kind != Ty_int)
          EM_error(a->u.op.left->pos, "integer required");
        if (right.ty->kind != Ty_int)
          EM_error(a->u.op.right->pos, "integer required");
        return expTy(NULL, Ty_Int());
      } // I need to cover other operators as well, but not for prototype
  }
}

是:

C:\Users\Fotis\Documents\Devel\grimoire\Books\ModernCompilerC\semant.c: 在函数 'transExp' 中: C:\Users\Fotis\Documents\Devel\grimoire\Books\ModernCompilerC\semant.c:28:7: 错误:标签只能是语句的一部分,声明不是语句 结构expty exp; ^ C:\Users\Fotis\Documents\Devel\grimoire\Books\ModernCompilerC\semant.c:29:7: 错误:“A_decList”之前的预期表达式 A_decList d; ^ C:\Users\Fotis\Documents\Devel\grimoire\Books\ModernCompilerC\semant.c:32:12: error: 'd' undeclared (第一次在这个函数中使用) 对于 (d = a->u.let.decs; d; d=d->tail) {

注意函数的参数是指向typedefed 结构的指针可能也很重要。即 A_expA_exp_ *

最佳答案

您正在使用 C++ 编译器进行编译,而不是 C 编译器。两者处理枚举的方式不同。

在 C 中,所有枚举在全局范围内都是可见的。在 C++ 中,它们由包含类型限定(如果有)。因此,您需要在枚举值前加上结构名称:

switch(node->kind) {
  case A_var_::A_simpleVar:
    ...
}

关于c - 在标记的联盟上 dispatch ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43667326/

相关文章:

c - 读一个C文件,多读一行,为什么?

c# - Testand - 通过使用 C DLL 的 C# 包装器使用 C# DLL

c - C 中结构的动态内存分配问题

c++ - 为什么在另一个案例中允许在 block 内使用 case 语句?

c++ - 开关盒 vs if else

c - 如何在 C 中实现 Go 的 defer() 以便允许声明变量?

c - 如何使用指向结构体的指针调用函数?

C:将数据值读入结构

复合结构的 JSON 编码(marshal)处理,均实现 MarshalJSON()

ios - 如果某种类型在 swift 中传递给函数,则尝试返回 nil