2016-10-13 12 views
0

У меня есть эта проблема, когда мой файл YACC, похоже, не имеет доступа к типам, определенным в моем заголовочном файле.Yacc union on struct type

Если я заменю файл заголовка на %code requires{ }, он распознает его, но это не совсем то, что я хочу.

Мой st.h заголовочный файл:

struct node { 
    int item; 
    int identifier; 
    struct node *left; 
    struct node *middle; 
    struct node *right; 
}; 

typedef struct node NODE; 
typedef NODE *TREE; 

Мой parser.y файл:

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include "st.h" 
%} 

%union { 
    int value; 
    TREE token; 
} 

Yacc (или С) дает мне эту ошибку:

error: unknown type name ‘TREE’

Я понимаю что это, скорее всего, ошибка на моем конце, и я был бы очень признателен за любую помощь.

+0

Примечание: ** никогда никогда ** 'typedef' указатель! И прочитайте [ask], укажите ** всю ** необходимую информацию. Не должно быть никаких проблем, чтобы указать ** точное ** сообщение об ошибке, с которого оно происходит, и где оно возникает. – Olaf

+0

Это yacc или C, который дает ошибку? (Подсказка: какая команда была запущена, когда была создана ошибка?) И если это C, имеет ли ошибка файл сгенерированный yacc/bison или файл, который сгенерирован (f) lex? (Подсказка: сообщение об ошибке будет иметь имя файла рядом с ним.) – rici

+0

Также: [mcve]. Представленный код компилируется правильно. – rici

ответ

1

Вы, вероятно, получаете эту ошибку при попытке скомпилировать какой-либо другой исходный файл (НЕ файл парсера), в котором есть #include "y.tab.h". Проблема состоит в том, что, поскольку ваш использует типы, определенные в st.h, вам всегда нужно #include "st.h" ПЕРЕД #include "y.tab.h" в каждом файле, который хочет включить его.