정적 의미론과 속성 문법

문법에는 맞는데 컴파일러가 거부하는 코드는 무엇에 걸린 걸까?

문법이 못 잡는 것

생김새는 맞는데 틀린 코드

두 코드 모두 '변수 = 식' 꼴이라 문법에는 맞습니다. 그런데 하나는 선언하지 않은 변수를 썼고, 하나는 타입(값의 종류)이 맞지 않습니다. 이렇게 실행 전에 검사하는 규칙이 정적 의미론(static semantics)입니다.

예시입니다. 선언은 변수의 이름과 타입을 미리 알리는 것입니다.

속성 문법

나무의 마디에 값을 붙입니다

속성 문법(attribute grammar)은 문맥 자유 문법에 세 가지를 더한 것입니다. 파스 트리의 노드(마디)에 붙는 값인 속성(attribute), 속성을 계산하는 함수, 속성이 올바른지 검사하는 조건인 술어(predicate)입니다.

그림은 타입을 속성으로 삼은 예시입니다. 실수는 소수점이 있는 수의 타입입니다.

아래에서 위로

잎에서 시작해 올려 보냅니다

a와 b는 정수, c는 실수로 선언했다고 합시다. 잎에 처음부터 주어지는 값이 고유 속성(intrinsic attribute)이고, 자식의 속성으로 계산한 부모의 속성이 합성 속성(synthesized attribute)입니다. 정수와 실수를 더하면 실수이므로 식의 실제 타입은 실수입니다.

앞의 예제 문법을 줄인 예시입니다(항 단계 생략).

위에서 아래로

기대하는 값을 내려 보냅니다

대입받는 a가 정수이므로 오른쪽 식도 정수여야 합니다. 이 기대 타입처럼 부모 쪽에서 자식으로 내려 주는 속성이 상속 속성(inherited attribute)입니다. 술어가 실제 타입과 기대 타입을 견주어, 다르면 오류로 알립니다.

예시입니다. ≠ 는 '다르다'는 표시입니다. 프로그램을 실행하지 않고 타입 오류를 찾았습니다.

쓰이는 곳

컴파일러의 검사 기준이 됩니다

속성 문법은 정적 의미론을 형식으로 적는 데 쓰이고, 컴파일러를 설계할 때 정적 의미 규칙을 검사하는 데 쓰입니다. 1강 8편의 의미 분석 단계가 타입을 검사하던 일이 이것입니다.

다음 편

실행하기 전의 규칙은 봤습니다. 실행할 때의 뜻은 어떻게 적을까요?

8편뜻은 무엇으로 적을까? 2강 목록