구문과 의미론(정적 의미론까지)

Post on 30-Jun-2015

2.461 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

프로그래밍 언어론에서 BNF 및 정적 의미론에 대해서 정리한 내용입니다.

TRANSCRIPT

구문과 의미론syntax & semantics

NHN NEXT남현욱

1. 기본 개념

while (if_statement) { statement; }

1.기본 개념

while (if_statement) { statement; }

구문(syntax) : 표현식, 문장, 프로그램 단위에 대한 형식. 즉, 반복문을 의미하기 위해 작성해야하는 구문 (while) 과 같은 문법.

1.기본 개념

while (if_statement) { statement; }

구문(syntax) : 표현식, 문장, 프로그램 단위에 대한 형식. 즉, 반복문을 의미하기 위해 작성해야하는 구문 (while) 과 같은 문법.

의미론(semantics) : 표현식, 문장, 프로그램 단위에 대한 의미. while 구문이 실제로 어떤 의미를 지니고 있는가와 같이 구문에서 파악되는 의미.

1.기본 개념

1.기본 개념

언어 알파벳(alphabet)으로 구성된 문자열들의 집합

문장 해당 언어에 속한 문자열.

구문 규칙언어의 알파벳으로부터 만들어진 문자열들이 그 언어에 속하는지 여부를 나타낸 것.

1.기본 개념

어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위.

식별자(identifier): 변수, 클래스 등의 이름

연산자(operator): +,-,*,/, ...

수치 리터럴(numeric literal): 1,3, -6.5, ...

특수어(special word): int, float, ...

어휘항목의 예)

1.기본 개념

어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위.

식별자(identifier): 변수, 클래스 등의 이름

연산자(operator): +,-,*,/, ...

수치 리터럴(numeric literal): 1,3, -6.5, ...

특수어(special word): int, float, ...

어휘항목의 예)

토큰(token) : 어휘항목들에 대한 분류

1.기본 개념

어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위.

index = 2 *count + 17;

이 문장은 어떤 어휘항목들로 구성되어 있을까?

1.기본 개념

어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위.

index = 2 *count + 17;

이 문장은 어떤 어휘항목들로 구성되어 있을까?

identifier

equal_sign

int_literal

mult_op

identifier

plus_op

int_literal

semicolon

2. 구문 기술의 형식적 방법

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF) 프로그래밍을 위한 메타언어(metalanguage - 다른 언어를 기술하는데 사용되는 언어)

예제)대입문 형식에 대한 정의

<assign> → <var> = <expression>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF) 프로그래밍을 위한 메타언어(metalanguage - 다른 언어를 기술하는데 사용되는 언어)

예제)대입문 형식에 대한 정의

<assign> → <var> = <expression>

LHS(left-hand side). 정의하고자 하는 구문. <> 기호는 해당 구문 구조에 대한 추상화를 의미한다. 이런 추상화를 논터미널 기호(nonterminal symbol) 라고 부른다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF) 프로그래밍을 위한 메타언어(metalanguage - 다른 언어를 기술하는데 사용되는 언어)

예제)대입문 형식에 대한 정의

<assign> → <var> = <expression>

LHS(left-hand side). 정의하고자 하는 구문. <> 기호는 해당 구문 구조에 대한 추상화를 의미한다. 이런 추상화를 논터미널 기호(nonterminal symbol)라고 부른다.

total = subtotal1 + subtotal2 이 구문으로부터 생성될 수 있는 문장. <var>이 total로, <expression>이 subtotal1 + subtotal2로 기술됨. 이렇게 기술된 것을 터미널 기호(terminal symbol)라고 한다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)

하나의 논터미널 기호가 여러 개의 정의를 가질 수 있다.

<if_stmt> → if(<logic_expr>) <stmt><if_stmt> → if(<logic_expr>) <stmt> else <stmt>

또는

