Когда вы используете определение %type
, сгенерированный синтаксический анализатор предполагает, что YYSTYPE (тип, который содержит проанализированные промежуточные значения, такие как $$
или $1
), является объединением с полем с тем же именем, чем тип. Таким образом, ожидается, что объединение YYSTYPE имеет поле с именем Node
.
Во-первых, поскольку похоже, что Node
уже является именем класса, вы должны использовать другой идентификатор для своего типа бизона:
%type <node> program
Тогда у вас есть два варианта:
a) Используйте %union
для определения определения YYSTYPE:
%union {
Node *node;
//other types
}
b) Определите макрос YYSTYPE для реального типа YYSTYPE, обычно, но не обязательно, для объединения:
union yystype {
Node *node;
//other types
}
#define YYSTYPE yystype
Я лично предпочитаю вариант а).