SlideShare a Scribd company logo
1 of 82
Download to read offline
구문과 의미론 
syntax & semantics 
NHN NEXT 
남현욱
1. 기본 개념
1.기본 개념 
while (if_statement) { statement; }
1.기본 개념 
구문(syntax) : 표현식, 문장, 프로그램 단위에 대 
한 형식. 즉, 반복문을 의미하기 위해 작성해야하 
는 구문 (while) 과 같은 문법. 
while (if_statement) { statement; }
구문(syntax) : 표현식, 문장, 프로그램 단위에 대 
한 형식. 즉, 반복문을 의미하기 위해 작성해야하 
는 구문 (while) 과 같은 문법. 
while (if_statement) { statement; } 
의미론(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) 
프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위. 
int_literal 
identifier 
int_literal 
index = 2 *count + 17; 
이 문장은 어떤 어휘항목들로 구성되어 있을까? 
identifier 
equal_sign 
mult_op 
plus_op 
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> 
B <id> <id> 
A 
C A 
<assign> 
<id> = <expr> 
<expr> * <expr> 
A 
<expr> + <expr> 
<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> 
<id> = <expr> 
A <expr> + <term> 
유도된 문장 : 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> 
<id> = <expr> 
A <expr> + <term> 
<term> <term> * <factor> 
유도된 문장 : A = <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> 
<id> = <expr> 
A <expr> + <term> 
<term> 
<factor> 
유도된 문장 : A = <factor> + <factor> * <id> 
<term> * <factor> 
<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 = <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>의 expected_type 
속성이 <var>.actual_type 값으로 할당됨을 
의미한다. 
술어 함수 : <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 ← 
[1], [2]의 표기는 같은 
논터미널이 한 구문 규칙 
에서 두 번 이상 나타날 
때 둘을 구분하기 위한 
요소이다.( 실제 구문 규 
칙의 일부가 아니다. ) 
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.속성 문법 
예제) 
expr의 actual_type 속성이 아래의 
조건에 따라 결정됨을 의미한다. 여기 
서는 두 변수(<var>)의 actual_type 
속성이 모두 int이면 int, 아니면 real 
인 것으로 규정되어 있다. 
대입문에 대한 속성문법 
구문 규칙 : <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 
술어함수는 불리안 값을 가지며, 해당 구문 규칙에서 
속성이 어떤 값을 갖고 있어야 하는가를 규정한다. 속 
성 문법의 유도 과정에서 술어 함수가 false 값이 나온 
다면 해당 유도 과정이 잘못되었음을 뜻한다. 여기서 
술어 함수는 이 구문 규칙에서 expr의 actual_type 
속성과 expected_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)
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 
look-up 함수는 주어진 변수 이름을 심볼 테이블 
로부터 찾고, 그 변수의 타입을 반환한다. 이 때 이 
구문 구조에서 변수( <var> ) 의 타입은 파스 트리 
외부로부터 결정되는데, 이런 식으로 외부로부터 
값이 결정되는 파스 트리의 잎 노드의 합성 속성을 
내장 속성(Intrinsic attribute)이라고 하고, 그 
내용을 저장해 둔 곳을 심볼 테이블이라고 한다. 
술어 함수 : <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.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
<var>[3] 
A = A + B
3.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
<var>[3] 
actual_type 
A = A + B 
1. var.actual_type ← look-up(A) (규칙4)
3.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
expected_type 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
<var>[3] 
actual_type 
A = A + B 
2. <expr>.expected_type ← <var>.actual_type (규칙 1)
3.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
expected_type 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
<var>[3] 
actual_type 
actual_type 
A = A + B 
3. <var>[2].actual_type ← look-up(A) (규칙 4)
3.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
expected_type 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
<var>[3] 
actual_type 
actual_type 
A = A + B 
4. <var>[3].actual_type ← look-up(B) (규칙 4) 
actual_type
3.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
expected_type 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
actual_type 
<var>[3] 
actual_type 
actual_type 
A = A + B 
5. <expr>.expected_type ← real (규칙 2) 
actual_type
3.속성 문법 
속성 값 계산 
이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 
보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. 
<assign> 
<expr> 
expected_type 
<var>[2] 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
actual_type 
<var>[3] 
actual_type 
actual_type 
A = A + B 
actual_type 
6. <expr>.expected_type == <expr>.actual_type → true (규칙 2)
3.속성 문법 
속성 값 계산 
<assign> 
<expr> 
<var>[2] 
최종 결과 
<var> 
※ 심볼 테이블에서 
변수 A의 타입은 real, 
변수 B의 타입은 int 
이다. 
expected_type=real 
actual_type=real 
<var>[3] 
actual_type 
=real 
actual_type 
=real 
A = A + B 
actual_type 
=int

