컴파일러 설계-오류 복구
파서는 프로그램의 오류를 감지하고보고 할 수 있어야합니다. 오류가 발생하면 구문 분석기가 오류를 처리하고 나머지 입력을 구문 분석 할 수 있어야합니다. 대부분 파서에서 오류를 확인해야하지만 컴파일 프로세스의 다양한 단계에서 오류가 발생할 수 있습니다. 프로그램에는 다양한 단계에서 다음과 같은 종류의 오류가있을 수 있습니다.
Lexical : 잘못 입력 된 일부 식별자의 이름
Syntactical : 세미콜론 누락 또는 균형이 맞지 않는 괄호
Semantical : 호환되지 않는 값 할당
Logical : 코드에 연결할 수 없음, 무한 루프
코드의 오류를 처리하기 위해 구문 분석기에서 구현할 수있는 네 가지 일반적인 오류 복구 전략이 있습니다.
패닉 모드
구문 분석기가 명령문의 어느 곳에서나 오류를 발견하면 세미콜론과 같은 잘못된 입력에서 구분 기호로의 입력을 처리하지 않음으로써 나머지 명령문을 무시합니다. 이것은 오류 복구의 가장 쉬운 방법이며 파서가 무한 루프를 개발하는 것을 방지합니다.
문 모드
구문 분석기에 오류가 발생하면 구문의 나머지 입력이 구문 분석기가 미리 구문 분석 할 수 있도록 수정 조치를 취합니다. 예를 들어, 누락 된 세미콜론을 삽입하거나 쉼표를 세미콜론으로 대체하는 등의 작업을 수행합니다. 파서 설계자는 잘못된 수정이 무한 루프로 이어질 수 있으므로 여기서주의해야합니다.
오류 제작
코드에서 발생할 수있는 몇 가지 일반적인 오류는 컴파일러 설계자에게 알려져 있습니다. 또한 디자이너는 이러한 오류가 발생할 때 잘못된 구성을 생성하는 프로덕션으로 사용할 증강 문법을 만들 수 있습니다.
전역 보정
파서는 프로그램을 전체적으로 고려하고 프로그램이 무엇을 하려는지 알아 내고 가장 근접한 일치 항목을 찾으려고 시도합니다. 이는 오류가 없습니다. 잘못된 입력 (문) X가 제공되면 가장 가까운 오류없는 명령문 Y에 대한 구문 분석 트리를 생성합니다. 이렇게하면 구문 분석기가 소스 코드에서 최소한의 변경을 수행 할 수 있지만 복잡성 (시간 및 공간)으로 인해 이 전략은 아직 실제로 구현되지 않았습니다.
추상 구문 트리
구문 분석 트리 표현은 실제로 필요한 것보다 더 많은 세부 정보를 포함하므로 컴파일러에서 구문 분석하기가 쉽지 않습니다. 다음 구문 분석 트리를 예로 들어 보겠습니다.
자세히 살펴보면 대부분의 리프 노드가 부모 노드의 단일 자식임을 알 수 있습니다. 이 정보는 다음 단계로 공급하기 전에 제거 할 수 있습니다. 추가 정보를 숨기면 아래와 같이 트리를 얻을 수 있습니다.
추상 트리는 다음과 같이 나타낼 수 있습니다.
AST는 불필요한 정보가 가장 적은 컴파일러에서 중요한 데이터 구조입니다. AST는 구문 분석 트리보다 더 간결하며 컴파일러에서 쉽게 사용할 수 있습니다.