2014-10-04 2 views
0

저는 Andrew Appel의 C로 현대 컴파일러 컴파일을 읽었습니다. 어휘 분석 단계에서 문자 스트림은 토큰으로 변환됩니다. 토큰은 어휘 표현식과 어휘 스펙에 수반되는 조치로 설명됩니다. 정규 표현식의 순서는 중요하며 동등한 NFA를 DFA로 변환 할 때 인코딩 될 우선 순위를 결정합니다.예를 들어 렉스 (Lex)와 같은 어휘 (lexical) 사양에서 지정된 동작은 어떻게됩니까

어휘 사양이 완료되어야합니다. 그것이 Appel이 마지막 정규 표현식과 함께 error() 액션을 추가 한 이유입니다.

이 어휘 사양은 Lex (어휘 분석 생성기)의 어휘 사양과 매우 유사하게 보입니다.

전환 매트릭스를 인코딩하는 동안 데드 스테이트가 추가됩니다. 이제 제 질문은 죽은 상태에서 일어나는 일입니다. 내 생각에 어휘 사양이 완전하지 않기 때문입니다. 죽은 상태로 끝날 수도 있습니다. 그러나 어휘 사양에서이 작동 불능 상태에 대한 어떤 조치도 지정되지 않았습니까?

enter image description here enter image description here enter image description here

그래서에만 illegal characters 감지 것 같다하지만 if* 죽은 상태로 끝날 것인가?

답변

-1

if*은 죽은 상태가됩니다. 따라서 토큰은 if 바로 뒤에 인식되어 종료됩니다.

파서가 다음 토큰을 요청할 때 if 바로 다음에 시작하여 *을 감지하고 최종 상태로 들어가지만이 시점부터 다른 최종 상태로 절대 들어가지 않고 영구히 죽은 상태가됩니다. 따라서 토큰은 * 바로 뒤에 인식되고 끝납니다.

그래서 정규식 .과 가장 긴 일치 항목을 통해 모든 오류를 항상 알 수 있습니다. 죽은 상태를 시작하면 현재 토큰의 인식이 끝나기 때문입니다.

+0

존재하지 않는 '최종 상태'를 언급하는 경우를 제외하고는이 대답을 이해하기 어렵습니다. – EJP

+0

@EJP : 사용 불능 상태는 '최종 상태'가 아닙니다. 도달 할 때 가장 최근의 최종 상태의 상태 번호가 가장 긴 일치 규칙에 따라 올바른 최종 상태이고 마지막 마지막 상태의 입력 위치가 렉서가있는 위치라는 것을 알 수있는 특별한 상태입니다 다음 토큰을 시작할 것입니다.가장 긴 일치 규칙에 필요한 두 변수는 최종 상태에 도달 할 때마다 업데이트되지만 죽은 상태에 도달하면 업데이트가 끝납니다. – Matthias

+0

@EJP : 그래서 전이 함수에 따라 반복적으로 거기에 루프를 허용하더라도 죽은 상태는 렉서가 동일한 토큰에 대해 죽은 상태로 두 번 이상 돌아 가지 않도록하기 위해 트리거로 사용됩니다. 각각의 토큰에 대해 죽은 상태에서 한 번만 사용할 수 있으며, 차례로 현재 가장 긴 일치 토큰에 대한 검색이 종료됩니다. – Matthias

0

모든 상태의 기본 동작은 문자를 stdout으로 출력하는 것입니다.

Appel이 . 규칙 뒤에 따옴표로 묶인 문자열 규칙을 넣었다고 생각하기가 어렵습니다.

+0

'.'는 실제 RE가 아닌 RE의 표기법에 인용 된 문자열 다음에옵니다. –

+0

그는 "." 다른 규칙들 이후의 규칙 – Matthias

+0

좋습니다. '.'에 대한 더 나은 조치는'return yytext [0];'이며, 파서가 그것을 처리하도록합니다. – EJP