<if_stmt> → if(<logic_expr>) <stmt> | if(<logic_expr>) <stmt> else <stmt>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)리스트에 대한 명세BNF는 리스트(배열, 집합 등)를 표현하기 위해 재귀를 사용한다.

<ident_list> → identifier | identifier, <ident_list>

<ident_list> 는 하나의 identifier 토큰으로 구성되거나 identifier 다음에 콤마와 또다른 <ident_list>가 오는 것으로 정의.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도문법은 언어를 정의하기 위한 장치이며, 언어의 문장들은 시작 기호(start symbol)라 불리는 문법의 특정 논터미널부터 시작되는 일련의 규칙 적용을 통해 생성된다. 이를 유도(derivation)라고 한다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin <stmt> ; <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin <var> = <expression> ; <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = <expression> ; <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = <var> + <var> ; <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + <var> ; <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; <stmt_list> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; <stmt> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; <var> = <expression> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; B = <expression> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt_list> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; B = <var> end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt_list> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; B = C end

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)문법과 유도

예제)

예시 문법

<program> → begin <stmt_list> end<stmt_list> → <stmt> | <stmt> ; <stmt_list><stmt_list> → <var> = <expression><var> → A | B | C<expression> → <var> + <var> | <var> - <var> | <var>

유도<program> → begin A = B + C ; B = C end

이전 단계의 논터미널 하나를 그 논터미널의 정의로 대체하여 유도한다.

이 유도 예제에서는 맨 왼쪽의 논터미널부터 순서대로 유도를 진행했는데, 이를 최좌단 유도(leftmost derivation)라 한다. 그러나 유도 순서는 생성되는 언어에 영향을 끼치지 않는다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)BNF의 유도과정을 이해하기 쉽게 트리 형태로 나타낸 것. 중간 노드는 논터미널 기호를 나타내고 잎 노드는 터미널 기호를 나타낸다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : <assign>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

<id> = <expr>

유도된 문장 : <id> = <expr>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

<id> = <expr>

A <id> <expr>*

유도된 문장 : A = <id> * <expr>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

<id> = <expr>

A <id> <expr>*

B <expr>( )

유도된 문장 : A = B * ( <expr> )

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

<id> = <expr>

A <id> <expr>*

B <expr>( )

<id> + <expr>

유도된 문장 : A = B * ( <id> + <expr> )

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

<id> = <expr>

A <id> <expr>*

B <expr>( )

<id> + <expr>

A <id>

유도된 문장 : A = B * ( A + <id> )

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)파스트리(parse tree)

예제)

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

파스 트리<assign>

<id> = <expr>

A <id> <expr>*

B <expr>( )

<id> + <expr>

A <id>

C유도된 문장 : A = B * ( A + C )

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)모호성(ambiguous) 하나의 문장이 두 개 이상의 파스 트리로 표현될 수 있는 경우 모호한 문법이라고 한다.

파스 트리 예시 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id>

모호한 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <expr> | <expr> * <expr> | ( <expr> ) | <id>

파스트리 예제 문법을 조금 바꾸면 모호한 문법이 된다.

2.구문기술의 형식적 방법

모호한 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <expr> | <expr> * <expr> | ( <expr> ) | <id>

A=B+C*A를 표현하는 두 가지 파스트리.

<assign>

<id> = <expr>

<expr> <expr>+

<id> <expr> <expr>*

<id> <id>B

A

AC

<assign>

<id> = <expr>

<expr> <expr>*

<expr> <expr>+

A

<id>

B

<id>

C

<id>

A

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위 더 높은 순위의 연산자가 파스 트리에서 더 낮은 위치(잎 노드에 가까운 위치)에 존재한다는 규칙을 통해 연산자의 우선순위를 나타낼 수 있다.

따라서, 모호한 문법은 파스 트리끼리 연산자 순위에 모순이 생길 수 있으므로 연산자의 우선순위를 효과적으로 표현할 수 없다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

