2012-11-30 2 views
1

두 가지 상태가 있습니다. 하나는 다른 하나의 일반적인 인스턴스입니다. 두 상태를 동시에 입력하는 것을 피하는 올바른 방법은 k> 1 인 lookahead를 구현하는 것입니다. 그러나이를 수행하는 방법에 대한 예는 찾을 수 없습니다. fhold 사용 모두Ragel에서 미리보기를 구현하는 방법

를 상기 사용자의 현재 위치가 조정되는 천이 방식으로 서로 얻어진 기계 결합에주의해야 fexec :

Ragle 사용자 안내서 말한다 다른 컴퓨터의 전환과 결합되지 않습니다.

아마도 "현재 표현의 끝을 지나서 읽으려고하지 마십시오"를 제외하고는 이것이 무엇을 의미하는지 모르겠습니다.

내 기계는 다음과 같습니다

seglen16 = any{2} >{ swab(p, &len, 2); len = len - 2; };    
action check {len--} 
buffer = (any when check)* %when !check @{ printf("[%d]:%d\n", len, *p); }; 

# JPEG Markers 
mk_app0 = 0xFF 0xE0; 
mk_appx = 0xFF (0xE0..0xEF); 
marker = 0xFF ^0x00; 
nonmarker = !marker - zlen; 

# JPEG APP Segments 
seg_app0_jfif = mk_app0 seglen16 "JFIF" 0x00 buffer @{ printf("jfif app0\n"); }; 
seg_appx_unk = mk_appx nonmarker* @{ printf("unknown app content\n"); }; 
seg_app = (seg_app0_jfif | seg_app1_exif | seg_appx_unk); 

# Main Machine 
expr = (mk_soi @lerr(bad) nonmarker* seg_app* nonmarker* mk_eoi); 

내가 알 수없는 부분을 생략하고 JFIF 같은 잘 알려진 세그먼트를 처리하는 JPEG 헤더를 토큰 화하고 싶다. JPEG 응용 프로그램 세그먼트 app0은 0xFFE0으로 시작합니다. app0에 JFIF 데이터가있는 경우 app0 표식 다음에 2 바이트 길이와 문자열 "JFIF\0"이옵니다. 즉, 응용 프로그램 세그먼트를 식별 할 때 7 바이트의 미리보기가 필요합니다.

답변

2

알 수없는 세그먼트를 건너 뛰고 JFIF와 같은 잘 알려진 세그먼트를 처리하는 JPEG 헤더를 토큰 화하려고합니다. JPEG 애플리케이션 세그먼트 app0은 0xFFE0로 시작합니다. app0에 JFIF 데이터가 들어 있으면 app0 표식 뒤에 2 바이트 길이와 "JFIF \ 0"문자열이옵니다.

좋습니다.

즉, 응용 프로그램 세그먼트를 식별 할 때 7 바이트의 미리보기가 필요합니다.

왜? 당신은 "알 수없는"패턴이 제외한 모든 세그먼트 에 적용 할 수있는 일반적인 패턴을 사용하여 알려진 것들 :

seg_app0_jfif = mk_app0 seglen16 "JFIF" 0x00 buffer @{ printf("jfif app0\n"); }; 
known_segment = (seg_app0_jfif | seg_app1_exif); 
unknown_segment = ((mk_appx nonmarker*) - known_segment) @{ printf("unknown app content\n"); }; 
seg_app = (known_segment | unknown_segment); 

그것을 내다을 필요로하지 않습니다이 방법을 수행. Ragel은 적절한 상태와 전환을 생성하여 입력을 충분히 처리 할 때까지 두 패턴을 동시에 처리하여이를 명확하게합니다. unknown_segment의 마무리 작업은 실현하려고하는 동작처럼 보이는 known_segment이 아닌 경우에만 발생합니다.

+0

lookahead를 사용하면 입력하는 전환을 모호하게 만들 수 있습니다. 이렇게하면 더 간단한 기계가 만들어지고 실제 패턴 처리 작업을 쉽게 구현할 수 있습니다. – gibbss

관련 문제