2011-11-01 2 views
0

규칙을 정의하는 null 문자가 있으므로 yy_scan_bytes()를 사용하려고합니다. 내 문제는 내 문자열이 하나 이상의 규칙과 일치 할 수 있다는 것입니다. 나는 모든 규칙을 일치시키고 싶다. 한 번에 한 문자 씩 yylex() 함수를 제공하고 일치하는 항목이 있는지 확인하려고합니다. 테스트를 위해 다음 코드를 시도했지만이 코드는 작동하지 않습니다.다중 버퍼가있는 lex flex 스캐너

for(int i=0;i<length;i++) 
{ 
    yy_scan_bytes(&temp[i],1); 
    index=TomsonTalkslex(); 
} 

간단히 말해서 스캐너에서 일치하는 규칙의 색인 만 반환합니다. temp는 char 버퍼입니다. yy_switch_to_buffer (yy_scan_bytes (& temp [i], 1))를 사용하려고했습니다. 그러나이 didnt 한 일.

스캐너에 상태를 재설정하지 말고 같은 상태의 후속 버퍼 처리를 계속하도록 할 수 있습니까?

+0

왜 스캔 바이트를 사용해야합니까? 기본적으로 yylex는 EOF까지 한 번에 한 문자 씩 읽으며 null 바이트는 잘 읽어야합니다. 또한 나중에이 버퍼를 사용할 때의 현재 버퍼 상태를 저장 하시겠습니까, 아니면 새 버퍼로 마지막 버퍼 상태를 사용하여 버퍼를 전환하는 동안 상태를 유지 하시겠습니까 *? –

+0

런타임시 데이터 입력이 있으므로 스캔 바이트를 사용해야합니다. 또한 각 문자에 대해 yylex를 호출하고 싶습니다. 버퍼 상태를 저장하려고하는 이유는 상태 머신을 재설정하지 않기를 바랍니다. 내 마지막 버퍼 상태를 새 버퍼와 함께 사용하고 싶습니다. 예를 들어 나는 2 개의 규칙을 가지고 있는데, 하나는 ab와, 다른 하나는 marching cd이다. "abcd"를 입력하여 바이트를 스캔하면 cd라고 생각되는 하나의 일치 항목 만 반환합니다. 나는 ab가 처리 될 때 ab 규칙을 원하고, cd가 처리 될 때 cd를 원한다. 그리고 이것은 스캔 바이트를 통해서만 수행 될 수있다. – Saba

답변

1

좋아요, 이것은 lex/flex 작동 방식에 대한 오해입니다. 기본적으로 yylex는 stdin에 연결되고, EOF를 수신 할 때까지 읽으며 각 규칙과 일치합니다. 그것이 토큰 화가 인 이유입니다. 그래서 아래의 샘플 프로그램은 -c를 입력하여 EOF를 보낼 때까지 stdin에서 읽습니다. 이 작업을 수행 할 때

flex -Cf scanner.l 
gcc -O -o flexer.exe scanner.c 

가 scanner.l으로 소스 파일을 저장 :

%option 8bit outfile="scanner.c" 
%option nounput nomain noyywrap 
%option warn 

%% 

ab { fprintf(yyout, "We ran the ab rule.\n"); } 
cd { fprintf(yyout, "We ran the cd rule.\n"); } 

    // echo everything else we find to yyout 
. { ECHO; } 
\n { ECHO; } 

%% 

위, 사용을 컴파일합니다. 컴파일하면 동일한 디렉토리에 flexer.exe라는 파일이 생깁니다. 터미널에서 실행하면 입력을 기다리는 빈 프롬프트가 표시됩니다. 입력 한 모든 것은 하나의 일치 항목을 찾을 때까지 규칙에 따라 시도하고 일치합니다. 그런 다음 규칙과 연관된 코드를 실행합니다.

따라서 abcd을 입력하면 abcd 규칙이 모두 일치하게됩니다.

자세한 소개는 lex and yacc입니다.

+0

글쎄 똑같은 일을하고 싶지만 stdin을 사용하고 싶지 않다. 스캔 바이트로 처리하고 싶다. lex 및 yacc 설명서에서 많은 것을 시도했지만 아무도 스캔 바이트 작업을하지 않습니다. 원래 게시물의 코드에서 주어진대로 스캔 바이트를 호출하려고합니다. – Saba

+0

@Saba [플렉스 매뉴얼] (http://flex.sourceforge.net/manual/Multiple-Input-Buffers.html#Multiple-Input-Buffers)는 yy_scan_bytes가 각 호출에서 새로 생성 된 버퍼로 전환 함을 나타냅니다. 나는 네가 원하는 것을 할 것이라고 생각하지 않는다. –

+0

감사합니다 스펜서, 내가 원하는 것을 할 수있는 다른 방법이 있습니까,하지만 메모리 버퍼에 사용하고 싶습니다 : ( – Saba