제3장 시맨틱스(Semantics) Reading Chap 13 © 숙대 창병모.

Slides:



Advertisements
Similar presentations
National University 1 / 24 컴퓨터 개론 및 실습 강의 11 (parser)
Advertisements

Ⅰ. 연산자 Ⅱ. 제어 구조. 연산자 : 할당 연산자 - 사용자가 정의한 변수에 임의의 값을 저장하는 기능 strvar = strVar1+ “ Hello ”
제 5 장 구문 정의  프로그래밍 언어의 기본 문자 집합  Alphabet 문자 (A-Z) 26 개 + 아라비아 숫자 (0 - 9) 10 개  예 ) Fortran : 기본 문자 집합 + 13 개의 특수문자 (=+ - * / ( ),. $ ‘ : 공백 ) Algol60.
4장 배열과 함수 한빛미디어(주).
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
YACC 응용 예 Desktop Calculator.
1. 컴파일러 개론 1-1. Compiler 정의 1-2. Language Processing System
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
C 5장. 제어문 #include <stdio.h> int main(void) { int num;
제2장 구문(Syntax) Reading Chap 4 © 숙대 창병모.
4장 구문(Syntax).
Chapter 7. 조건문.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
10장 예외 Lab 10-1.
문법과 언어.
프로그래밍언어론 2nd edition Tucker and Noonan
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
4장 어휘 / 구문 분석 (Term project 포함)
제4장 블록 및 유효범위 Reading Chap. 5 © 숙대 창병모.
3장 (2) 구문과 의미론 순천향대학교 컴퓨터공학과 하상호.
10장 함수.
제5장 기초 의미론 (Basic Semantics)
제3장 스택과 큐.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
고급 선택 제어문과 반복문 Chapter 9 C에서의 다중 선택 제어문 선 검사 반복 구조와 for 문
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
5.1 데이터 타입 개요 5.2 사례 연구 5.3 타입 검사 Reading Chap 6
Part 07 제어 구조 ©우균, 창병모 © 우균, 창병모.
Tail-recursive Function, High-order Function
7.1 함수 정의 7.2 매개변수 전달 7.3 함수 구현 7.4 인터프리터에서 함수 구현 Reading Chap 8
순서도.
1.4 중첩된 한정기호 (Nested Quantifiers) 이산수학 (Discrete Mathematics)
MATLAB
Method & library.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
인터넷응용프로그래밍 JavaScript(Intro).
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
에어 조건문.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
프로그래밍언어론 2nd edition Tucker and Noonan
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
Choi Seong Yun 컴퓨터 프로그래밍 기초 #06 : 반복문 Choi Seong Yun
자바 5.0 프로그래밍.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
17장. 제어문과 내장 함수 제어문 내장 함수 제어문 내장 함수.
6.4 타입 검사 (Type Checking).
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
Fucntion 요약.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
Homework #12 (1/2) 프로그램을 작성하고, 프로그램과 실행 결과를 프린트하여 제출한다.
Flow Diagram IV While.
7주차: Functions and Arrays
7장. 다양한 형태의 반복문. 7장. 다양한 형태의 반복문 7-1 반복문이란? 반복문의 기능 세 가지 형태의 반복문 특정 영역을 특정 조건이 만족하는 동안에 반복 실행하기 위한 문장 7-1 반복문이란? 반복문의 기능 특정 영역을 특정 조건이 만족하는 동안에 반복.
Homework #8 (실습 #7) [1/2] 다음을 수행하는 PHP 프로그램을 작성하여 프로그램과 결과물을 프린트하여 제출한다. sin(45º), cos(45º), tan(45º)를 출력하는 프로그램을 작성하시오. 피보나치 수를 구하는 함수 fib($n)을 작성하고,
TVM ver 최종보고서
3.2 분기 명령어.
제 22 강 논리식 및 논리 값 shcho.pe.kr.
이산수학(Discrete Mathematics)  술어와 한정기호 (Predicates and Quantifiers)
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
 6장. SQL 쿼리.
6 객체.
PHP 기초문법 PHP를 공부하는데 있어 가장 기초가 되는 PHP기초문법에 대해서 배워 봅니다.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

제3장 시맨틱스(Semantics) Reading Chap 13 © 숙대 창병모

시맨틱스의 필요성 프로그램 의미의 정확한 이해 소프트웨어의 정확한 명세 소프트웨어 시스템에 대한 검증 혹은 추론 컴파일러 혹은 해석기 작성의 기초 © 숙대 창병모

3.1 Operational Semantics © 숙대 창병모