이 문법은 앞의 두 문법과 동일한 언어를 생성하지만 모호하지 않으며 덧셈과 곱셈에 대해 우선순위를 표현한다.

※서로 다른 우선 순위를 가진 연산자의 피연산자에 대해 다른 추상화를 사용함으로써 해결.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : <assign>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : <id> = <expr>

<id> = <expr>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : A = <expr> + <term>

<id> = <expr>

A <expr> <term>+

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : A = <term> + <term> * <factor>

<id> = <expr>

A <expr> <term>+

<term> <term> * <factor>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : A = <factor> + <factor> * <id>

<id> = <expr>

A <expr> <term>+

<term>

<factor>

<term> * <factor>

<id><factor>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : A = <id> + <id> * A

<id> = <expr>

A <expr> <term>+

<term>

<factor>

<id>

<term> * <factor>

<id>

A

<factor>

<id>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)연산자 우선순위

모호하지 않은 문법

<assign> → <id> = <expr><id> → A | B | C<expr> → <expr> + <term> | <term><term> → <term> * <factor> | <factor><factor> → ( <expr> ) | <id>

파스 트리<assign>

유도된 문장 : A = B + C * A

<id> = <expr>

A <expr> <term>+

<term>

<factor>

<id>

B

<term> * <factor>

<id>

A

<factor>

<id>

C

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)if-then-else를 위한 모호하지 않은 문법

if-then-else 문법

<if_stmt> → if <logic_expr> then <stmt> | if <logic_expr> then <stmt> else <stmt>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)if-then-else를 위한 모호하지 않은 문법

모호한 if-then-else 문법

<if_stmt> → if <logic_expr> then <stmt> | if <logic_expr> then <stmt> else <stmt><stmt> → <if_stmt>

이 규칙이 추가되면 언어가 모호해진다

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)if-then-else를 위한 모호하지 않은 문법

모호한 if-then-else 문법

<if_stmt> → if <logic_expr> then <stmt> | if <logic_expr> then <stmt> else <stmt><stmt> → <if_stmt>

이 규칙이 추가되면 언어가 모호해진다

if <logic_expr> then if <logic_expr> then <stmt> else <stmt>

에 대해 두 개의 파스 트리가 나온다(직접 해보자).

→ else가 어떤 if와 연결되어야 할 지 모호하기 때문

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)if-then-else를 위한 모호하지 않은 문법

해결책) 일반적으로 else는 가장 가까운 짝이 없는(unmatched) if와 연결된다. 따라서 문장을 두 종류로 구분하여 정의하고, else가 가장 가까운 짝이 없는 if와 연결될 수 있게 구문을 정의함으로써 문제를 해결한다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)if-then-else를 위한 모호하지 않은 문법

해결책) 일반적으로 else는 가장 가까운 짝이 없는(unmatched) if와 연결된다. 따라서 문장을 두 종류로 구분하여 정의하고, else가 가장 가까운 짝이 없는 if와 연결될 수 있게 구문을 정의함으로써 문제를 해결한다.

모호하지 않은 if-then-else 문법

<stmt> → <matched> | <unmatched><matched> → if <logic_expr> then <matched> else <matched> | 임의의 if가 아닌 문장<unmatched> → if <logic_expr> then <stmt> | if <logic_expr> then <matched> else <unmatched>

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)확장 BNF(Extended BNF,EBNF)BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)확장 BNF(Extended BNF,EBNF)BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다.

확장 1. 선택 표기

BNF

<if_stmt> → if (<expression>) <stmt> | if (<expression>) <stmt> else <stmt>

EBNF

<if_stmt> → if (<expression>) <stmt> [else <stmt>]

대괄호 안의 내용은 선택적임(있어도 되고 없어도 됨)을 의미한다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)확장 BNF(Extended BNF,EBNF)BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다.

확장 2. 반복 표기

BNF

<ident_list> → <identifier> | <identifier> , <ident_list>

EBNF

