2009-12-06 4 views
0

필자가 입력 파일에서 yacc 프로그램으로 입력을 리디렉션 할 때 파일 구문 분석이 끝나면 yacc 파서가 그 작업의 요약을 인쇄하기를 원합니다. 키보드를 통해 입력을 입력 한 다음 Ctrl + -12을 입력하면 동일한 작업을 수행하기를 원합니다. 그렇게 할 수있는 방법이 있습니까?최종 요약 메시지를 yacc 프로그램에 저장하는 방법은 무엇입니까?

+2

yacc/bison 또는 (lex) lex에서 원합니까? 'yyparse()'를 호출하는 자신 만의'main()'함수를 제공 한 다음 끝에 메시지를 출력 할 수 있습니다. –

+0

나는 flex 대신 yacc로 원한다. – neuromancer

+2

이 질문에 대한 대답은 실제로 yacc을 사용하여 프로그램을 작성하려는 모든 사람에게 분명해야합니다. 나는 이런 질문을 Phenom이 묻는 패턴을 발견했습니다. –

답변

-4

문제점에 대한 해결책은 .y 파일에 yywrap() 함수를 만드는 것입니다. 이 함수는 yacc이 입력 파일의 끝이거나 Ctrl-D를 누른 사용자 인 EOF를 만날 때 실행됩니다. 이것이 해결책입니다. 당신이 기능은 세 번째 부분에 있어야하는 기능 를 호출 할 수 있습니다 문법에

+1

이것은 _lex_가 EOF를 만날 때 실행되며, yacc이 실행되지 않을 때 실행됩니다. 이들은 두 가지 다른 시간입니다. 그것은 중요한 구분입니다. 어쨌든 'yywrap'은 아무 것도하지 않아야합니다. 이것은 렉스에 내장 된 "흐름 제어"의 끔찍한 형태입니다. 'yywrap'에서 할 수있는 행동의 종류는 프로그램의'main()'함수에서 처리되어야합니다. –

+0

-1 : Chris와 동의하면 많은 파일을 처리 할 때 다음 입력 파일로 변경할 수 있습니다. –

+0

main 함수가 없어도 main 함수가 .l 파일에 있고 모든 변수가 .y 파일에 있기 때문에 아무 것도 할 수 없다고 생각합니다. – neuromancer

0

FIRST PART 

%% 
second PART 

GRAMMAR { CALL YOUR FUNCTION();} 
GRAMMAR2 VAR1 VAR2 VAR3 {CALL YOUR FUNCTION2($1,$2,$3);} 

%% 
third PART 

YOUR FUNCTION(){} 
YOUR FUNCTION2(int c, char*y , int z){} 

int main (void) { 
} 
    void yyerror (char *s) {fprintf (stderr, "%s\n", s);} 

함수가가로 함수를 호출 곳에서 지금 당신 렸기 때문에 또한 문법을 ​​원하는 일을 인쇄 할 수 있습니다 당신이주는 매개 변수