의미론의 종류 Operational Semantics Denotational Semantics 프로그램의 동작 과정을 정의 Denotational Semantics 프로그램의 의미를 함수 형태로 정의 Axiomatic Semantics 프로그램의 시작 상태와 종료 상태를 논리적 선언(assertion) 형태로 정의 © 숙대 창병모

동작 시맨틱스(Operational Semantics) 기본 아이디어 프로그램의 의미를 상태 전이(실행) 과정으로 설명한다. 각 문장 S마다 상태 전이 규칙 정의 예제 read x; y = 1; while (x != 1) do (y = y*x; x = x-1) x 값을 읽는다. { x ↦ n } if READ n y에 1 배정 { x ↦ n, y ↦ 1 } x 값이 1이 아닌지 검사 거짓이면 종료 참이면 y 값을 x 값과 현재 y 값의 곱으로 변경 { x ↦ n, y ↦1*n } x 값 1 감소 { x ↦ n-1, y ↦ n } 3 번부터 반복 © 숙대 창병모

언어 S 정수 변수 식 Stmt S  x = E | S; S n  Int | if E then S | if E then S else S | while E do S | read x | print E Expr E  n | x | true | false | E + E | E – E | E * E | E / E | E == E | E < E | E > E | !E Prgm P  S 정수 n  Int 변수 x  Var 식 E  Exp © 숙대 창병모

