Я использую yacc для анализа одного файла и сохранения записей в RAOperator
объект класса с использованием yacc.
Я включил соответствующий заголовочный файл в файл yacc и определил указатель на RAOperator
объект в директиве% union в файле yacc. Но при компиляции выдает ошибку
следующее:
exp.y:12:28: error: expected type-specifier before ‘;’ token
Я прилагаю файл YACC, где объединение используется с классом RAoperator.
%{
#include "RA.h"#include"y.tab.h"
%}
%union
{
char *strng;
vector<string> *atr;
RAoperator* asdf; // This is where error is shown
vector < vector <string> > *table;
}
Это файл RA.h, в котором определен RAoperator.
class RAoperator
{
public:
vector< vector<string> > RArelation;
vector< vector<string> > RAattr;
};
Я включил все необходимые заголовочные файлы в файл RA.h.
Я много искал эту ошибку, но не смог найти решения.
Где я ошибся?
В строке, где указана ошибка, возможно ли, что она на самом деле говорит:
RAoperator* operator;
вместо asdf
? (включая случай, когда у вас есть #define asdf operator
или эквивалент). asdf
кажется странным именем тега; operator
было бы более логичным, но это зарезервированное слово в C ++ и привело бы именно к сообщению об ошибке, которое вы предоставляете.
"Expected type-specifier before ';' token"
это не простая ошибка, чтобы произвести в GCC: это конкретное использование operator
это один из немногих известных мне случаев.
Проблема связана с тем, куда yacc помещает %{
… %}
код из .y
файл. Входит в .tab.c
файл, но НЕ в .tab.h
файл. Так что если у вас есть какой-либо другой код, который делает #include "y.tab.h"
, это также необходимо #include "RA.h"
Во-первых, или вы получите такие ошибки из-за RAoperator
не определено (пока)
С бизоном вы можете использовать %code requires {
… }
указать код C, который будет скопирован в ОБА .tab.c
а также .tab.h
файлы.