의미 분석이란, 프로그램의 선언과 진술이 의미론적으로 정확한지 확인하는 작업이다.
즉, 프로그램의 의미가 명확하고 제어 구조와 데이터 형식을 사용해야 하는 방식과 일치하는지 확인하는 작업이다.
💡
Syntax
와 다른점
예를 들면, a = “b”+1이라는 수식이 있다고 하면,
syntax analyzer는 이것을 맞다고 판단하지만 semantic analyzer는 type checking을 통해 덧셈이 불가능하다고 판단하고 에러를 발생시킴(인터프리터의 역할이라도 보면 된다.)
compile 과정에서 type checking을 수행하는 semantic analysis
💡 여기서 static vs dynamic
운영체제에서의 static, dynamic과는 다르게 static은 compile과정에서, dynamic은 코드가 실행되는 과정에서 수행하는 작업이라고 생각하면 된다.
의미 정보 처리로 형식 문법을 보완하는 형식적인 방법이다. 의미정보는 문법의 터미널 및 비터미널 기호와 관련된 속성에 저장된다.
쉽게 말하면 parse tree에 semantic한 attribute를 추가해주는 문법이다.
syntax : <expr> => <expr> + <expr>
semantic : <expr> is integer
텍스트로는 이해가 쉽지 않으니 쉬운 예시를 들어보자
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
에 예측되는 type과 a
의 실제 type을 비교하는 것이다. 만약 같다면 type checking이 완료된 것이고 아니면 error인 셈이다.
run time에 parsing과 type check를 진행하는 semantic analysis