1

只是对案例进行抽样

测试.grm

%{
#include <stdio.h>
%}
%token id
%start program

%%    
program:   exp    
exp:   ID    
ID: id

bison -d test.grm -o test.c 自动生成 test.h

#ifndef YY_TEST_H
# define YY_TEST_H
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
#if YYDEBUG
extern int yydebug;
#endif

#ifndef YYTOKENTYPE
# define YYTOKENTYPE
   enum yytokentype {
     id = 258
   };
#endif

#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef int 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 (void);
#else
int yyparse ();
#endif
#endif /* ! YYPARSE_PARAM */
#endif /* !YY_TEST_H  */

您可以看到#include 不在此文件中。当 .grm 使用在 %{ %} 中的头文件中定义的某些定义时,这将出现问题。

这是我的问题,我如何自动生成 test.h 包括 %{ %} 中包含的内容。

4

1 回答 1

2

生成的标头test.h不包含您的任何代码,而仅包含解析器 API;{%所以那里没有问题:在和之间不会有需要代码的代码%}

生成的 C 文件包含您的和之间的代码{%%}您的操作代码(当然还有生成的解析器逻辑)。所以同样没有问题。

如果您想要一个包含生成的解析器 API 和您自己的 API 的头文件,则必须以#include相反的方式执行 -ing:将生成的包含test.h在您自己的头文件中。

于 2013-06-24T17:05:02.740 回答