Включите структуру в определение %union с помощью Bison/Yacc.
Вопрос
Я пытаюсь включить структуру как часть объединения с Bison, но получаю ошибку в «аргументах узла структуры» в %union:
parser.y:17: error: field ‘args’ has incomplete type
Код:
struct node {
char * val;
struct node * next;
};
%}
%union {
char * string;
struct node args;
}
%token <string> CD WORD PWD EXIT
%type <args> arg_list
Кто-нибудь знает, что я делаю неправильно?
Решение
Еще лучше использовать директиву %code с опцией «requires», т.е.:
%code requires {
struct node {
char * val;
struct node * next;
};
}
%union {
char * string;
struct node args;
}
Сюда будет включен код из блока «requires» в файле tab.h, а также исходный файл парсера.
Из документации: http://www.gnu.org/software/bison/manual/html_node/Decl-Summary.html#Decl-Summary
- требует
- Цель:Это лучшее место для написания кода зависимостей, необходимого для YYSTYPE и YYLTYPE.Другими словами, Это лучшее место для определения типов в директивах %union, и Это лучшее место для переопределения YYSTYPE и YYLTYPE Bison по умолчанию Определения.
Другие советы
Это сводится к полученному неудачному выводу y.tab.h.
Это нужно исправить, убедившись, что " struct node " определяется до того, как вы включите y.tab.h в любом месте.
Для этого создайте файл node.h с определением структуры.
Затем включите node.h перед y.tab.h в свой файл parser.l, файл parser.y, а также любые ваши файлы c, которые включают y.tab.h. Это немного раздражает.
В качестве альтернативы вы можете изменить " struct node args " " struct node * args " так как вам не нужно знать полный тип, пока вы не будете использовать его где-то. Не уверен, подходит ли это вашему коду.
Любой из них должен работать.
Может быть, проще (я думаю) - использовал это сам:
%union {
char c;
struct {
char name[30];
int type;
} s;
}
Затем в flex вы можете использовать " yylval.s.name " или " yylval.s.type " и т. д., находясь в зубре, вместо $$=0, $1=bla
... теперь вы можете написать $<s.type>$=0 , $<s.type>1=bla...