#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 Я смог решить по вашему предложению, спасибо.