저는 C++에서 Flex 및 Bison으로 작업하고 있습니다. 나는이 공구를 사용하는 것을 배우고 있으며, 시작하는 가장 좋은 방법은 간단한 계산기를 수행하는 것입니다. 일단 내 calc.y 및 calc.l 파일에서 응용 프로그램 (실행 파일)을 생성하면 .exe 파일을 실행하여 사용할 수 있지만 지금은 응용 프로그램에서 사용하기 위해 파일 C++에 포함하려고합니다. 나는 할 수 없다. 생성 된 파일을 잘못 포함하거나 가져올 나쁜 코드를 생성하기 때문에 내 잘못이라고 생각합니다.flex 및 bison에서 생성 된 코드 포함
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;
}
y.tab.h는 BI 의해 생성
%{
#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", $2); }
|
;
statement:
expr { printf("%d\n", $1); }
| VARIABLE '=' expr { sym[$1] = $3; }
;
expr:
INTEGER { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; elementos = elementos + 1;}
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1/$3; }
| '(' expr ')' { $$ = $2; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
yyparse();
return 0;
}
calc.y 아들. 내가 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
이
내가 그것을 어떻게
를 해결할 수 ?Windows 8.1에서 gcc 버전 4.7.2, bison 2.4.1 및 2.5.4를 사용하고 있습니다.
고마워요!
편집 :
y.tab.h 파일은 다음과 같습니다는 "elementos"변수가 아니다
/* 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;
하지만, 생성 된 y.tab.c가 파일을 보면, 거기에 정의 된 것을 발견했습니다!
bison으로 C++ 파서를 생성 할 수도 있습니다. –
왜'y.tab.h' 파일을 게시하지 않습니까? –
다시 봐주세요! –