컴파일러 설계-의미 분석

구문 분석 단계에서 구문 분석기가 구문 분석 트리를 구성하는 방법을 배웠습니다. 해당 단계에서 생성 된 일반 구문 분석 트리는 트리를 평가하는 방법에 대한 정보를 전달하지 않기 때문에 일반적으로 컴파일러에 사용되지 않습니다. 언어의 규칙을 만드는 문맥없는 문법의 생산은 그것을 해석하는 방법을 수용하지 않습니다.

예를 들면

E → E + T

위의 CFG 제작에는 관련된 의미 규칙이 없으며 제작을 이해하는 데 도움이되지 않습니다.

의미론

언어의 의미는 토큰 및 구문 구조와 같은 구문에 의미를 제공합니다. 의미론은 기호, 유형 및 서로 간의 관계를 해석하는 데 도움이됩니다. 시맨틱 분석은 소스 프로그램에서 구성한 구문 구조가 의미를 도출하는지 여부를 판단합니다.

CFG + semantic rules = Syntax Directed Definitions

예를 들면 :

int a = “value”;

어휘 및 구조적으로 정확하므로 어휘 및 구문 분석 단계에서 오류를 발행해서는 안되지만 할당 유형이 다르기 때문에 의미 오류를 생성해야합니다. 이러한 규칙은 언어의 문법에 의해 설정되고 의미 분석에서 평가됩니다. 의미 분석에서 다음 작업을 수행해야합니다.

  • 범위 해결
  • 유형 검사
  • 배열 바인딩 검사

의미 오류

시맨틱 분석기가 인식 할 것으로 예상되는 몇 가지 시맨틱 오류를 언급했습니다.

  • 유형 불일치
  • 선언되지 않은 변수
  • 예약 된 식별자 오용.
  • 범위에서 변수의 다중 선언.
  • 범위를 벗어난 변수에 액세스합니다.
  • 실제 및 형식 매개 변수가 일치하지 않습니다.

속성 문법

속성 문법은 문맥에 민감한 정보를 제공하기 위해 일부 추가 정보 (속성)가 하나 이상의 비 터미널에 추가되는 특수한 형태의 문맥없는 문법입니다. 각 속성에는 정수, 부동 소수점, 문자, 문자열 및 표현식과 같이 잘 정의 된 값 도메인이 있습니다.

속성 문법은 문맥없는 문법에 의미를 제공하는 매개체이며 프로그래밍 언어의 구문과 의미를 지정하는 데 도움이 될 수 있습니다. 속성 문법 (파싱 트리로 볼 때)은 트리의 노드간에 값이나 정보를 전달할 수 있습니다.

Example:

E → E + T { E.value = E.value + T.value }

CFG의 오른쪽 부분에는 문법 해석 방법을 지정하는 의미 규칙이 포함되어 있습니다. 여기서 비단 자 E와 T의 값을 더해 결과를 비단 자 E에 복사합니다.

시맨틱 속성은 구문 분석시 도메인의 값에 할당되고 할당 또는 조건시 평가 될 수 있습니다. 속성이 값을 얻는 방식에 따라 크게 합성 속성과 상속 속성의 두 가지 범주로 나눌 수 있습니다.

합성 된 속성

이러한 속성은 하위 노드의 속성 값에서 값을 가져옵니다. 설명을 위해 다음 프로덕션을 가정하십시오.

S → ABC

S가 자식 노드 (A, B, C)에서 값을 가져 오는 경우 ABC의 값이 S로 합성되므로 합성 된 속성이라고합니다.

이전 예제 (E → E + T)에서와 같이 부모 노드 E는 자식 노드에서 값을 가져옵니다. 합성 된 속성은 상위 노드 또는 형제 노드에서 값을 가져 오지 않습니다.

상속 된 속성

합성 된 속성과 달리 상속 된 속성은 상위 및 / 또는 형제에서 값을 가져올 수 있습니다. 다음 제작에서와 같이

S → ABC

A는 S, B 및 C에서 값을 가져올 수 있습니다. B는 S, A 및 C에서 값을 가져올 수 있습니다. 마찬가지로 C는 S, A 및 B에서 값을 가져올 수 있습니다.

Expansion : 문법 규칙에 따라 터미널이 아닌 터미널을 터미널로 확장 한 경우

Reduction: 터미널이 문법 규칙에 따라 해당 비 터미널로 축소 된 경우. 구문 트리는 하향식 및 왼쪽에서 오른쪽으로 구문 분석됩니다. 감소가 발생할 때마다 해당 의미 규칙 (액션)을 적용합니다.

시맨틱 분석은 구문 지시 번역을 사용하여 위의 작업을 수행합니다.

시맨틱 분석기는 이전 단계 (구문 분석)에서 AST (Abstract Syntax Tree)를 수신합니다.

시맨틱 분석기는 Attributed AST라고하는 AST와 함께 속성 정보를 첨부합니다.

속성은 두 개의 튜플 값, <속성 이름, 속성 값>입니다.

예를 들면 :

int value  = 5;
<type, “integer”>
<presentvalue, “5”>

모든 프로덕션에 의미 규칙을 첨부합니다.

S- 기여 SDT

SDT가 합성 된 속성 만 사용하는 경우 S- 속성 SDT라고합니다. 이러한 속성은 생산 후 (오른쪽) 시맨틱 동작이 기록 된 S- 속성 SDT를 사용하여 평가됩니다.

위에서 설명한 것처럼 S- 속성 SDT의 속성은 상위 노드의 값이 하위 노드의 값에 따라 달라 지므로 상향식 구문 분석에서 평가됩니다.

L- 기여 SDT

이 형식의 SDT는 오른쪽 형제에서 값을 가져 오지 않는 제한과 함께 합성 및 상속 된 속성을 모두 사용합니다.

L 속성 SDT에서 비 터미널은 부모, 자식 및 형제 노드에서 값을 가져올 수 있습니다. 다음 생산에서와 같이

S → ABC

S는 A, B, C (합성)에서 값을 취할 수 있습니다. A는 S에서만 값을 가져올 수 있습니다. B는 S와 A에서 값을 가져올 수 있습니다. C는 S, A, B에서 값을 가져올 수 있습니다. 비 터미널은 오른쪽 형제에서 값을 가져올 수 없습니다.

L 속성 SDT의 속성은 깊이 우선 및 왼쪽에서 오른쪽 구문 분석 방식으로 평가됩니다.

정의가 S 속성이면 L 속성 정의가 S 속성 정의를 포함하므로 L 속성도 있다고 결론을 내릴 수 있습니다.