Successfully reported this slideshow.
Your SlideShare is downloading. ×

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

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Loading in …3
×

Check these out next

1 of 82 Ad

More Related Content

Slideshows for you (20)

Viewers also liked (20)

Advertisement

Recently uploaded (20)

Advertisement

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

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

×