<ident_list> → <identifier> {, <identifier>}

중괄호 안의 내용은 반복적임(몇 번이든 반복될 수 있음)을 의미한다.

2.구문기술의 형식적 방법

Backus-Naur 형식(BNF)확장 BNF(Extended BNF,EBNF)BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다.

확장 3. 다중 선택 표기BNF

<term> → <term> * <factor> | <term> / <factor> | <term> % <factor>

EBNF

<term> → <term> (* | / | %) <factor>

소괄호 안의 내용 중 하나가 선택되어 들어가야함을 의미한다.

3. 속성 문법

3.속성 문법

정적 의미론BNF의 한계BNF로는 기술하기 어렵거나 기술 자체가 불가능한 프로그래밍 구문 구조들이 있다.

1. 타입 호환성Java에서 부동 소수점 값은 정수 형의 변수에 대입이 불가능하나 그 반대는 가능하다. 이런 규칙은 BNF로 기술하기 매우 어렵다.

2. 선언변수가 참조되기 전에 먼저 선언되어야한다는 규칙은 BNF를 이용해서는 기술할 수 없다.

3.속성 문법

정적 의미론

• 정적 의미론은 프로그램의 의미와 간접적으로 연관되며, 주로 타입의 제한 사항을 기술한다.

• 이러한 검사는 컴파일 시간에 수행될 수 있기 때문에 정적 의미론이라는 이름이 붙었다.

• 정적 의미론(static semantics)은 BNF로는 기술하는 것에 한계가 있다.

3.속성 문법

기본 개념 속성 문법(attribute grammer)은 정적 의미론과 프로그램 구문 모두를 기술하기 위해 설계된 문법이다.

속성(attribute) 문법 기호(터미널과 논터미널 기호)와 연관되며, 값을 배정할 수 있다.

속성 계산 함수(attribute computation function) 문법 규칙과 연관되며, 속성 값이 어떻게 계산되는지 나타내는데 쓰인다.

술어 함수(predicate function) 문법 규칙과 연관되며, 언어의 구문과 정적 의미론 규칙을 서술한다.

3.속성 문법

정의 속성 문법(attribute grammer)은 다음의 부가 특징들을 갖는 문법이다.

1. 각 문법 기호들에 속성들의 집합 A(X)가 연관된다.

2. 각 문법 규칙에 의미 함수들의 집합과 그 문법 규칙에 속한 기호들의 속성들에 대한 술어 함수들의 집합이 연관된다.

3. 술어 함수는 속성 집합 {A(X0), ... , A(Xn)}과 리터럴 속성들의 집합의 합집합에 대한 불리안 식 형식을 갖는다.

3.속성 문법

???무슨 소리인지 전혀 모르겠다

3.속성 문법

하나씩 하나씩 천천히 살펴보자

3.속성 문법

정의1. 각 문법 기호들에 속성들의 집합 A(X)가 연관된다.

속성에는 합성 속성(Synthesized attribute)과 상속 속성(Inherited attribute)이 있다. 합성 속성은 파스 트리의 윗방향으로 의미 정보를 전달하는데 사용되며, 상속 속성은 파스트리의 아랫방향과 횡방향(across)으로 의미 정보를 전달하는데 사용된다.

예제)

예시 문법(구문)

<assign> → <var> = <expr><expr> → <var> + <var> | <var><var> → A | B | C

속성

actual_type : 논터미널 <var>와 <expr>에 연관된 합성 속성이다. 이 속성인 변수나 식의 실제 타입인 int, real등을 저장하는데 사용된다.

expected_type: 논터미널 <expr>과 연관된 상속 속성이다. 대입문에서 좌측에 위치한 변수의 타입에 의해 결정되며, 식에 대해 예상되는 연산결과 타입을 저장하는데 사용된다.

3.속성 문법

정의2. 각 문법 규칙에 의미 함수들의 집합과 그 문법 규칙에 속한 기호들의 속성들에 대한 술어 함수들의 집합이 연관된다.

