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?

Foi útil?

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...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top