Incluir struct na união% def com Bison / Yacc
Pergunta
Eu estou tentando incluir uma estrutura como parte da união com Bison, mas eu recebo um erro no 'struct nó args' em% união:
parser.y:17: error: field ‘args’ has incomplete type
O Código:
struct node {
char * val;
struct node * next;
};
%}
%union {
char * string;
struct node args;
}
%token <string> CD WORD PWD EXIT
%type <args> arg_list
Alguém sabe o que estou fazendo de errado?
Solução
Mesmo melhor, use a diretiva% código com o "requer" opção, ou seja:.
%code requires {
struct node {
char * val;
struct node * next;
};
}
%union {
char * string;
struct node args;
}
Isso irá incluir o código no "exige" bloco no arquivo tab.h, bem como o arquivo de origem analisador.
A partir da documentação: http://www.gnu.org /software/bison/manual/html_node/Decl-Summary.html#Decl-Summary
- requer
- Objectivo: Este é o melhor lugar para código dependência gravação necessário para YYSTYPE e YYLTYPE. Em outras palavras, é o melhor lugar para definir tipos referenciado em directivas% sindicais e é o melhor lugar para se sobrepor YYSTYPE padrão do Bison e YYLTYPE definições.
Outras dicas
Tudo se resume à saída coxo y.tab.h você começa.
É preciso corrigir isso, garantindo que "nó struct" é definido antes de incluir qualquer lugar y.tab.h.
Para fazer isso criar um node.h arquivo com a definição struct.
Em seguida, incluem node.h antes y.tab.h em seu arquivo parser.l, arquivo parser.y, bem como quaisquer arquivos c você tem que incluem y.tab.h. Este é um pouco irritante.
Como alternativa, você pode mudar "struct nó args" para "nó struct * args" desde que você não precisa saber o tipo completo até que você vá para usá-lo em algum lugar. Não sei se isso se encaixam com o seu código.
Qualquer um deve funcionar.
Talvez mais simples (eu acho) - usado isso mesmo:
%union {
char c;
struct {
char name[30];
int type;
} s;
}
Então, em flex você pode usar "yylval.s.name", ou "yylval.s.type", etc .. enquanto no bisonte, em vez de $$=0, $1=bla
... agora você pode escrever $<s.type>$=0 , $<s.type>1=bla...