包含由 flex 和 bison 生成的代码
Include generated code by flex and bison
我正在使用 C++ 中的 Flex 和 Bison。我正在学习使用这些工具,最好的开始方式是使用一个简单的计算器。从我的 calc.y 和 calc.l 文件生成应用程序(可执行文件)后,我可以运行 .exe 文件并使用它,但现在我想将它包含在文件 c ++ 中以使用它在我的申请中,但我不能。我认为这是我的错,因为我包含了错误的生成文件或生成了错误的代码来导入。
main.cpp
#include <iostream>
extern "C" {
#include "y.tab.h"
}
int main ( int argc, char *argv[] ) {
yyparse();
printf(elementos);
return 0;
}
calc.l
%{
#include "y.tab.h"
#include <stdlib.h>
void yyerror(char *);
%}
%%
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-+()\n] {
return *yytext;
}
[ \t] ;
. {
yyerror("Invalid character.");
}
%%
int yywrap(void) {
return 1;
}
calc.y
%{
#include <stdio.h>
int yylex(void);
void yyerror(char *);
int sym[26];
int elementos = 0;
%}
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'
%%
program:
program expr '\n' { printf("%d\n", ); }
|
;
statement:
expr { printf("%d\n", ); }
| VARIABLE '=' expr { sym[] = ; }
;
expr:
INTEGER { $$ = ; }
| expr '+' expr { $$ = + ; elementos = elementos + 1;}
| expr '-' expr { $$ = - ; }
| expr '*' expr { $$ = * ; }
| expr '/' expr { $$ = / ; }
| '(' expr ')' { $$ = ; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
yyparse();
return 0;
}
y.tab.h是由野牛生成的。当我尝试编译 main.cpp 时出现错误:
命令:gcc main.cpp -o main.exe
结果:main.cpp: In function 'int main(int, char**)':
main.cpp:8:10: error: 'yyparse' was not declared in this scope
main.cpp:9:9: error: 'elementos' was not declared in this scope
我该如何解决?
我在 windows8.1.
上使用 gcc 版本 4.7.2、bison 2.4.1 和 2.5.4
谢谢!
编辑:
y.tab.h 文件是:
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
INTEGER = 258,
VARIABLE = 259
};
#endif
/* Tokens. */
#define INTEGER 258
#define VARIABLE 259
#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;
没有"elementos"变量,但是查看生成的y.tab.c文件,发现有定义!
你有几个问题:
Bison 和 Flex 生成 C 代码,然后您需要编译这些代码并 link 使用您的程序。你的问题没有迹象表明你已经这样做了。
如果您希望能够在 main.cpp 文件中使用 elementos 变量,那么您需要声明它。它可能在其他地方定义,但编译器在编译时并不知道main.cpp。在 extern "C" 部分添加这一行:extern int elementos;
你有两个不同的主要功能。
在 main.cpp 中,您 #include iostream,然后使用 stdio 中的 printf。
printf调用错误。它需要一个格式字符串。
Bison 显示了几个警告,如果您希望程序正常运行,您可能需要阅读这些警告并采取一些措施。
我正在使用 C++ 中的 Flex 和 Bison。我正在学习使用这些工具,最好的开始方式是使用一个简单的计算器。从我的 calc.y 和 calc.l 文件生成应用程序(可执行文件)后,我可以运行 .exe 文件并使用它,但现在我想将它包含在文件 c ++ 中以使用它在我的申请中,但我不能。我认为这是我的错,因为我包含了错误的生成文件或生成了错误的代码来导入。
main.cpp
#include <iostream>
extern "C" {
#include "y.tab.h"
}
int main ( int argc, char *argv[] ) {
yyparse();
printf(elementos);
return 0;
}
calc.l
%{
#include "y.tab.h"
#include <stdlib.h>
void yyerror(char *);
%}
%%
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-+()\n] {
return *yytext;
}
[ \t] ;
. {
yyerror("Invalid character.");
}
%%
int yywrap(void) {
return 1;
}
calc.y
%{
#include <stdio.h>
int yylex(void);
void yyerror(char *);
int sym[26];
int elementos = 0;
%}
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'
%%
program:
program expr '\n' { printf("%d\n", ); }
|
;
statement:
expr { printf("%d\n", ); }
| VARIABLE '=' expr { sym[] = ; }
;
expr:
INTEGER { $$ = ; }
| expr '+' expr { $$ = + ; elementos = elementos + 1;}
| expr '-' expr { $$ = - ; }
| expr '*' expr { $$ = * ; }
| expr '/' expr { $$ = / ; }
| '(' expr ')' { $$ = ; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
yyparse();
return 0;
}
y.tab.h是由野牛生成的。当我尝试编译 main.cpp 时出现错误:
命令:gcc main.cpp -o main.exe
结果:main.cpp: In function 'int main(int, char**)':
main.cpp:8:10: error: 'yyparse' was not declared in this scope
main.cpp:9:9: error: 'elementos' was not declared in this scope
我该如何解决?
我在 windows8.1.
上使用 gcc 版本 4.7.2、bison 2.4.1 和 2.5.4谢谢!
编辑:
y.tab.h 文件是:
/* Tokens. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
INTEGER = 258,
VARIABLE = 259
};
#endif
/* Tokens. */
#define INTEGER 258
#define VARIABLE 259
#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;
没有"elementos"变量,但是查看生成的y.tab.c文件,发现有定义!
你有几个问题:
Bison 和 Flex 生成 C 代码,然后您需要编译这些代码并 link 使用您的程序。你的问题没有迹象表明你已经这样做了。
如果您希望能够在 main.cpp 文件中使用 elementos 变量,那么您需要声明它。它可能在其他地方定义,但编译器在编译时并不知道main.cpp。在 extern "C" 部分添加这一行:
extern int elementos;
你有两个不同的主要功能。
在 main.cpp 中,您 #include iostream,然后使用 stdio 中的 printf。
printf调用错误。它需要一个格式字符串。
Bison 显示了几个警告,如果您希望程序正常运行,您可能需要阅读这些警告并采取一些措施。