2017-01-12 1 views
-1

새로운 기능, 그리고 알고 싶은 점은 Flex 프로그램에서 일치하는 문자를 저장 한 다음 main에서 한 줄로 인쇄 할 수 있다는 것입니다. - 또한 고유성을 적용일치하는 문자를 플렉스에 저장합니다.

ID [A] 
ID1 [B] 
ID2 [C] 
ID3 [D] 

%% 
{ID} 
{ID1} 
{ID2} 
{ID3} 
+0

'yytext'가 무엇을위한 것인가? 물론, 그 패턴에 대한 기본 동작 만 있습니다. (그리고 ID의 접미사가 있어야합니다. 그러나 이것은 유물론의 문제입니다.) 그래서 여러분은 약간의 작업을해야합니다. 'main()'에 일치하는 문자를 처리 할 기회를줍니다. 그림과 같이 한 문자로 된 문자 클래스가 약간 이상하지만 형식적으로 잘못되었습니다. 약간의 공간도 사용해야합니다. –

+0

예, 메인에 – tzavsk

+0

yytext()가 있습니다. 함수? 필자는'yytext'가'char yytext [];'또는'char * yytext;'라고 생각하는 데 익숙합니다. 어떤 변형이 사용되는지 기억하고있는 것 같습니다. Flex가하는 일을 생각해보십시오. 'main()'으로 돌아가려면 각 패턴 다음에 뭔가를 추가해야합니다. - {return 1; } '를 사용하여 성공적인 일치를 나타냅니다. 일치하지 않는 것은 IIRC에서 무시됩니다. –

답변

0

이 작품의 인식 및 캡처 부분에 대한 더 또는 MCVE (Minimal, Complete, Verifiable Example를) 작 : 나는 아래의 패턴과 규칙을 가지고있다. 토큰이 단일 (널이 아닌) 문자인지 확인하기 위해 assert()을 사용합니다.

%{ 
#include <assert.h> 
%} 
%option noinput 
%option nounput 
%option noyywrap 
ID0 [A] 
ID1 [B] 
ID2 [C] 
ID3 [D] 
ID4 [E] 
%% 
{ID0}  { printf("{ID0}: %s\n", yytext); return 1; } 
{ID1}  { printf("{ID1}: %s\n", yytext); return 1; } 
{ID2}  { printf("{ID2}: %s\n", yytext); return 1; } 
{ID3}  { printf("{ID3}: %s\n", yytext); return 1; } 
{ID4}  { printf("{ID4}: %s\n", yytext); return 1; } 
.   { printf(" . : %s\n", yytext);   } 
%% 

int main(void) 
{ 
    char token[512] = ""; 
    char *ptr = token; 

    /* Efficiency and safety is not under discussion */ 
    while (yylex()) 
    { 
     assert(yytext[0] != '\0' && yytext[1] == '\0'); 
     if (strchr(token, yytext[0]) == 0) 
      *ptr++ = yytext[0]; 
    } 
    *ptr = '\0'; 
    printf("Token sequence: [%s]\n", token); 
    return 0; 
} 

(나는. 이름의 더 나은 일관성을 ID0ID 개명)

예 실행은 (I 소스의 이름 fx83.l을 사용 따라서 fx83 소스에서 생성 된 프로그램의 이름) :

$ ./fx83 <<< "aBcDeAbCdEFf" 
    . : a 
{ID1}: B 
    . : c 
{ID3}: D 
    . : e 
{ID0}: A 
    . : b 
{ID2}: C 
    . : d 
{ID4}: E 
    . : F 
{ID0}: A 
{ID1}: B 
    . : d 
{ID2}: C 
{ID3}: D 
    . : e 
{ID4}: E 
{ID4}: E 
    . : f 

Token sequence: [BDACE] 
$ 

(나는 그것을 중요한 생각하지 않는다,하지만 난 GCC 6.2.0와 맥 OS 시에라 10.12.2에 flex 2.5.35 Apple(flex-31)을 사용하고 있습니다.)

+0

도움과 시간이 너무 감사드립니다. – tzavsk

관련 문제