저는 Andrew Appel의 C로 현대 컴파일러 컴파일을 읽었습니다. 어휘 분석 단계에서 문자 스트림은 토큰으로 변환됩니다. 토큰은 어휘 표현식과 어휘 스펙에 수반되는 조치로 설명됩니다. 정규 표현식의 순서는 중요하며 동등한 NFA를 DFA로 변환 할 때 인코딩 될 우선 순위를 결정합니다.예를 들어 렉스 (Lex)와 같은 어휘 (lexical) 사양에서 지정된 동작은 어떻게됩니까
어휘 사양이 완료되어야합니다. 그것이 Appel이 마지막 정규 표현식과 함께 error()
액션을 추가 한 이유입니다.
이 어휘 사양은 Lex
(어휘 분석 생성기)의 어휘 사양과 매우 유사하게 보입니다.
전환 매트릭스를 인코딩하는 동안 데드 스테이트가 추가됩니다. 이제 제 질문은 죽은 상태에서 일어나는 일입니다. 내 생각에 어휘 사양이 완전하지 않기 때문입니다. 죽은 상태로 끝날 수도 있습니다. 그러나 어휘 사양에서이 작동 불능 상태에 대한 어떤 조치도 지정되지 않았습니까?
그래서에만 illegal characters
감지 것 같다하지만 if*
죽은 상태로 끝날 것인가?
존재하지 않는 '최종 상태'를 언급하는 경우를 제외하고는이 대답을 이해하기 어렵습니다. – EJP
@EJP : 사용 불능 상태는 '최종 상태'가 아닙니다. 도달 할 때 가장 최근의 최종 상태의 상태 번호가 가장 긴 일치 규칙에 따라 올바른 최종 상태이고 마지막 마지막 상태의 입력 위치가 렉서가있는 위치라는 것을 알 수있는 특별한 상태입니다 다음 토큰을 시작할 것입니다.가장 긴 일치 규칙에 필요한 두 변수는 최종 상태에 도달 할 때마다 업데이트되지만 죽은 상태에 도달하면 업데이트가 끝납니다. – Matthias
@EJP : 그래서 전이 함수에 따라 반복적으로 거기에 루프를 허용하더라도 죽은 상태는 렉서가 동일한 토큰에 대해 죽은 상태로 두 번 이상 돌아 가지 않도록하기 위해 트리거로 사용됩니다. 각각의 토큰에 대해 죽은 상태에서 한 번만 사용할 수 있으며, 차례로 현재 가장 긴 일치 토큰에 대한 검색이 종료됩니다. – Matthias