Почему 'YY_DO_BEFORE_ACTION', не определенный кодом % Bison, требует пролога?
У меня есть проект компилятора с использованием Bison (3.8.2) и Flex (2.6.4), созданный с использованием Cygwin в Windows 10. Без использования пролога мой проект будет собираться и работать, как и ожидалось. Как только я добавляю пролог, я получаю ошибки компилятора при вызове g++, потому что он не определен. Конкретные ошибки:
lex.yy.c: In function 'int yylex()':
lex.yy.c:715:3: error: 'YY_DO_BEFORE_ACTION' was not declared in this scope; did you mean 'YY_USER_ACTION'?
lex.yy.c:858:42: error: 'YY_NEW_FILE' was not declared in this scope
не понимаю зачем добавлять причиныYY_DO_BEFORE_ACTION
стать неопределенным.
Вот минимальный воспроизводимый пример в рабочем состоянии:
пролог.y
%code top{
#include <iostream>
#include <fstream>
void yyerror (char const *s);
}
%union {
char str[100];
int integer_value;
double double_value;
}
%code {
#include <string>
#include "prologue.h"
#include "prologue.tab.h"
}
/* declare tokens */
%token WORD
%token EOL
%define parse.error detailed
%%
program: WORD eol
;
eol: EOL
| eol EOL
;
%%
int main(int argc, char **argv)
{
yydebug = 1;
std::cout << "Call yyparse." << std::endl;
yyparse();
std::cout << "Done yyparse." << std::endl;
return 0;
}
void yyerror(char const *s)
{
fprintf(stderr, "error: %s\n", s);
}
пролог.l
%{
#include <stdio.h>
#include "prologue.tab.h"
%}
%%
"word" { return WORD; }
\r\n { return EOL; }
\n { return EOL; }
[ \t] { /* ignore whitespace */ }
. { printf("Mystery character %c\n", *yytext); }
%%
Makefile
all: prologue
prologue: prologue.l prologue.y
bison -d -v --debug prologue.y -Wcounterexamples
flex --header-file=prologue.h prologue.l
g++ -o $@ prologue.tab.c lex.yy.c -lfl
clean:
rm -f prologue.exe lex.yy.c prologue.tab.c prologue.tab.h prologue.h
Для того, чтобы привести этот минимальный воспроизводимый пример в нерабочее состояние, достаточно изменить самый первый%code
заблокировать%code requires
в prologue.y :
%code requires {
#include <string>
#include "prologue.h"
#include "prologue.tab.h"
}