기초 지식 합집합 곱집합 함수집합 함수 f ∈A → B 함수 수정 f[a ↦b] A + B = { a | a ∈ A ∨ a ∈ B} 곱집합 A x B = {(a,b)| a ∈A ∧ b∈B} 함수집합 A → B = {f | f : A → B} 함수 f ∈A → B {a1↦b1, a2↦b2, …, an↦bn} 함수 수정 f[a ↦b] f[a ↦ b](x) = { b if x = a f(x) otherwise © 숙대 창병모

변수 및 상태 [23 + 5] vs [x + y] [x + y]의 의미는 ? 변수 x, y의 현재 값에 따라 다르다. 변수들의 현재 값을 무엇이라고 할까요? 상태(State) also called Environment © 숙대 창병모

상태(State) 상태(A state) 변수들의 현재 값 하나의 함수로 생각할 수 있다. s  Var  Int 모든 상태들의 집합 State = Var  Int 상태 s에서 변수 값 s(x) 상태 갱신: s’ = s[y ↦ v] s’ (x) = { s(x) if x != y v if x = y © 숙대 창병모

수식의 의미 수식 E의 의미 상태 s에서 수식 E의 의미 상태 s에서 수식 E의 값 [E]s s = {x ↦1, y ↦ 3} [x+y]s = 4 상태 s에서 수식 E의 의미 [true]s = T [false]s = F [n]s = n [x]s = s(x) [E1 + E2]s = [E1]s + [E2]s [E1 == E2]s = T if [E1]s == [E2]s F otherwise … © 숙대 창병모

문장의 의미 문장 S의 의미 문장 S가 상태 s를 s’으로 변경시킨다. 상태 전이(state transition)라고 한다. (s, S)  s’ where s is the initial state S is a statement s’ is the final state 동작 시맨틱스 각 문장 S마다 상태 전이 규칙 정의 프로그램의 의미를 상태 전이 과정으로 설명한다. s S s’ © 숙대 창병모

추론 규칙 추론 규칙 p -> q p q 조상 추론 규칙 X parent Y X parent Y ∧ Y ancestor Z X ancestor Y X ancestor Z a parent b b parent c © 숙대 창병모

전이 규칙(Transition Rule) assignment (s, id = E)  s[id ↦ [E]s] sequence (s, S1)  s’, (s’, S2)  s” (s, S1; S2)  s” s S1 s’ S2 s” © 숙대 창병모

전이 규칙(Transition Rule) if-then-else (s, S1)  s’ (s, if E then S1 else S2)  s’ (s, S2)  s’ if [E]s = T if [E]s = F s E F T S1 S2 s’ s’ © 숙대 창병모 14

예1 x = 1; y = 2; if x > y then max =x; else max =y; s0 = { } (s0, x = 1)  s1 s1 = {x ↦ 1} (s1, y = 2)  s2 s2 = {x ↦ 1, y ↦ 2} (s2, if x >y …)  s3 [x>y] s2= F (s2, max=y)  s3 s3 = {x ↦ 1, y ↦ 2, max ↦ 2} © 숙대 창병모

전이 규칙 while (s, S)  s’, (s’, while E do S)  s” if [E]s = T if [E]s = F s” s s’ S S . . . S © 숙대 창병모

전이 규칙 read print READ n (s, read id)  s[id ↦ n] PRINT [E]s (s, print E)  s © 숙대 창병모 17

예2 read x; y = 1; while (x != 1) do (y = y*x; x = x-1) s0 = { } (s0, read x)  s1 s1 = {x ↦ 3} (s1, y = 1)  s2 s2 = {x ↦ 3, y ↦ 1} (s2, while …)  s” [x != 1]s2= T (s2, y =x*y; x = x-1)  s3 s3 = {x ↦ 2, y ↦ 3} (s3, while …)  s” [x != 1]s3= T (s3, y =x*y; x = x-1)  s4 s4 = {x ↦ 1, y ↦ 6} (s4, while …)  s” [x !=1]s4 = F s” = s4 © 숙대 창병모

지금까지 한 것/앞으로 할 것! Topic Logic Implementation ------------------------------------------------ Syntax Grammar Parser Semantics Semantics rules Interpreter Type Typing rules Type checker © 숙대 창병모

3.2 Other Semantics © 숙대 창병모

Axiomatic Semantics read x; y = 1; while (x != 1) do (y = x*y; x = x-1) If x = n holds before the program is executed then y = n! will hold when the execution terminates. Properties of programs are specified as assertions { P } S { Q } where S is a statement P is the precondition and Q is the postcondition © 숙대 창병모

Pre- and post conditions 예제 read x; { x=n } y =1; { x=n and y=1} while (x !=1) do (y =x *y; x = x-1) { x=1 and y=n! } © 숙대 창병모

Denotational Semantics Describe meaning of programs by mathematical Function from states to states for each statement Operational semantics (s, S)  s’ for each statement S Denotational semantics s’ = f(s, S) for each statement S © 숙대 창병모

Denotational Semantics read x; y = 1; while (x != 1) do (y = y*x; x = x-1) The program’s computation is a function from states to states: The final state will be equal to the initial state except that the value of x = 1 and the value of y = the factorial of the value of x in the initial state. © 숙대 창병모

3.3 Interpreter for Lang. S © 숙대 창병모

언어 S의 인터프리터 언어 S의 인터프리터 구현 구성 요소 동작 시맨틱스(Operational Semantics)에 따라 구현 Recursive Descent Parsing 방식을 확장해서 구현 구성 요소 어휘 분석(lexical analyzer) 심볼 테이블(Symbol table) 변수들의 상태(state) 파서(parser) 각 식, 문장에 대한 해석(실행) 함수 © 숙대 창병모

언어 S in EBNF Stmt S  id = E | (S {; S}) | if E then S end | if E then S else S | while E do S | read id | print E Expr E  true | false | AE | AE == AE | AE != AE | AE < AE | AE > AE | !E Aexpr AE  T {+T | -T} Term T  F {*F | /F} Factor F  n | id | (AE) Prgm P  S © 숙대 창병모

언어 S 인터프리터 기본원리 어휘분석 심볼 테이블(Symbol table) 파서(parser) 메모리에서 S 프로그램을 Recursive Descent Parsing 스타일로 한 문장씩 읽은 후 해석하여 실행한다. 어휘분석 getToken( ) 메모리에서 S 프로그램을 읽어서 토큰들로 분리해서 리턴 Chapter 2 of Aho, Sethi, and Ullman, Compilers: Dragon Book 심볼 테이블(Symbol table) 심볼 테이블에 상태(변수들의 값)을 저장한다. 파서(parser) Recursive Descent Parsing 스타일로 읽으면서 각 식, 문장에 대한 해석(실행) 함수 수행 © 숙대 창병모

S 인터프리터 전체 구성 M[ ] lex.c int.c symtable[ ] init() getToken() factor() { … token = getToken() …} term() { } expr() { } stmt() { } parse() { } © 숙대 창병모

자료 구조 M[] symtable[] 입력 S 프로그램 저장을 위한 배열 M[] pc M[]의 인덱스 변수 이름과 그 값을 저장하기 위한 자료구조 스택 형태로 구현 © 숙대 창병모

어휘 분석 getToken() 토큰의 종류 M[]에 저장된 S 프로그램을 읽어서 호출될 때마다 하나의 토큰을 반환한다. 키워드, 수, 변수 이름, 기타 문자 처리하도록 확장 토큰의 종류 keyword: if return IF; … keyword: print return PRINT number return NUM; tokenval = val of the number identifier return ID; tokenval = i such that symtable[i] contains the name other char c return c; tokenval = NONE © 숙대 창병모

심볼 테이블 심볼 테이블(Symbol Table) 코드 식별자(변수 이름)과 그 값을 저장하기 위한 자료구조 변수 이름, 토큰 번호, 값 저장 코드 struct entry { char *lexptr; int token; int val; } struct entry symtable[ ] int lookup(char[] s) return position of entry for s int push(char[] s, int tok) push s and return top position © 숙대 창병모

심볼 테이블 symtable[] ( x = 1; y = 2; if x > y then max =x else max =y ) symtable[] token val lexptr 2 lastentry ID ID 2 ID 1 … lastchar lexemes[] x \0 y \0 max \0 © 숙대 창병모

파서/해석기 expr( ) stmt( ) parse( ) 파서/해석기 식을 읽고 식의 값을 계산해서 리턴한다. Recursive Descent Parsing 수행 각 식, 문장에 대한 하나의 해석(실행) 함수 포함 expr( ) 식을 읽고 식의 값을 계산해서 리턴한다. stmt( ) 문장을 읽고 문장에 따라 해석하여 실행한다. Stmt S  id = E | (S {; S}) | if E then S end | if E then S else S | while E do S | read id | print E © 숙대 창병모

수식 해석 expr() 변수를 포함한 수식 값을 계산하도록 HW#1 확장 변수 값은 symtable[]에 저장되어 있음 실행 과정 1. expr( ) E을 읽으면서 값을 계산한다. 2. term( ) 3. factor( ) 3.1 getToken()은 변수 이름 x를 만나면 symtable[]에서 해당 위치를 lookup()해서 찾아 준다. loc = tokenval; 3.2 symtable[loc].val에 저장되어 있는 값을 사용하여 계산한다. © 숙대 창병모

문장 해석기 구조 void stmt( ) { int loc, result, whilestart; switch(token) { // S  id = E case ID: loc = tokenval; // symtable[] 내의 저장 위치 match(ID); if (token == ‘=‘) { match(‘=‘); result = expr( ); symtable[loc].val = result; } break; case ‘(‘: // S  ( S {;S} ) case IF: // S  if E then S else S | if E then S end case WHILE: // S  while E do S case READ: // S  read id case PRINT: // S  print E

대입문 해석 대입문 id = E E 값을 symtable[] 내의 변수 id에 저장 실행 과정 1. getToken()은 변수 id를 읽으면 symtable[] 내의 해당 위치를 찾아 tokenval에 저장해 둔다. loc = tokenval; 2. E을 읽으면서 값을 계산한다. 3. 계산된 E 값을 symtable[loc].val에 저장한다. © 숙대 창병모

read 문 해석 read 문 read id 입력 값을 symtable[] 내의 변수 id에 저장 실행 과정 1. match(READ) getToken()은 변수 id를 읽으면 symtable[] 내의 해당 위치를 찾아 tokenval에 저장해 둔다. loc = tokenval; 2. 입력 값을 받는다. 3. 입력 값을 symtable[loc].val에 저장한다. © 숙대 창병모

print 문 해석 print 문 print E E 값을 출력한다. 실행 과정 1. match(PRINT) 2. expr() : E을 읽으면서 값을 계산한다. 3. 계산된 값을 프린트한다. © 숙대 창병모

조건문 해석 조건문 if E then S1 else S2 한 stmt 건너 뛰기 E 값에 따라 S1 혹은 S2 실행 실행 과정 1. expr(): E을 읽으면서 값을 계산한다. 2. E 값이 true 이면 S1를 읽고 실행하고 S2는 건너 뛴다. 3. E 값이 false 이면 S1를 건너 뛰고 S2를 읽어서 실행한다. 한 stmt 건너 뛰기 matchstmt() © 숙대 창병모

반복문 해석 반복문 while E do S E와 S를 반복적으로 읽으면서 해석한다. 실행 과정 whilestart = pc; 2. expr(): E을 읽으면서 값을 계산한다. 3. E 값이 true 이면 S를 읽고 실행하고 저장된 시작위치로 돌아가서 2부터 반복 pc = whilestart; token = getToken(); 4. E 값이 false 이면 S를 건너뛰고 진행한다. match(DO); matchstmt(); © 숙대 창병모

HW #2 언어 S에 대한 인터프리터 구현 global.h, lex.c, int.c 참고해서 작성 순서 getToken() 을 읽고 이해한다. expr() 을 완성한다. stmt() 을 완성한다. S  (S; S) | read id | print E | if E then S end | if E then S else S | while E do S © 숙대 창병모