More Related Content

What's hot

Résumer sur les fichier et les enregistrement
Résumer sur les fichier et les enregistrementRésumer sur les fichier et les enregistrement
Résumer sur les fichier et les enregistrementborhen boukthir
 
01. introduction to C++
01. introduction to C++01. introduction to C++
01. introduction to C++Haresh Jaiswal
 
Stack and its applications
Stack and its applicationsStack and its applications
Stack and its applicationsAhsan Mansiv
 
A2 Computing Reverse Polish Notation Part 2
A2 Computing   Reverse Polish Notation Part 2A2 Computing   Reverse Polish Notation Part 2
A2 Computing Reverse Polish Notation Part 2pstevens1963
 
Domain Modeling Made Functional (KanDDDinsky 2019)
Domain Modeling Made Functional (KanDDDinsky 2019)Domain Modeling Made Functional (KanDDDinsky 2019)
Domain Modeling Made Functional (KanDDDinsky 2019)Scott Wlaschin
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingMuthu Vinayagam
 
Projet de programmation la conversion entre les bases
Projet de programmation   la conversion entre les bases Projet de programmation   la conversion entre les bases
Projet de programmation la conversion entre les bases Tunisie collège
 
Fondamentaux du Référencement naturel
Fondamentaux du Référencement naturelFondamentaux du Référencement naturel
Fondamentaux du Référencement naturelAbdoulaye Dieng
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaAziz Darouichi
 

What's hot (10)

Résumer sur les fichier et les enregistrement
Résumer sur les fichier et les enregistrementRésumer sur les fichier et les enregistrement
Résumer sur les fichier et les enregistrement
 
01. introduction to C++
01. introduction to C++01. introduction to C++
01. introduction to C++
 
Stack and its applications
Stack and its applicationsStack and its applications
Stack and its applications
 
Python : Dictionaries
Python : DictionariesPython : Dictionaries
Python : Dictionaries
 
A2 Computing Reverse Polish Notation Part 2
A2 Computing   Reverse Polish Notation Part 2A2 Computing   Reverse Polish Notation Part 2
A2 Computing Reverse Polish Notation Part 2
 
Domain Modeling Made Functional (KanDDDinsky 2019)
Domain Modeling Made Functional (KanDDDinsky 2019)Domain Modeling Made Functional (KanDDDinsky 2019)
Domain Modeling Made Functional (KanDDDinsky 2019)
 
GE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python ProgrammingGE8151 Problem Solving and Python Programming
GE8151 Problem Solving and Python Programming
 
Projet de programmation la conversion entre les bases
Projet de programmation   la conversion entre les bases Projet de programmation   la conversion entre les bases
Projet de programmation la conversion entre les bases
 
Fondamentaux du Référencement naturel
Fondamentaux du Référencement naturelFondamentaux du Référencement naturel
Fondamentaux du Référencement naturel
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 

Viewers also liked

Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Nam Hyeonuk
 
55 New Features in JDK 9
55 New Features in JDK 955 New Features in JDK 9
55 New Features in JDK 9Simon Ritter
 
동아시아 문자 처리
동아시아 문자 처리동아시아 문자 처리
동아시아 문자 처리DaeHyun Sung
 
