어의 분석 에 관 한 간단 한 총 결

5453 단어 컴 파일 원리
예비 지식
  • 컴 파일 러 의 전단 은 세 개의 모듈 과 두 개의 핵심 데이터 구조 (기호 흐름, 추상 문법 트 리) 로 구성 되 어 있다.
  • 컴 파일 러 는 하나의 흐름 선의 구조 에 있 고 단계 적 무관 성 (각 모듈 의 입 출력 만 고려)
  • 의미 분석 은 전 단계 의 추상 문법 트 리
  • 에 만 의존한다.
  • 의미 분석 도 유형 검사 라 고 한다.상하 문 관련 분석.프로그램 (추상 문법 트 리) 의 상하 문과 관련 된 속성 을 검사 합 니 다.
  • 변 수 는 사용 하기 전에 먼저 설명 합 니 다
  • 표현 식 마다 언제 유형 이 있 습 니까?
  • 함수 호출 과 함수 의 정의 가 일치 합 니 다
  • ....... 예 를 들 어
  • void f(int *p)
    {
        X += 4:
        Cal(X);
        break;
    }

    컴 파일 러 는 x, cal 이 정의 하지 않 은 오 류 를 보고 하고 순환 하 는 오 류 를 찾 지 못 했 습 니 다. 이것 은 바로 문맥 과 관련 된 것 입 니 다. 현재 만 검사 하 는 것 이 아 닙 니 다.
    따라서 의미 분석 이 완성 해 야 할 일 은 주어진 코드 에 대해 모든 의미 오 류 를 찾아내 는 것 이다. 만약 에 오류 가 발생 하면 명확 한 진단 정 보 를 프로그래머 에 게 피드백 하고 프로그래머 는 오류 정보 에 따라 오 류 를 고 쳐 야 한다.
    의미 분석 기 는 하나의 입력 을 받 아들 입 니 다. 이 나 무 는 반드시 문법 이 정확 하고 또 하나의 입력 을 만족 시 킬 것 입 니 다. 바로 프로그램 언어의 합 법 적 인 규칙 (합 법 적 인 것 이 무엇 인지, 불법 인 것 이 무엇 인지 나타 내 는 것) 입 니 다. Yes 나 NO 를 출력 합 니 다. Yes 라면 중간 코드 (이 단계 가 지나 면 프로그램 은 어떠한 문법 과 의미 오류 도 포함 하지 말 아야 합 니 다) 가 생 겨 야 합 니 다. NO 라면.잘못된 메 시 지 를 드 려 야 합 니 다.
    어떻게 프로그램 언어의 의 미 를 정의 합 니까?
    전통 적 으로 대부분의 프로 그래 밍 언어 는 자연 언어 로 프로그램 언어의 의 미 를 표현 한다. 예 를 들 어 '+' 연산 에 대해 좌우 조작 수 는 반드시 성형 수 여야 한다. 예 를 들 어 e1 + e2 는 문법 분석 에 있어 + 번 양쪽 조작 수 는 상관 하지 않 고 의미 분석 은 성형 수 라 는 자연 언어 가 우리 가 한 언어 를 배 우 는 데 필요 한 것 인지 확인 해 야 한다.프로 그래 밍 책
    그러나 컴 파일 러 의 실현 자 는 반드시 언어 중의 의미 규정 에 대해 전면적 인 이 해 를 가 져 야 한다. 예 를 들 어 플러스 양쪽 은 부동 소수점 과 성형 수 일 수 있다.
    그렇다면 어떻게 하면 정확 하고 효율적으로 실 현 될 수 있 을 까?
    다음 문법 을 예 로 들 어 덧셈 좌우 양쪽 은 정수 일 수 밖 에 없다 고 정의 합 니 다.
    E->N
       | true
       | false
       | E + E
       | E && E

    형식 이 합 법 적 인 프로그램
    3 + 4
    False && true

    형식 이 비합법적 인 프로그램
    3 + true
    True + false

    이 언어 에 대한 의미 분석의 임 무 는 다음 과 같다. 주어진 표현 식 e 에 대해 함수 check (e) 를 써 서 표현 식 e 의 유형 을 되 돌려 주 는 것 이다.형식 이 합 법 적 이지 않 으 면 3 + 4 와 같은 표현 식 이 int 로 돌아 오 면 3 + true 표현 식 이 잘못 됩 니 다.
    추상 구문 트 리 의 뒷 순 서 를 옮 겨 다 니 는 의사 코드 입 니 다.
    enum type {int, bool};
    enum type check (exp_t e)
    {
        switch(e->kind)
        case exp_int: return int;
        case exp_true: return true;
        case exp_false: return false;
        case exp_add: t1 = check(e->left);// 
                      t2 = check(e->right);// 
                      if(t1 != int || t2 != int) // 
                         perror(“error”);
                      else return int;
        case exp_and: t1 = check(e->left);
                      t2 = check(e->right);
                      if(t1 != bool || t2 != bool)
                         perror(“error”);
                       else return bool
    }

    기호 표
    유형 검사 에 있어 서 매우 중요 한 데이터 구조 가 있 습 니 다. 기호 표 (key, value) 기호 표: 프로그램 에 있 는 변수 와 관련 된 정보 유형 역할 도 메 인 접근 제어 정보 (예 를 들 어 pubic, private 와 같은 파일 간 의 접근) 는 매우 효율 적 이 어야 합 니 다. 프로그램의 변수 규모 가 int x, bool y table x: int... y: bool...
    기호 표 는 만 들 고 삽입 하 며 찾 는 인터페이스 기능 이 있어 야 한다. 구체 적 으로 선택 한 언어 와 관련 되 고 효율 적 이기 위해 해시 표 등 데이터 구 조 를 사용 하여 실현 할 수 있다. 기호 표 는 공간 을 절약 하기 위해 빨간색 과 검은색 트 리 등 균형 트 리 도 사용 할 수 있다.
    의미 분석 에 나타 날 수 있 는 공통성 문제:
  • 유형 호환성: 유형 검사 문 제 는 흔히 두 가지 유형 이 똑 같은 지 판단 하 는 t1 = = t2 로 귀결 된다.실제 언어 에서 이것 은 흔히 신중하게 처리 해 야 할 복잡 한 문제 이다.
  • 이름 이 같은 언어 를 사용 하면 구조 가 같은 언어 (예 를 들 어 구조 체) 를 직접 비교 할 수 있 고 각 도 메 인
  • 을 재 귀적 으로 비교 해 야 한다.
  • 대상 을 대상 으로 하 는 계승 은 유형 간 의 계승 관 계 를 유지 해 야 한다
  • 오류 진단: 컴 파일 러 는 의미 오 류 를 보고 해 야 한다. 이런 정 보 는 가능 한 한 정확 한 오류 정 보 를 제시 해 야 한다 (2) 가능 한 한 많은 오류 정 보 를 제공 해 야 한다 (3) 가능 한 한 정확 한 오류 위 치 를 제시 해 야 한다. 프로그램 코드 의 위 치 는 이름 에서 떨 어 지지 않 고 전달 해 야 한다 (즉, 품사 분석의 줄 번호 정 보 는 의미 분석 으로 전달 해 야 한다).
  • 코드 번역: 중간 표시 (또는 목표 코드) 를 생 성 합 니 다. 현대 컴 파일 러 의 의미 분석 모듈 은 의미 분석 을 하 는 것 외 에 중간 코드 나 목표 코드 를 생 성 하 는 것 도 책임 지고 코드 생 성 과정 도 나무 에 대한 특정한 옮 겨 다 니 기 때문에 의미 분석 은 컴 파일 러 에서 가장 크 고 복잡 한 모듈 입 니 다.
  • 좋은 웹페이지 즐겨찾기