2016-11-09 6 views
-1

나는 Flex & Bison 프로젝트 작업 중입니다. 나는 플렉스 & 들소 완벽하게 작동하지만 진정한 argv 입력 문자열을주고있어. 그래서 저는 yyin을 변경하여 argv [1]를 취했지만 실제로 작동하지 않습니다. 그냥 무시합니다. 여기Argv의 Flex & Bison yyin []

#include "parser.hpp" 
#include <stdio.h> 
#include <iostream> 
#include <stdlib.h> 

int main(int argc, char const *argv[]) { 
extern FILE* yyin; 
yyin = fopen(argv[1],"r"); 
yyparse(); 
} 

그리고 내 메이크입니다 :

all: bison flex main.cpp 
    g++ parser.cpp lexer.cpp main.cpp -o parser 
    rm lexer.cpp parser.cpp parser.hpp 
bison: parser.y 
    bison -o parser.cpp parser.y 
flex: lexer.l 
    flex -o lexer.cpp lexer.l 

가 그럼 난 이렇게 실행 ./parser "(2+5)"

는하지만 아무것도하지 않는

여기 내 main.c에있다. 아마도 내가 올바른 방법으로하지 않을 것입니다.

+0

'fopen'이 실제로하는 일을 살펴 봐야한다고 생각합니다. – rici

+0

예, 나는 그것을 예제에서 가져 왔지만, 우리가 fopen을 사용한다는 이상한 것처럼 보입니다. 하지만 난 기본적으로 wright 수 없습니다 'yyin = argv [1]; ' 유형이 일치하지 않기 때문에. 죄송합니다. 나는 바보 같은 질문을하고 있습니다. –

+0

@ G.Courmont : ** (2 + 5) **라는 파일을 열어 읽으려고합니다. –

답변

1

플렉스는 을 제공하며 null 종료 문자열 (예 : argv[1])에서 새 버퍼를 만든 다음 해당 버퍼를 사용하도록 렉싱을 전환합니다.

당신은 그것을 같은 것을 사용할 수 있습니다

int main(int argc, char const * argv[]) { 
    YY_BUFFER_STATE buf; 

    buf = yy_scan_string(argv[1]); 
    yyparse(); 
    yy_delete_buffer(buf); 

    return 0; 
} 

가 버퍼를 생성하고 관리 할 수있는 다른 방법이 있습니다를, 자세한 내용은 플렉스 문서의 검색 문자열 절을 참조하십시오.