두 가지 상태가 있습니다. 하나는 다른 하나의 일반적인 인스턴스입니다. 두 상태를 동시에 입력하는 것을 피하는 올바른 방법은 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 바이트의 미리보기가 필요합니다.
lookahead를 사용하면 입력하는 전환을 모호하게 만들 수 있습니다. 이렇게하면 더 간단한 기계가 만들어지고 실제 패턴 처리 작업을 쉽게 구현할 수 있습니다. – gibbss