Dive into OpenSource
Dive into OpenSourceDive into OpenSource
Dive into OpenSourceHyun-woo Park
 
Move semantics
Move semanticsMove semantics
Move semanticsQooJuice
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016Taehoon Kim
 
제2과 문법과 문법 지식
제2과 문법과 문법 지식제2과 문법과 문법 지식
제2과 문법과 문법 지식Altai2013
 
BoB Information Security Conference
BoB Information Security Conference BoB Information Security Conference
BoB Information Security Conference 남준 김
 
다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...
다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...
다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...Joseph Yonggoo Yeo
 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, mapNam Hyeonuk
 
C++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAPC++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAPJae Woo Woo
 
Samsung-OSS-Conference-20140916
Samsung-OSS-Conference-20140916Samsung-OSS-Conference-20140916
Samsung-OSS-Conference-20140916Minsuk Lee
 
게임 스타트업 시작하기
게임 스타트업 시작하기게임 스타트업 시작하기
게임 스타트업 시작하기기룡 남
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기Jaehwa Park
 

Viewers also liked (20)

Semantic web
Semantic webSemantic web
Semantic web
 
Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드Next 게임 실전 프로젝트 슬라이드
Next 게임 실전 프로젝트 슬라이드
 
55 New Features in JDK 9
55 New Features in JDK 955 New Features in JDK 9
55 New Features in JDK 9
 
동아시아 문자 처리
동아시아 문자 처리동아시아 문자 처리
동아시아 문자 처리
 
Dive into OpenSource
Dive into OpenSourceDive into OpenSource
Dive into OpenSource
 
Dynamic Semantics
Dynamic SemanticsDynamic Semantics
Dynamic Semantics
 
Move semantics
Move semanticsMove semantics
Move semantics
 
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
딥러닝과 강화 학습으로 나보다 잘하는 쿠키런 AI 구현하기 DEVIEW 2016
 
제2과 문법과 문법 지식
제2과 문법과 문법 지식제2과 문법과 문법 지식
제2과 문법과 문법 지식
 
BoB Information Security Conference
BoB Information Security Conference BoB Information Security Conference
BoB Information Security Conference
 
