2015-01-08 4 views
3

저는 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가 파일을 보면, 거기에 정의 된 것을 발견했습니다!

+0

bison으로 C++ 파서를 생성 할 수도 있습니다. –

+0

왜'y.tab.h' 파일을 게시하지 않습니까? –

+0

다시 봐주세요! –

답변

2

당신은 문제의 번호를 가지고 :

  1. 들소와 플렉스 당신이 다음 프로그램을 컴파일하고 링크해야하는 C 코드를 생성합니다. 귀하의 질문에 귀하가 이것을 한 사실이 없음을 보여줍니다.

  2. main.cpp 파일에서 elementos 변수를 사용하려면 으로 선언해야합니다. 그것은 어딘가에 정의되어있을 수 있지만 컴파일러는 main.cpp를 컴파일 할 때 알지 못합니다. extern "C"부분에이 줄을 추가하십시오. extern int elementos;

  3. 두 가지 주요 기능이 있습니다.

  4. main.cpp에서 iostream을 #include하지만 stdio의 printf를 사용하십시오.

  5. printf를 호출하는 것이 잘못되었습니다. 형식 문자열이 필요합니다.

  6. 들소 (Bison)는 몇 가지 경고를 보여줍니다. 프로그램을 작동 시키려면 읽고 읽어야합니다.