2010-07-10 4 views
2

나는 용의 책을 읽고있다. 책에서 텍스트를 인용 (3.1.4 어휘 오류, PNO 114)어휘 분석에 관한 질문

그것은 소스 코드 오류가 있음을, 다른 구성 요소의 도움없이, 알려줄 수있는 어휘 분석기 어렵다 . 예를 들어, 경우 문자열 fi가 컨텍스트에서 C 프로그램에서 처음 발생 : 어휘 분석기가 fi 여부를 말할 수

fi (a == f(x)) ... 

키워드 if 또는 신고되지 않은의 맞춤법이 잘못되었는지 기능 식별자. 이 경우는 에서 아마 파서 - - 때문에 전위에 오류를 처리 fi 토큰 ID에 대해 유효한 어휘이기 때문에, 어휘 분석기는 파서를 및 의 다른 단계를 컴파일러 수 있도록 토큰 id을 반환해야 편지의.

이 글을 읽은 후 조금 혼란 스럽습니다. 내 이해는 어휘 분석기가 왼쪽에서 오른쪽으로 텍스트 처리를 시작하고 패턴이 일치 할 때마다 토큰을 반환합니다. 따라서 일치하는 키워드가 if 인 언어의 경우 fi과 어떻게 일치할까요?

의견이 있으십니까?

답변

7

토큰은 if 토큰과 일치하지 않지만 "identifier"를 나타내는 토큰 id과 일치합니다. 일치하는 키워드가 없으면 모두 잡아라. 어휘 분석기는 특정 위치에서 "기대하는"것을 알지 못합니다. 그냥 토큰을 반환하고 파서는 예상 한 내용을 알 수 있습니다. 는 C 파서 함수 호출 if가 주어진 시점에서 유일한 예상 입력이 있다면 당신은 말할 것 어떻게

fi (a == f(x)); 
+0

아 .. 이제 말이됩니다. 감사합니다 –

1

예를 들면 다음과 같은 성명을 수락한다?

int a = 42; 
if (a == 42) 
    puts("ok"); 

int a = 42; 
fi (a == 42) 
    puts("ok"); 

fi는 함수 호출이 될 수 있습니다. 예를 들어, 위의 의 잘못 철자 같을 수 fi는 함수 int을 취하고 void를 반환

int a = 42; 
fi(a == 42); 
puts("ok"); 

.

1

이것은 어휘 분석 오류 설명에 대한 잘못된 선택입니다. 이 텍스트가 당신에게 말하려고하는 것은 컴파일러가 "if"키워드의 철자가 잘못되었다는 것을 인식하지 못한다는 것입니다 (역순으로 작성했습니다). 예를 들어 유효한 변수 이름 인 "fi"를보고 파서에 ID (예 : "VARIABLE")를 반환합니다. 파서는 나중에 구문 오류를 인식합니다.

왼쪽에서 오른쪽 또는 오른쪽에서 왼쪽으로가는 것과 아무 관련이 없습니다. 물론 컴파일러는 소스 코드를 왼쪽에서 오른쪽으로 읽습니다. 내가 말한대로 -이 설명을위한 키워드의 빈약 한 선택.

2

구문 분석과 어휘 분석을 구분해야합니다.

  • 어휘 분석 작업은 일련의 문자를 토큰 문자열로 변환하는 것입니다. 다양한 유형의 토큰, 이전 ID, 추가 운영자, STATEMENT OPERATOR 등이있을 수 있습니다. 어휘 분석은 토큰과 일치하지 않는 텍스트 문자열을 발견하면 오류가 발생하여 실패 할 수 있습니다. 귀하의 경우 fi (a == f(x)) ...<IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <EQUALITY> <IDENTIFIER> <LEFT BRACKET> <IDENTIFIER> <RIGHT BRACKET> <RIGHT BRACKET> .....

  • 으로 변환됩니다. 토큰 문자열이 생성되면 구문 분석이 수행됩니다. 이것은 전형적으로 토큰으로부터 어떤 종류의 구문 트리를 구성하는 것을 포함합니다. 구문 분석기는 언어에서 허용되는 모든 유효한 문 형식을 알고 있습니다. 구문 분석기가 위의 토큰 시퀀스를 허용하는 구문 규칙을 찾을 수 없으면 실패합니다.

+0

고마워요. 이제는 분명합니다. –