3. 술어 함수는 속성 집합 {A(X0), ... , A(Xn)}과 리터럴 속성들의 집합의 합집합에 대한 불리안 식 형식을 갖는다.

이 두 가지는 앞에서 이야기한 속성을 실제 파스 트리에서 전체 노드에 적용시키기 위한 요소들이다. 각 구문에서 그 구문의 속성이 어떤 식으로 배정되는지 연관된 의미 함수와 술어 함수를 통해 계산한다.

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

속성문법에서는 각 구문 규칙에 대해 그에 연관된 의미론 규칙이 존재한다. 여기서는 대입문의 식에서 <expr>의 expected_type 속성이 <var>.actual_type 값으로 할당됨을 의미한다.

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

[1], [2]의 표기는 같은 논터미널이 한 구문 규칙에서 두 번 이상 나타날 때 둘을 구분하기 위한 요소이다.( 실제 구문 규칙의 일부가 아니다. )

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

expr의 actual_type 속성이 아래의 조건에 따라 결정됨을 의미한다. 여기서는 두 변수(<var>)의 actual_type 속성이 모두 int이면 int, 아니면 real인 것으로 규정되어 있다.

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

술어함수는 불리안 값을 가지며, 해당 구문 규칙에서 속성이 어떤 값을 갖고 있어야 하는가를 규정한다. 속성 문법의 유도 과정에서 술어 함수가 false 값이 나온다면 해당 유도 과정이 잘못되었음을 뜻한다. 여기서 술어 함수는 이 구문 규칙에서 expr의 actual_type 속성과 expected_type 속성이 같아야 함을 뜻한다.

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

위와 마찬가지 방식으로 구문 규칙과 그에 연관된 의미론 규칙, 술어 함수를 정의하고 있다.

3.속성 문법

예제)

대입문에 대한 속성문법

구문 규칙 : <assign> → <var> = <expr>의미론 규칙 : <expr>.expected_type ← <var>.actual_type

구문 규칙 : <expr> → <var>[1] + <var>[2]의미론 규칙 : <expr>.actual_type ← if(<var>[1].actual_type = int) and (<var>[2].actual_type = int) then int else real end if술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <expr> → <var>의미론 규칙 : <expr>.actual_type ← <var>.actual_type술어 함수 : <expr>.actual_type == <expr>.expected_type

구문 규칙 : <var> → A | B | C의미론 규칙 : <var>.actual_type ← look-up(<var>.string)

look-up 함수는 주어진 변수 이름을 심볼 테이블로부터 찾고, 그 변수의 타입을 반환한다. 이 때 이 구문 구조에서 변수( <var> ) 의 타입은 파스 트리 외부로부터 결정되는데, 이런 식으로 외부로부터 값이 결정되는 파스 트리의 잎 노드의 합성 속성을 내장 속성(Intrinsic attribute)이라고 하고, 그 내용을 저장해 둔 곳을 심볼 테이블이라고 한다.

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

actual_type

1. var.actual_type ← look-up(A) (규칙4)

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

actual_type

2. <expr>.expected_type ← <var>.actual_type (규칙 1)

expected_type

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

actual_type

3. <var>[2].actual_type ← look-up(A) (규칙 4)

expected_type

actual_type

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

actual_type

4. <var>[3].actual_type ← look-up(B) (규칙 4)

expected_type

actual_typeactual_type

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

actual_type

5. <expr>.expected_type ← real (규칙 2)

expected_type

actual_typeactual_type

actual_type

3.속성 문법

속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다.

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

actual_type

6. <expr>.expected_type == <expr>.actual_type → true (규칙 2)

expected_type

actual_typeactual_type

actual_type

3.속성 문법

속성 값 계산

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int이다.

최종 결과

actual_type=real

actual_type=real

actual_type=int

expected_type=realactual_type=real

top related