2013-05-05 2 views
1

나는 양수의 평균을 수행하기 위해 간단한 렉스 프로그램을 작성했다. 프로그램은 잘 컴파일되지만 예상 한 결과를 얻을 수 없다. 나는 프로그램의 입력을 파일을 명령 줄 인수로 filename을 지정하면됩니다. lex 프로그램의 결과는 아무 것도 표시되지 않고 공백으로 표시됩니다. 저는 lex 초보자이며 도움을 주시면 감사하겠습니다. 아래 코드를 첨부했습니다. 이 코드는 Redhat Linux 커널 버전 2.4로 작성되었습니다.예기치 않은 렉스 프로그램의 출력

%{ 
#include <stdio.h> 
#include <stdlib.h> 
%} 

%% 
[0-9]+ return atoi(yytext); 
%% 

void main() 
{ 
    int val, total = 0, n = 0; 
    while ((val = yylex()) > 0) { 
    total += val; 
    n++; 
} 
if (n > 0) printf(“ave = %d\n”, total/n); 
} 

입력 파일에 숫자 3, 6 및 4가 포함되어 있으며 파일 이름이 명령 줄 인수로 전달됩니다.

./a.out < input 

답변

2

프로그램이 저에게 효과적입니다. 나는 yywrap이 조금 의심 스럽기 때문에 -lfl (또는 무엇인가 비슷하게) 옵션과 연결될 것입니다. 이 라이브러리는 yywrapmain을 포함합니다. 비록 내가 본 것을 재현 할 수는 없지만 main에서 libfl까지 사용하는 것이주의 할 만합니다. 출력에서 입력 파일에 줄 바꿈이 있다고 가정합니다. 서로 다른 링커는 동일한 심볼이 여러 번 나오는 것을 서로 다른 방식으로 해결합니다.

모두 당신이 프로그램이 빌드되는 방식에서 문제를 찾아야한다고 생각합니다. 왜냐하면 사양은 괜찮아 보이기 때문입니다. main 뒤에 int yywrap(void) { return 1; }을 추가하면 libfl없이 수행 할 수 있습니다. 이는 어떤 사용자에게도 lexgnu-flex을 알리는 것입니다.

+0

안녕하세요. Bryan, 코드에서 실수를했습니다. 주 코드가 명령 줄 인수를 취해야하므로 main (int argc, char * argv [])으로 수정해야하며 같은 수정을 한 후에는 o/p. 공백과 탭에 대한 검사를 도입하고 o/p는 괜찮습니다. 도움을 주셔서 감사합니다. –