Проблемы с $$ в Bison - PullRequest
       1

Проблемы с $$ в Bison

0 голосов
/ 05 октября 2011

У меня проблемы с типом, которые я не могу решить в зубре

У меня есть правило грамматики с именем program, и я пытаюсь использовать $$ = new Node("Program");

У меня тип определен как %type <Node> program, класс Node определен в отдельном заголовочном файле, который включен в раздел определения.

Я получаю ошибку error: 'union YYSTYPE' has no member named 'Node', Как мне получить правильные типы для этого?

Ответы [ 3 ]

2 голосов
/ 05 октября 2011

В файле Bison убедитесь, что вы включили Node в% union и используете строчные буквы node для предотвращения конфликтов.Кроме того, вы должны явно указать код заголовка включения в bison, используя пример %code requires

bison (для этого примера я добавил пространство имен)

%code requires
{
#include "node.h"
}

%union {
    ns::Node *node; //notice lowercase node for the type
}

%type <node> program;

 /* If using a high enough version of bison implement a destructor */
%destructor { delete $$; } <node>

%%

program:        /* empty */  { $$ = new ns::Node("Program"); };

...
2 голосов
/ 06 октября 2011

Заголовок должен быть включен в лексер до .tab.h

1 голос
/ 05 октября 2011

Когда вы используете определение %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

Я лично предпочитаю вариант а).

...