Включите структуру в определение %union с помощью Bison/Yacc.

StackOverflow https://stackoverflow.com/questions/1430390

  •  07-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь включить структуру как часть объединения с 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...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top