yacc: e - "tac.y" 的第 85 行,一个标记出现在产生式的 lhs 上

yacc: e - line 85 of "tac.y", a token appears on the lhs of a production

错误的确切含义是什么: yacc: e - "tac.y" 的第 85 行,一个标记出现在生产的 lhs 上

第 85 行:

T:  INT { strcpy($$.type,"int"); }
            |
             REAL { strcpy($$.type,"real"); }

我已将属性关联到 T

%union{
  struct attribute{
    char name[20];
    char type[20];
  }attr;
}
%token <attr> ID
%token <attr> E
%token <attr> T

意思就是它所说的:您正在尝试提供 令牌 的派生。标记来自词法分析,因此它们不能有与之关联的语法规则。

我猜你是想声明 T 的(语义值)类型:

%type <attr> T

您可能还需要更改 E 的声明。

避免这种混淆是通常使用 ALL_CAPS 表示终端(令牌)和 lower-case 表示 non-terminals 的原因之一。