Ошибка верхней части кода Bison% - PullRequest
0 голосов
/ 21 февраля 2010

% команда top кода не включает свое содержимое в файл parser.tab.h (так и должно быть, верно?). Бизон версия 2.4.1. В чем проблема с этим (упрощенным) кодом?

%{
  #include <stdlib.h>
  #include <string.h>
  #include <stdio.h>
  #include <io.h>
  #define  YYDEBUG 0
  int  errors;
%}

%code top {

  struct DICT
  {
    char *Name;
    int  Offs;
    int  Size;
    struct DICT *Next;
  };

  typedef struct DICT DICT;

  struct NODE
  {
    int  ID;
    int  Value;
    DICT *Var;
    struct NODE *Left;
    struct NODE *Right;
  };

  typedef struct NODE NODE;
}

%{
  NODE *Tree = 0;

  NODE *Node(int ID, int Value, DICT *Var, NODE *Left, NODE *Right);

  void yyerror(char *s)
  {
    errors++;
    printf("%s\n", s);
  }
%}

  %no_lines

  %union
  {
    int     Value;
    char    *ID;
    NODE    *Node;
  }

EDIT: с "% code требуется" проблема была решена, но возникла другая проблема:

parser.tab.h: 40: ошибка: переопределение 'struct DICT'

parser.tab.h: 47: ошибка: переопределение typedef 'DICT'

parser.tab.c: 145: ошибка: предыдущее объявление DICT было здесь

1 Ответ

1 голос
/ 21 февраля 2010

Использование %code top не вставит код в заголовок, а только в исходный файл. Это хорошо задокументировано здесь .

Я думаю, %code provides (или %code requires) будет более подходящим, потому что он вставляет определения как в исходный файл, так и в заголовочный файл.

...