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

82
구문과 의미론 syntax & semantics NHN NEXT 남현욱

Upload: nam-hyeonuk

Post on 30-Jun-2015

2.462 views

Category:

Software


0 download

DESCRIPTION

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

TRANSCRIPT

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

구문과 의미론syntax & semantics

NHN NEXT남현욱

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

1. 기본 개념

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

while (if_statement) { statement; }

1.기본 개념

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

while (if_statement) { statement; }

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

1.기본 개념

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

while (if_statement) { statement; }

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

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

1.기본 개념

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

1.기본 개념

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

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

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

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

1.기본 개념

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

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

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

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

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

어휘항목의 예)

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

1.기본 개념

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

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

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

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

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

어휘항목의 예)

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

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

1.기본 개념

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

index = 2 *count + 17;

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

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

1.기본 개념

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

index = 2 *count + 17;

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

identifier

equal_sign

int_literal

mult_op

identifier

plus_op

int_literal

semicolon

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

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

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

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

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

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

<assign> → <var> = <expression>

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

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

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

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

<assign> → <var> = <expression>

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

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

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

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

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

<assign> → <var> = <expression>

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

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

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

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>

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

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

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

<ident_list> → identifier | identifier, <ident_list>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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)라 한다. 그러나 유도 순서는 생성되는 언어에 영향을 끼치지 않는다.

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

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

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

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

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

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

예제)

파스 트리 예시 문법

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

파스 트리<assign>

유도된 문장 : <assign>

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

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>

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

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>

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

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> )

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

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> )

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

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> )

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

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 )

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

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>

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

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

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

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

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

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

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

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

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

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

모호하지 않은 문법

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

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

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

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

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

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

모호하지 않은 문법

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

파스 트리<assign>

유도된 문장 : <assign>

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

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>

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

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>+

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

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>

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

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>

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

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>

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

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

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

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

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

if-then-else 문법

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

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

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>

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

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

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와 연결되어야 할 지 모호하기 때문

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

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

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

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

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

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>

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

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

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

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

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>]

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

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

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

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

확장 2. 반복 표기

BNF

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

EBNF

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

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

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

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

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

확장 3. 다중 선택 표기BNF

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

EBNF

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

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

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

3. 속성 문법

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

3.속성 문법

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

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

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

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

3.속성 문법

정적 의미론

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

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

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

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

3.속성 문법

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

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

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

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

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

3.속성 문법

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

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

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

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

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

3.속성 문법

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

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

3.속성 문법

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

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

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>과 연관된 상속 속성이다. 대입문에서 좌측에 위치한 변수의 타입에 의해 결정되며, 식에 대해 예상되는 연산결과 타입을 저장하는데 사용된다.

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

3.속성 문법

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

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

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

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

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)

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

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 값으로 할당됨을 의미한다.

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

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]의 표기는 같은 논터미널이 한 구문 규칙에서 두 번 이상 나타날 때 둘을 구분하기 위한 요소이다.( 실제 구문 규칙의 일부가 아니다. )

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

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인 것으로 규정되어 있다.

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

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 속성이 같아야 함을 뜻한다.

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

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)

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

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

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)이라고 하고, 그 내용을 저장해 둔 곳을 심볼 테이블이라고 한다.

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

3.속성 문법

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

<assign>

<expr>

<var>[2]<var>

<var>[3]

A = +A B

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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