FLEX : 한 번에 여러 개의 토큰을 반환하는 방법이 있나요?


7

flex에서는 정규 표현식 하나에 대해 여러 개의 토큰을 반환하고 싶습니다. 이것을 할 수있는 방법이 있습니까?

0

모두 일치합니까? regex 함수 나 문자열 함수를 사용하고 있습니까? 전역 플래그를 사용하십시오.

플렉스의 경우 나는 그렇게 할 수 있다고 생각하지 않습니다. 한 번에 하나의 패턴으로 일치하는 항목을 테스트하므로 범위를 벗어난 것입니다. 왜 그걸 원했지? 최적화로서? 범위 지정 문제?

  0

솔직히 말하면, 나는 상당히 신축 적이며 잘 모르겠습니다. 나는 정규 표현식과 문자열 매치의 조합을 사용하고 있다고 생각했다. 여기에 "("\t \t는 {L_PAREN 반환;} 예를 들어 입니다 {INT} {yylval.Int = atoi 함수 (yytext에서) INT를 반환;} 는 내가 원하는 것은 한 번에 두 개의 토큰을 반환 할 수있다 . 22 feb. 092009-02-22 09:44:23


2

내가 수행 한 방식은 반환 토큰 큐를 만들고 yylex() 시작 부분에 토큰이 있는지 확인한 다음 반환합니다.


-1

일반적으로이 코드는 스캐너 위에있는 파서로 처리되므로 더 깨끗한 코드가 제공됩니다. 상태로 어느 정도 에뮬레이션 할 수 있습니다.

%option noyywrap 

%top { 
#define TOKEN_LEFT_PAREN 4711 
#define TOKEN_RIGHT_PAREN 4712 
#define TOKEN_NUMBER  4713 
} 

%x PAREN_STATE 
%% 
"("   BEGIN(PAREN_STATE); return TOKEN_LEFT_PAREN; 
<PAREN_STATE>{ 
    [0-9]+ return TOKEN_NUMBER; 
    ")"  BEGIN(INITIAL); return TOKEN_RIGHT_PAREN; 
    .|\n  /* maybe signal syntax error here */
} 
%% 
int main (int argc, char *argv []) 
{ 
    int i; 

    while ((i = yylex())) 
    printf ("%d\n", i); 

    return 0; 
} 

그러나이 방법은 문법이 더욱 복잡해지면 매우 혼란스러워집니다.