컴파일러 (3.Sematic Analysis)

장윤성·2023년 2월 15일
1
post-thumbnail

의미 분석이란, 프로그램의 선언과 진술이 의미론적으로 정확한지 확인하는 작업이다.

즉, 프로그램의 의미가 명확하고 제어 구조와 데이터 형식을 사용해야 하는 방식과 일치하는지 확인하는 작업이다.

💡 Syntax와 다른점
예를 들면, a = “b”+1이라는 수식이 있다고 하면,
syntax analyzer는 이것을 맞다고 판단하지만 semantic analyzer는 type checking을 통해 덧셈이 불가능하다고 판단하고 에러를 발생시킴(인터프리터의 역할이라도 보면 된다.)

Static Semantics

compile 과정에서 type checking을 수행하는 semantic analysis

💡 여기서 static vs dynamic
운영체제에서의 static, dynamic과는 다르게 staticcompile과정에서, dynamic코드가 실행되는 과정에서 수행하는 작업이라고 생각하면 된다.

Attribute grammer

의미 정보 처리로 형식 문법을 보완하는 형식적인 방법이다. 의미정보는 문법의 터미널 및 비터미널 기호와 관련된 속성에 저장된다.

쉽게 말하면 parse tree에 semantic한 attribute를 추가해주는 문법이다.

syntax : <expr> => <expr> + <expr>
semantic : <expr> is integer
  • Attribute
    • synthesized attributes : parse tree로 표현시 자식 노드로 부터 자신의 속성이 결정됨
    • inherited attributes : 부모나 형제 노드로부터 자신의 속성이 결정됨. 주로 부모에게 받는것이 일반적이다.
    • intrinsic attributes : symbol table에서 속성값을 가지고 오는 경우이다. parse tree 바깥에서 속성이 결정된다.
  • Symbol table 프로그램에 사용되는 모든 기호의 이름과 정보를 체계적으로 관리하기 위한 자료구조 lexical analysis때 생성된 lexeme에 대한 정보를 모아놓은 곳이라 생각하면 된다. 이것을 통해서 수식에서의 type과 symbol table에 정의된 type을 비교한다.

텍스트로는 이해가 쉽지 않으니 쉬운 예시를 들어보자

int a;
double b;
a = a+b;
printf('%d',a);

이 코드는 에러가 발생한다. 왜냐하면 a = a+b;에서 좌변의 a는 int, 우변의 a+b는 double이기 때문이다. 그렇다면 어떻게 에러를 발생시킬까? a,b는 이미 선언했기 때문에 symbol table에 저장되어있다. 그리고 a = a+b;가 들어왔을 때 a+b에 예측되는 typea의 실제 type을 비교하는 것이다. 만약 같다면 type checking이 완료된 것이고 아니면 error인 셈이다.

Dynamic Semantics

run time에 parsing과 type check를 진행하는 semantic analysis

  • axiomatic semantics program의 의미를 직접 분명하게 하기보다는 그 program에 대해서 증명될 수 있는 것을 분명하게 한다. 프로그램의 정확성을 증명한다.
  • operational semantics 어떻게 program이 수행할지 code적으로 해석한다. 문장이나 program의 의미를 기계상에서 수행되는 그 효과(상태의 변화 sequence)를 명세한다.
  • denotational semantics 각 언어 요소에 대해서 수학적 객체를 정의하고, 그 언어요소의 사례를 그 수학적 객체의 사례로 사상하는 함수를 정의하는 것이다.
profile
소개를 어떻게 한줄로 해요..

0개의 댓글