다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...
다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...
다른 회사는 어떻게 QA, 테스팅을 하고 있을까? (google, facebook, atlass...
 
Stl vector, list, map
Stl vector, list, mapStl vector, list, map
Stl vector, list, map
 
C++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAPC++ VECTOR, LIST, MAP
C++ VECTOR, LIST, MAP
 
Database
DatabaseDatabase
Database
 
Multi thread
Multi threadMulti thread
Multi thread
 
Samsung-OSS-Conference-20140916
Samsung-OSS-Conference-20140916Samsung-OSS-Conference-20140916
Samsung-OSS-Conference-20140916
 
게임 스타트업 시작하기
게임 스타트업 시작하기게임 스타트업 시작하기
게임 스타트업 시작하기
 
오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기오픈스택: 구석구석 파헤쳐보기
오픈스택: 구석구석 파헤쳐보기
 
React
React React
React
 
sungmin slide
sungmin slidesungmin slide
sungmin slide
 

More from Nam Hyeonuk

Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15Nam Hyeonuk
 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14Nam Hyeonuk
 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13Nam Hyeonuk
 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12Nam Hyeonuk
 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11Nam Hyeonuk
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10Nam Hyeonuk
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object poolingNam Hyeonuk
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해Nam Hyeonuk
 

More from Nam Hyeonuk (20)

Haskell study 15
Haskell study 15Haskell study 15
Haskell study 15
 
Haskell study 14
Haskell study 14Haskell study 14
Haskell study 14
 
Haskell study 13
Haskell study 13Haskell study 13
Haskell study 13
 
Haskell study 12
Haskell study 12Haskell study 12
Haskell study 12
 
Haskell study 11
Haskell study 11Haskell study 11
Haskell study 11
 
Haskell study 10
Haskell study 10Haskell study 10
Haskell study 10
 
Haskell study 9
Haskell study 9Haskell study 9
Haskell study 9
 
Haskell study 8
Haskell study 8Haskell study 8
Haskell study 8
 
Haskell study 7
Haskell study 7Haskell study 7
Haskell study 7
 
Haskell study 6
Haskell study 6Haskell study 6
Haskell study 6
 
Haskell study 5
Haskell study 5Haskell study 5
Haskell study 5
 
Haskell study 4
Haskell study 4Haskell study 4
Haskell study 4
 
Haskell study 3
Haskell study 3Haskell study 3
Haskell study 3
 
Haskell study 2
Haskell study 2Haskell study 2
Haskell study 2
 
Haskell study 1
Haskell study 1Haskell study 1
Haskell study 1
 
Haskell study 0
Haskell study 0Haskell study 0
Haskell study 0
 
Memory & object pooling
Memory & object poolingMemory & object pooling
Memory & object pooling
 
Exception&log
Exception&logException&log
Exception&log
 
Iocp advanced
Iocp advancedIocp advanced
Iocp advanced
 
Iocp 기본 구조 이해
Iocp 기본 구조 이해Iocp 기본 구조 이해
Iocp 기본 구조 이해
 

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

  • 1. 구문과 의미론 syntax & semantics NHN NEXT 남현욱
  • 3. 1.기본 개념 while (if_statement) { statement; }
  • 4. 1.기본 개념 구문(syntax) : 표현식, 문장, 프로그램 단위에 대 한 형식. 즉, 반복문을 의미하기 위해 작성해야하 는 구문 (while) 과 같은 문법. while (if_statement) { statement; }
  • 5. 구문(syntax) : 표현식, 문장, 프로그램 단위에 대 한 형식. 즉, 반복문을 의미하기 위해 작성해야하 는 구문 (while) 과 같은 문법. while (if_statement) { statement; } 의미론(semantics) : 표현식, 문장, 프로그램 단 위에 대한 의미. while 구문이 실제로 어떤 의미를 지니고 있는가와 같이 구문에서 파악되는 의미. 1.기본 개념
  • 6. 1.기본 개념 언어 알파벳(alphabet)으로 구성된 문자열들의 집합 문장 해당 언어에 속한 문자열. 구문 규칙 언어의 알파벳으로부터 만들어진 문자열들이 그 언어에 속하는지 여부를 나타낸 것.
  • 7. 1.기본 개념 어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위. 어휘항목의 예) 식별자(identifier): 변수, 클래스 등의 이름 연산자(operator): +,-,*,/, ... 수치 리터럴(numeric literal): 1,3, -6.5, ... 특수어(special word): int, float, ...
  • 8. 1.기본 개념 어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위. 어휘항목의 예) 식별자(identifier): 변수, 클래스 등의 이름 연산자(operator): +,-,*,/, ... 수치 리터럴(numeric literal): 1,3, -6.5, ... 특수어(special word): int, float, ... 토큰(token) : 어휘항목들에 대한 분류
  • 9. 1.기본 개념 어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위. index = 2 *count + 17; 이 문장은 어떤 어휘항목들로 구성되어 있을까?
  • 10. 1.기본 개념 어휘항목(lexeme) 프로그래밍 언어에서 문자열을 구성하는 작은 수준의 단위. int_literal identifier int_literal index = 2 *count + 17; 이 문장은 어떤 어휘항목들로 구성되어 있을까? identifier equal_sign mult_op plus_op semicolon
  • 11. 2. 구문 기술의 형식적 방법
  • 12. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 프로그래밍을 위한 메타언어(metalanguage - 다른 언어를 기술하는 데 사용되는 언어) 예제)대입문 형식에 대한 정의 <assign> → <var> = <expression>
  • 13. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 프로그래밍을 위한 메타언어(metalanguage - 다른 언어를 기술하는 데 사용되는 언어) 예제)대입문 형식에 대한 정의 <assign> → <var> = <expression> LHS(left-hand side). 정의하고자 하 는 구문. <> 기호는 해당 구문 구조에 대 한 추상화를 의미한다. 이런 추상화를 논터미널 기호(nonterminal symbol) 라고 부른다.
  • 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) 라고 한다.
  • 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>
  • 16. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 리스트에 대한 명세 BNF는 리스트(배열, 집합 등)를 표현하기 위해 재귀를 사용한다. <ident_list> → identifier | identifier, <ident_list> <ident_list> 는 하나의 identifier 토큰으로 구성되거나 identifier 다음에 콤 마와 또다른 <ident_list>가 오는 것으로 정의.
  • 17. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 문법과 유도 문법은 언어를 정의하기 위한 장치이며, 언어의 문장들은 시작 기호 (start symbol)라 불리는 문법의 특정 논터미널부터 시작되는 일련 의 규칙 적용을 통해 생성된다. 이를 유도(derivation)라고 한다.
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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
  • 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)라 한다. 그러나 유 도 순서는 생성되는 언어에 영향을 끼치지 않 는다.
  • 31. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 파스트리(parse tree) BNF의 유도과정을 이해하기 쉽게 트리 형태로 나타낸 것. 중간 노드 는 논터미널 기호를 나타내고 잎 노드는 터미널 기호를 나타낸다.
  • 32. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 파스트리(parse tree) 예제) 파스 트리 예시 문법 <assign> → <id> = <expr> <id> → A | B | C <expr> → <id> + <expr> | <id> * <expr> | ( <expr> ) | <id> 파스 트리 <assign> 유도된 문장 : <assign>
  • 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>
  • 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>
  • 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> )
  • 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> )
  • 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> )
  • 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 )
  • 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> 파스트리 예제 문법을 조금 바 꾸면 모호한 문 법이 된다.
  • 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> B <id> <id> A C A <assign> <id> = <expr> <expr> * <expr> A <expr> + <expr> <id> B <id> C <id> A
  • 41. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 연산자 우선순위 더 높은 순위의 연산자가 파스 트리에서 더 낮은 위치(잎 노드에 가 까운 위치)에 존재한다는 규칙을 통해 연산자의 우선순위를 나타낼 수 있다. 따라서, 모호한 문법은 파스 트리끼리 연산자 순위에 모순이 생길 수 있으므로 연산자의 우선순위를 효과적으로 표현할 수 없다.
  • 42. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 연산자 우선순위 모호하지 않은 문법 <assign> → <id> = <expr> <id> → A | B | C <expr> → <expr> + <term> | <term> <term> → <term> * <factor> | <factor> <factor> → ( <expr> ) | <id> 이 문법은 앞의 두 문법과 동일한 언어를 생성하 지만 모호하지 않으며 덧셈과 곱셈에 대해 우선 순위를 표현한다. ※서로 다른 우선 순위를 가진 연산자의 피연산 자에 대해 다른 추상화를 사용함으로써 해결.
  • 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>
  • 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>
  • 45. 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> A <expr> + <term> 유도된 문장 : A = <expr> + <term>
  • 46. 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> A <expr> + <term> <term> <term> * <factor> 유도된 문장 : A = <term> + <term> * <factor>
  • 47. 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> A <expr> + <term> <term> <factor> 유도된 문장 : A = <factor> + <factor> * <id> <term> * <factor> <factor> <id>
  • 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>
  • 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
  • 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>
  • 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> 이 규칙이 추가되면 언어가 모호해진다
  • 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와 연결되어야 할 지 모호하기 때문
  • 53. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) if-then-else를 위한 모호하지 않은 문법 해결책) 일반적으로 else는 가장 가까운 짝이 없는(unmatched) if와 연결된다. 따라서 문장을 두 종류로 구분하여 정의하고, else가 가장 가까운 짝이 없 는 if와 연결될 수 있게 구문을 정의함으로써 문제를 해결한다.
  • 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>
  • 55. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 확장 BNF(Extended BNF,EBNF) BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다.
  • 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>]
  • 57. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 확장 BNF(Extended BNF,EBNF) BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다. 확장 2. 반복 표기 BNF <ident_list> → <identifier> | <identifier> , <ident_list> 중괄호 안의 내용은 반복적임(몇 번이든 반복될 수 있음)을 의미한다. EBNF <ident_list> → <identifier> {, <identifier>}
  • 58. 2.구문기술의 형식적 방법 Backus-Naur 형식(BNF) 확장 BNF(Extended BNF,EBNF) BNF 문법의 작성과 해석의 편의를 위해 확장된 사항을 포함하는 메타 언어이다. 확장 3. 다중 선택 표기 BNF <term> → <term> * <factor> | <term> / <factor> | <term> % <factor> 소괄호 안의 내용 중 하나가 선택되어 들어 가야함을 의미한다. EBNF <term> → <term> (* | / | %) <factor>
  • 60. 3.속성 문법 정적 의미론 BNF의 한계 BNF로는 기술하기 어렵거나 기술 자체가 불가능한 프로그래밍 구문 구조들이 있다. 1. 타입 호환성 Java에서 부동 소수점 값은 정수 형의 변수에 대입이 불가능하나 그 반대는 가능하다. 이런 규칙은 BNF로 기술하기 매우 어렵다. 2. 선언 변수가 참조되기 전에 먼저 선언되어야한다는 규칙은 BNF를 이용해 서는 기술할 수 없다.
  • 61. 3.속성 문법 정적 의미론 • 정적 의미론은 프로그램의 의미와 간접적으로 연관 되며, 주로 타입의 제한 사항을 기술한다. • 이러한 검사는 컴파일 시간에 수행될 수 있기 때문에 정적 의미론이라는 이름이 붙었다. • 정적 의미론(static semantics)은 BNF로는 기술하 는 것에 한계가 있다.
  • 62. 3.속성 문법 기본 개념 속성 문법(attribute grammer)은 정적 의미론과 프로그램 구문 모두 를 기술하기 위해 설계된 문법이다. 속성(attribute) 문법 기호(터미널과 논터미널 기호)와 연관되며, 값을 배정할 수 있다. 속성 계산 함수(attribute computation function) 문법 규칙과 연관되며, 속성 값이 어떻게 계산되는지 나타내는데 쓰인다. 술어 함수(predicate function) 문법 규칙과 연관되며, 언어의 구문과 정적 의미론 규칙을 서술한다.
  • 63. 3.속성 문법 정의 속성 문법(attribute grammer)은 다음의 부가 특징들을 갖는 문법이다. 1. 각 문법 기호들에 속성들의 집합 A(X)가 연관된다. 2. 각 문법 규칙에 의미 함수들의 집합과 그 문법 규칙에 속한 기호들의 속성들에 대한 술어 함수들의 집합이 연관 된다. 3. 술어 함수는 속성 집합 {A(X0), ... , A(Xn)}과 리터럴 속성들의 집합의 합집합에 대한 불리안 식 형식을 갖는다.
  • 64. 3.속성 문법 ??? 무슨 소리인지 전혀 모르겠다
  • 65. 3.속성 문법 하나씩 하나씩 천천히 살펴보자
  • 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>과 연관된 상속 속 성이다. 대입문에서 좌측에 위치한 변수의 타입에 의 해 결정되며, 식에 대해 예상되는 연산결과 타입을 저 장하는데 사용된다.
  • 67. 3.속성 문법 정의 2. 각 문법 규칙에 의미 함수들의 집합과 그 문법 규칙에 속한 기호들의 속성들에 대한 술어 함수들의 집합이 연관 된다. 3. 술어 함수는 속성 집합 {A(X0), ... , A(Xn)}과 리터럴 속성들의 집합의 합집합에 대한 불리안 식 형식을 갖는다. 이 두 가지는 앞에서 이야기한 속성을 실제 파스 트리에서 전체 노드에 적용시키기 위한 요소들이 다. 각 구문에서 그 구문의 속성이 어떤 식으로 배정되는지 연관된 의미 함수와 술어 함수를 통해 계산한다.
  • 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)
  • 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>의 expected_type 속성이 <var>.actual_type 값으로 할당됨을 의미한다. 술어 함수 : <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)
  • 70. 3.속성 문법 예제) 대입문에 대한 속성문법 구문 규칙 : <assign> → <var> = <expr> 의미론 규칙 : <expr>.expected_type ← <var>.actual_type 구문 규칙 : <expr> → <var>[1] + <var>[2] 의미론 규칙 : <expr>.actual_type ← [1], [2]의 표기는 같은 논터미널이 한 구문 규칙 에서 두 번 이상 나타날 때 둘을 구분하기 위한 요소이다.( 실제 구문 규 칙의 일부가 아니다. ) 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)
  • 71. 3.속성 문법 예제) expr의 actual_type 속성이 아래의 조건에 따라 결정됨을 의미한다. 여기 서는 두 변수(<var>)의 actual_type 속성이 모두 int이면 int, 아니면 real 인 것으로 규정되어 있다. 대입문에 대한 속성문법 구문 규칙 : <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)
  • 72. 3.속성 문법 예제) 대입문에 대한 속성문법 구문 규칙 : <assign> → <var> = <expr> 의미론 규칙 : <expr>.expected_type ← <var>.actual_type 술어함수는 불리안 값을 가지며, 해당 구문 규칙에서 속성이 어떤 값을 갖고 있어야 하는가를 규정한다. 속 성 문법의 유도 과정에서 술어 함수가 false 값이 나온 다면 해당 유도 과정이 잘못되었음을 뜻한다. 여기서 술어 함수는 이 구문 규칙에서 expr의 actual_type 속성과 expected_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)
  • 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)
  • 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 look-up 함수는 주어진 변수 이름을 심볼 테이블 로부터 찾고, 그 변수의 타입을 반환한다. 이 때 이 구문 구조에서 변수( <var> ) 의 타입은 파스 트리 외부로부터 결정되는데, 이런 식으로 외부로부터 값이 결정되는 파스 트리의 잎 노드의 합성 속성을 내장 속성(Intrinsic attribute)이라고 하고, 그 내용을 저장해 둔 곳을 심볼 테이블이라고 한다. 술어 함수 : <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)
  • 75. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. <var>[3] A = A + B
  • 76. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. <var>[3] actual_type A = A + B 1. var.actual_type ← look-up(A) (규칙4)
  • 77. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> expected_type <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. <var>[3] actual_type A = A + B 2. <expr>.expected_type ← <var>.actual_type (규칙 1)
  • 78. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> expected_type <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. <var>[3] actual_type actual_type A = A + B 3. <var>[2].actual_type ← look-up(A) (규칙 4)
  • 79. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> expected_type <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. <var>[3] actual_type actual_type A = A + B 4. <var>[3].actual_type ← look-up(B) (규칙 4) actual_type
  • 80. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> expected_type <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. actual_type <var>[3] actual_type actual_type A = A + B 5. <expr>.expected_type ← real (규칙 2) actual_type
  • 81. 3.속성 문법 속성 값 계산 이제 살펴본 예제를 바탕으로 파스 트리의 속성 값을 계산하는 방법을 알아 보자. 이 과정을 파스 트리를 장식한다(decorate)라고 부른다. <assign> <expr> expected_type <var>[2] <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. actual_type <var>[3] actual_type actual_type A = A + B actual_type 6. <expr>.expected_type == <expr>.actual_type → true (규칙 2)
  • 82. 3.속성 문법 속성 값 계산 <assign> <expr> <var>[2] 최종 결과 <var> ※ 심볼 테이블에서 변수 A의 타입은 real, 변수 B의 타입은 int 이다. expected_type=real actual_type=real <var>[3] actual_type =real actual_type =real A = A + B actual_type =int