2013-04-29 2 views
6

FSA를 평가하기 위해 Ragel과 협력 중이며 내 컴퓨터가 입력 테스트를 마칠 때마다 실행되는 사용자 작업을 포함시키고 싶습니다. 기계가 수락 상태에 있는지 여부에 관계없이이 작업을 실행해야합니다. 내가 갈거야 무엇을 보여 그 Ragel 가이드에서 찍은 변형 예를 가지고 :Ragel EOF 작업을 수행하는 방법

#include <string.h> 
#include <stdio.h> 

%%{ 
    machine foo; 
    main := ('foo' | 'bar') 0 @{ res = 1; } $/{ finished = 1; }; 
}%% 
%% write data; 
int main(int argc, char **argv) { 
    int cs, res = 0, finished = 0; 
    if (argc > 1) { 
     char *p = argv[1]; 
     char *pe = p + strlen(p) + 1; 
     char* eof = pe; 
     %% write init; 
     %% write exec; 
    } 

    printf("result = %i\n", res); 
    printf("finished = %i\n", finished); 

    return 0; 
} 

입력이 '갑'또는 '바'중 하나 일 때 입술 1로이 예를 들어 내 목표는, 끝나면 아무리 입력해도 1입니다. 나는이 일을 얻을 수 없다 - res가 1 일 때 1이되고 res가 0 일 때 0이 될 것 같다.

어떤 도움도 굉장 할 것이다.

답변

1

이을 시도 할 때 p == pe == eof

main := ( 
    'foo' 0 @2 @{ res = 1; } | 
    'bar' 0 @2 @{ res = 1; } | 
    any* 
    ) @{ finished = 1; }; 
3

EOF를 동작이 일어날 것이다. 또 다른 중요한 점은 상태 시스템이 상태 인 경우 상태와 일치하지 않으면 상태가 오류로 바뀌고 일치 항목이 중지되어 결국 끝낼 수 없음을 의미합니다.

foo1을 입력 해 봅시다. o으로 구문 분석 할 때 모든 사항이 정상입니다. 다음 문자 인 1은 지정한 상태와 일치 할 수 없으므로 오류가 발생합니다. 당신은 결코 eof 행동을 만날 수 없습니다. 변수 resfinish은 모두 0입니다.

foo을 입력하면 모든 것이 정상입니다. 국가는 끝까지 갈 수 있습니다. 그래서 eof 행동이 일어난다.

당신은 어떻게되는지 오류 동작을 설정할 수 있습니다

%%{ 
    main := ('foo' | 'bar') 0 @{ res = 1; } $err{ printf("error : %c", fc);} $/{ finished = 1; }; 
}%% 

그리고 당신은 당신의 요구에 맞게이 코드를 시도 할 수 있습니다 :

%%{ 
    main := (('foo' | 'bar') 0 @{ res = 1; } | any*) $/{ finished = 1; }; 
}%% 
관련 문제