flex 和 bison 的无效字符错误
Invalid character error with flex and bison
%{
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
#include <ostream>
#include <string>
#ifndef TDM_PIN_MAP_TEST
#include <tdmPinMap.h>
namespace dc {
class tdmPinMap;
}
#endif
#undef YYLMAX
#define YYLMAX 100000
extern int lineno;
extern "C" int yywrap();
#ifndef TDM_PIN_MAP_TEST
int yyerror(dc::tdmPinMap &pm,std::string msg);
#else
int yyerror(std::string msg);
#endif
extern "C" char yytext[];
extern "C" int yylex();
%}
#ifndef TDM_PIN_MAP_TEST
%parse-param {dc::tdmPinMap &pm}
#endif
%union
{
int val;
char *str;
}
%token EQUALS
%token COMMA
%token SEMICOLON
%token PACKAGE
%token PIN
%token PORT
%token <str> ALPHANUMERIC
%type <str> port_name
%type <str> pin_name
%type <str> package_name
%%
;
pin_name : ALPHANUMERIC
{
$$ = ;
}
;
%%
#ifndef TDM_PIN_MAP_TEST
int yyerror(dc::tdmPinMap &pm,std::string msg)
#else
int yyerror(std::string msg)
#endif
{
return 1;
}
我的问题:
我在使用以下代码时收到无效字符错误。
#ifndef TDM_PIN_MAP_TEST
%parse-param {dc::tdmPinMap &pm}
#endif
这里我想定义 parse-param
只有当 TDM_PIN_MAP_TEST
宏没有被定义时,但是我得到下面的错误。
bison -d -v -d pinMap.ypp
pinMap.ypp:28.1: invalid character: `#'
pinMap.ypp:28.2-7: syntax error, unexpected identifier
make: *** [pinmap_yacc.cpp] Error 1
行号28
指的是我上面指出的代码。
感谢任何解决上述错误的指示。
Bison 不提供任何有条件地包含指令或规则的机制。 C 代码块外的类似于 C 预处理器指令(例如 #ifndef
)的行将被标记为语法错误。
如果你想为两个不同的应用程序使用同一个 bison 源文件,你将不得不使用一些外部宏预处理器。
我建议避免使用 cpp
,因为它对 bison 语法一无所知,并且可能会对 bison 语法文件进行许多不需要的更改,包括扩展代码块中的预处理器指令和野牛规则中意外的宏替换。
您想要的条件包含看起来很简单,因此您可以使用 shell 脚本来完成。或者您可以使用 m4
,它必须存在,因为 bison 依赖它。
%{
#include <stdio.h>
#include <stdarg.h>
#include <iostream>
#include <ostream>
#include <string>
#ifndef TDM_PIN_MAP_TEST
#include <tdmPinMap.h>
namespace dc {
class tdmPinMap;
}
#endif
#undef YYLMAX
#define YYLMAX 100000
extern int lineno;
extern "C" int yywrap();
#ifndef TDM_PIN_MAP_TEST
int yyerror(dc::tdmPinMap &pm,std::string msg);
#else
int yyerror(std::string msg);
#endif
extern "C" char yytext[];
extern "C" int yylex();
%}
#ifndef TDM_PIN_MAP_TEST
%parse-param {dc::tdmPinMap &pm}
#endif
%union
{
int val;
char *str;
}
%token EQUALS
%token COMMA
%token SEMICOLON
%token PACKAGE
%token PIN
%token PORT
%token <str> ALPHANUMERIC
%type <str> port_name
%type <str> pin_name
%type <str> package_name
%%
;
pin_name : ALPHANUMERIC
{
$$ = ;
}
;
%%
#ifndef TDM_PIN_MAP_TEST
int yyerror(dc::tdmPinMap &pm,std::string msg)
#else
int yyerror(std::string msg)
#endif
{
return 1;
}
我的问题:
我在使用以下代码时收到无效字符错误。
#ifndef TDM_PIN_MAP_TEST
%parse-param {dc::tdmPinMap &pm}
#endif
这里我想定义 parse-param
只有当 TDM_PIN_MAP_TEST
宏没有被定义时,但是我得到下面的错误。
bison -d -v -d pinMap.ypp
pinMap.ypp:28.1: invalid character: `#'
pinMap.ypp:28.2-7: syntax error, unexpected identifier
make: *** [pinmap_yacc.cpp] Error 1
行号28
指的是我上面指出的代码。
感谢任何解决上述错误的指示。
Bison 不提供任何有条件地包含指令或规则的机制。 C 代码块外的类似于 C 预处理器指令(例如 #ifndef
)的行将被标记为语法错误。
如果你想为两个不同的应用程序使用同一个 bison 源文件,你将不得不使用一些外部宏预处理器。
我建议避免使用 cpp
,因为它对 bison 语法一无所知,并且可能会对 bison 语法文件进行许多不需要的更改,包括扩展代码块中的预处理器指令和野牛规则中意外的宏替换。
您想要的条件包含看起来很简单,因此您可以使用 shell 脚本来完成。或者您可以使用 m4
,它必须存在,因为 bison 依赖它。