Yacc, структура указателей в союзе - PullRequest
1 голос
/ 11 мая 2019

По какой-то причине структурные указатели в объединении, по-видимому, не определены, хотя я заранее включил .h.

%{
#include "agent.h"
.
.
.
%}
%union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr};
.
.
.
%%

Однако определения функций, которые используют такие структурные указатели в #include "agent.h", работают нормально.Почему я получаю сообщение об ошибке:

y.tab.h:58:15: error: unknown type name ‘ASTnode’
 typedef union {int iValue; char sIndex; ASTnode *nPtr; litNode *litPtr; ruleNode *rulePtr; exprNode *expPtr; actNode *actPtr; conNode *conPtr} YYSTYPE;
               ^
y.tab.h:58:15: error: unknown type name ‘litNode’
y.tab.h:58:15: error: unknown type name ‘ruleNode’
y.tab.h:58:15: error: unknown type name ‘exprNode’
y.tab.h:58:15: error: unknown type name ‘actNode’
y.tab.h:58:15: error: unknown type name ‘conNode’

, хотя я включил файл .h?

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 12 мая 2019

Компилятор жалуется на неопределенный тип (ASTnode), который, вероятно, вы определили как struct, но не с typedef (в C ++ структура автоматически получает тип, определенный с тем же именем, ноэто не так в C) или что вы ошиблись при использовании его в предложении %union yacc.

Проблема не имеет ничего общего с yacc.Вы используете тип, который нигде не объявлен.Найдите определение типа ASTnode в ваших заголовках.Возможно, вам не хватает где-то typedef.

То же самое относится к типам

  • litNode
  • ruleNode
  • exprNode
  • actNode
  • conNode

. Эти типы являются типами приложений, которые необходимо определить перед их использованием в созданном типе union.Скорее всего, они определены в файле .h, который необходимо включать в начале каждого файла, в который вы включаете сгенерированный файл y.tab.h, и в часть C (файл, окруженный %{ и %}), чтобы получитьдоступ компилятора к этим определениям типов.

0 голосов
/ 11 мая 2019

Кажется, мне нужно включить файл .h до объявления о включении y.tab.h.Итак, я должен также включить .h в файл Lex перед вызовом include "y.tab.h"

...