Bison: не удалось разрешить пользовательский параметр в .hpp

#c #bison #flex-lexer

#c #bison #flex-lexer

Вопрос:

Bison не может разрешить user-param ввод типа *.tab.hpp .

Версия Bison:

 GNU Bison 2.7.
 

.l файл:

 {
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <errno.h>
#include "pinMapTab.h"
extern int errno;

%}
%option nounput
%option noinput

%%
"="                    { return EQUALS; }
","                    { return COMMA; }
";"                    { return SEMICOLON; }
PORT                   { return PORT; }
PIN                    { return PIN; }
PACKAGE                { return PACKAGE; }
[a-zA-Z_][a-zA-Z0-9_]* {yylval.str =strdup(yytext);return ALPHANUMERIC;}
[a-zA-Z_][a-zA-Z0-9_]*[[0-9]*] {yylval.str =strdup(yytext);return BUS_PORT;}
[0-9_]*                 {yylval.str = strdup(yytext);return NUMBER;}
"//".* | [t]          {; }
"/*"[.n]*"*/"         {; }
n                     {; }
.                      {; }
%%

int yywrap()
{
   return 1;
}
 

.y файл:

%{

 #include <stdio.h>
#include <stdarg.h>
#include <iostream>
#include <ostream>
#include <string>

#include <pinMapParser.h>
 
namespace dc {
  class pinMapParser; 
}
#undef YYLMAX
#define YYLMAX 100000
extern int lineno;
extern "C" int yywrap();
int yyerror(dc::pinMapParser *pm,std::string msg);
extern "C" char yytext[];
extern "C" int yylex();
%}

%parse-param {dc::pinMapParser *pm} 

%union
{
   int val;
   char *str; 
}

….  //parsing grammer

int yyerror(dc::pinMapParser *pm, std::string msg)
{
  return 1;
}
 

Сгенерированный Бизон .hpp

 ifndef YY_YY_PINMAP_TAB_HPP_INCLUDED
# define YY_YY_PINMAP_TAB_HPP_INCLUDED
/* Enabling traces.  */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
#if YYDEBUG
extern int yydebug;
#endif

/* Tokens.  */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
   /* Put the tokens into the symbol table, so that GDB and other debuggers
      know about them.  */
   enum yytokentype {
     EQUALS = 258,
     COMMA = 259,
     SEMICOLON = 260,
     PACKAGE = 261,
     PIN = 262,
     PORT = 263,
     ALPHANUMERIC = 264,
     BUS_PORT = 265,
     NUMBER = 266
   };
#endif

#if ! defined YYSTYPE amp;amp; ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
{
/* Line 2058 of yacc.c  */
#line 25 "pinMap.ypp"

   int val;
   char *str;


/* Line 2058 of yacc.c  */
#line 74 "pinMap.tab.hpp"
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif

extern YYSTYPE yylval;

#ifdef YYPARSE_PARAM
#if defined __STDC__ || defined __cplusplus
int yyparse (void *YYPARSE_PARAM);
#else
int yyparse ();
#endif
#else /* ! YYPARSE_PARAM */
#if defined __STDC__ || defined __cplusplus
int yyparse (dc::pinMapParser *pm);
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */

#endif /* !YY_YY_PINMAP_TAB_HPP_INCLUDED  */
 

Проблема:
Как вы можете видеть, прототип yyparse сгенерированного .hpp includes dc::pinMapParser , но его заголовочный файл не включается. Я вижу ошибки компилятора из-за этой проблемы.

 int yyparse (dc::pinMapParser *pm);
 

Ошибка:

 In file included from pinMap.l:7:
pinMap.tab.hpp:90:23: error: expected ‘)’ before ‘:’ token
   90 | int yyparse (dc::pinMapParser *pm);
      |                       ^   
      |                       )   
*** exit status 1 *** 
 

Комментарии:

1. Ваша проблема в вашем файле flex, а не в файле bison. Вам либо нужно #include pinMapParser.h перед включением заголовка bison, либо использовать %code requires блок в вашем файле bison для вставки include в файл заголовка, созданный bison.

2. @rici Что, если я не хочу, чтобы prototype of yyparse был частью файла заголовка, созданного bison, удивительно bison 2.4 , что прототипы yyparse фактически были частью cpp , созданными bison.

3. Я не думаю, что есть какая-либо возможность подавить объявление yyparse .

4. @rici Я смог решить по вашему предложению, спасибо.