Почему '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"
}

0 ответов

Другие вопросы по тегам