2014-05-09 1 views
0

기본 입력이 아닌 문자열 버퍼와 함께 flex를 사용하고자하므로 yy_scan_string을 사용하고 있습니다. "ends-with"패턴을 제외하고는 거의 잘 작동합니다.

이 입력으로 표준 입력을 사용하여 정확한 종료 문자열 인 경우

%% 
ab$ {//do something} 
%% 

ab$

그것은 작동하지만, yy_scan_string와 함께, 그것은 아니다 "AB"를 일치하는 것을 의미한다.

테스트 :

%option noyywrap 

%{ 
#include <stdio.h> 
%} 

%% 
ab$ { printf("match ab$\n"); } 
%% 

int main(int argc, char ** argv) 
{ 
    if (argc > 1) 
     yy_scan_string(argv[1]); 

    yylex(); 

    if (argc > 1) 
     yylex_destroy(); 
} 

다음과 flex test.l; gcc lex.yy.c;echo ab | ./a.out를 사용하여, 그것은 match ab$를 인쇄하고, 잘 작동하지만 ./a.out ab를 사용하는 경우에만 입력 ab를 인쇄하는 경우, 그 ab$ 규칙과 일치하지.

답변

0

나는이 질문이 너무 오랫동안 답변되지 않은 상태로 남아있어 매우 당연한 것으로 놀랍습니다. 이것은 매뉴얼에서 다룹니다. 당신이 manual section on patterns 보면 그것은 $ 패턴이 작동하는 방법에 대해 설명합니다

'r에 $'는 'R',하지만 라인 (즉, 단지 줄 바꿈 전)의 말. 'r/\ n'과 같습니다.

"newline"이라는 flex의 개념은 flex를 컴파일하는 데 사용 된 C 컴파일러가 '\ n'을 다음과 같이 해석한다는 점에 유의하십시오. 특히, 일부 DOS 시스템에서는 '\ r'을 입력으로 직접 필터링하거나 'r $'에 'r/\ r \ n'을 명시 적으로 사용해야합니다.

그래서 당신은 수동 명시 적으로 '$'ends-with 동일시하지 않는 것을 말한다 볼 수 있습니다. 예를 들어 SNOBOL에서 발견 한 것처럼 실제로는 올바른 문자열 앵커가 아닙니다.

프로그램이 쉘 입력과 동일한 명령 줄 인수를 처리하게하려면 echo ab |을 수행 할 때 운영 체제에서 추가 한 문자를 에뮬레이트하는 코드를 추가해야합니다. \nEOT이 될 것입니다. EOT은 flex와는 일치하지 않으며 실제로 파일 끝을 표시하지는 않지만 내 에뮬레이션에서는 보행자였습니다.

%option noyywrap 

%{ 
#include <stdio.h> 
%} 

%% 
ab$ { printf("match ab$\n"); } 
%% 

int main(int argc, char ** argv) 
{ char * buffer; 
    if (argc > 1) { 
     int length = strlen(argv[1]); 
     buffer = (char *)malloc(length+3); 
     strncpy(buffer,argv[1],length); 
     buffer[length] = '\n'; 
     buffer[length+1] = 4; /* EOT or Cntrl-D representing EOF on unix */ 
     buffer[length+2] = 0; 
     yy_scan_string(buffer); 
     } 
    yylex(); 

    if (argc > 1) 
     yylex_destroy(); 
} 
관련 문제