Semantic Consistency in Information Exchange
Download
Report
Transcript Semantic Consistency in Information Exchange
제2장 구문(Syntax)
Reading Chap 4
© 숙대 창병모
1
2.1 프로그래밍 언어의 정의
© 숙대 창병모
2
(프로그래밍) 언어 정의
구문법(Syntax)
구성요소를 이용하여 문장/프로그램을 구성하는 방법
쓰는 방법 겉모양
의미 (Semantics)
문장/프로그램의 의미
씌어진 것의 의미 뜻
프로그래밍 언어 공부하는데 필요한 기본기
어떻게 정의해야 할까요?
© 숙대 창병모
3
QnA
가능한 문장 혹은 프로그램의 개수가 무한하지 않나요?
무한한 것들을 어떻게 유한하게 정의할 수 있나요?
© 숙대 창병모
4
귀납적 정의(Inductive Definition)
처음 들어본 사람?
홀수
1, 3, 5, 7, 9, 11, …
무한한 홀수를 유한한 방법으로 어떻게 정의할까요?
a1 = 1
an+1 = an + 2
문법(Grammar)
A1
AA+2
© 숙대 창병모
5
귀납적 증명(Inductive Proof)
처음 들어본 사람?
홀수의 합
n
Σ 2k -1 = n2
k=1
무한한 걸 어떻게 증명하지?
n = 1일 때 2*1 – 1 = 1 = 12
가정
n
Σ 2k -1 = n2
k=1
가정으로부터 다음 증명
n+1
Σ 2k -1 = (n+1)2
k=1
© 숙대 창병모
6
귀납적 정의: 이진수/십진수의 구문법
숫자(D)는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9중 하나이다.
말로 정의
숫자(D)는 수(N)이다.
수 다음에 숫자(ND)가 오면 수(N)이다.
Induction Rule 형태
D is a digit
D is a number
문법 형태
ND
N ND
© 숙대 창병모
N is a number and D is a digit
ND is a number
ND
| ND
7
이진수: Syntax vs Semantics
D 0
|1
[0] = 0
[1] = 1
ND
| ND
[D]
[ND] = [N] * 2 + [D]
101
[101] =
© 숙대 창병모
8
십진수: Syntax vs Semantics
D0
| 1
| 2
…
| 9
[0]
[1]
[2]
…
[9]
ND
| ND
[D]
[ND] = [N] * 10 + [D]
386
[386] =
© 숙대 창병모
=0
=1
=2
=9
9
수식의 구문
좀 현실적인 구문은 없나요?
수식
5, 13, 5 + 13, 5 * 13, (5 + 3), (5 + 3) * 13, …
구문법 : 쓰는 방법
E E*E
|E+E
| (E)
|N
NND|D
D0|1|2|3|4|5|6|7|8|9
© 숙대 창병모
10
수식의 의미
E E*E
|E+E
| (E)
|N
[E * E] = [E] * [E]
[E + E] = [E] + [E]
[(E)] = [E]
[N]
무엇을 수식의 의미라고 생각하세요?
23 * 5 + 12
[23 * 5 + 12] = ?
© 숙대 창병모
11
2.2 프로그래밍 언어 구현
© 숙대 창병모
12
프로그래밍 언어 구현
프로그래밍 언어 구현은 무얼 해야 하나요?
입력 프로그램 Syntax Semantics Interpret or Compile
프로그래밍 언어 구현은 어떻게 해야 하나요?
구문법에 맞춰 작성된 프로그램을 입력 받아
그 의미에 맞게 동작하도록 해석하거나
기계어 명령어들로 번역해야 한다.
© 숙대 창병모
13
(프로그래밍) 언어의 구성
어휘구조(Lexical structure)
단어의 구조, 철자법
구문법(Syntax)
구문 구조
문법을 이용해서 기술
Context-free grammar in BNF(Backus-Naur Form)
의미(Semantics)
프로그램의 의미
자연어를 이용한 기술
수학적 기술
© 숙대 창병모
operational semantics
denotational semantics
axiomatic semantics
14
인터프리터 vs 컴파일러
소스 프로그램
입력
인터프리터
출력
소스 프로그램
컴파일러
입력
© 숙대 창병모
목적 프로그램
출력
15
컴파일러 구조
Source program
Analysis phases
Synthesis phases
Target program
© 숙대 창병모
16
컴파일러 구조
Source
Program
Lexical Analyzer
(Scanner)
Syntax Analyzer
(Parser)
Semantic Analyzer
Intermediate Code
Generator
Code Optimizer
Code Generator
summary
©See
숙대 창병모
in course text, compiler books
Target
Program
17
2.3 구문 및 문법
© 숙대 창병모
18
구문(Syntax)
프로그래밍 언어의 구문구조는 어떻게 표현할 수 있을까 ?
앞에서 살펴본 수식의 구문법
E
|
|
|
N
D
© 숙대 창병모
E*E
E+E
(E)
N
ND|D
0|1|2|3|4|5|6|7|8|9
19
구문법(Syntax Grammar)
프로그래밍 언어의 구문구조
귀납적 정의(Inductive Definition)
문장 S
Id = E
if E then S else S
while E do S
…
문맥-자유 문법(CFG:Context-free grammar)
이러한 자기호출 구조를 자연스럽게 표현할 수 있다.
© 숙대 창병모
20
예제
if-then-else 문
S if E then S
| if E then S else S
| …
단순 수식
E E*E
| E+E
| (E)
| N
NND|D
D0|1|2|3|4|5|6|7|8|9
© 숙대 창병모
21
CFG
A CFG consists of:
set of terminals T
set of non-terminals N
start symbol S (one of the non-terminals)
set of production rules
X Y1 Y2 … Yn where X N and Yi T N {}
a
a
a
a
Notational convention
non-terminals are written upper-case
terminals are written lower-case
© 숙대 창병모
22
구문검사
QnA
어떤 문장 혹은 프로그램이 구문법에 맞는지는 어떻게 검사하나요?
문법으로부터 유도(derivation)해본다.
유도 가능하면 문법에 맞는 문장이고
그렇지 않으면 문법에 맞지 않는 문장이다.
그러면 유도는 어떻게 하나요?
© 숙대 창병모
23
유도(Derivation)
생성 규칙 X Y1 Y2 … Yn
X 는 Y1 Y2 … Yn 으로 대치될 수 있다. 혹은
X 는 Y1 Y2 … Yn 을 생성한다
터미널 심볼
대치할 규칙이 없으므로 일단 생성되면 끝
터미널 심볼은 그 언어의 토큰이다.
핵심 아이디어
1. 시작 심볼 S부터 시작한다.
2. 넌터미널 심볼 X를 생성규칙을 적용하여 Y1 Y2…Yn으로 대
치한다.
3. 이 과정을 넌터미널 심볼이 없을 때까지 반복한다.
© 숙대 창병모
24
유도(Derivation)
Direct derivation
X1 …Xi… Xn X1 … Xi-1Y1 Y2…Yn Xi+1 … Xn
if there is a production Xi Y1 Y2…Yn
Derivation *
X1 … Xn * Y1 … Ym
if X1 … Xn … Y1 … Ym
(0 or more direct derivations from X1 … Xn to Y1 … Ym )
© 숙대 창병모
25
유도 예제
CFG
E E*E
| E+E
| (E)
| N
NND|D
D0|1|2|3|4|5|6|7|8|9
생성할 스트링: 3 + 15
유도
EE+E N+ED+E3+E …
© 숙대 창병모
26
문법 G 언어
The language L(G) of a CFG G
문법 G에 의해서 정의되는 언어
문법 G에 의해서 유도되는 모든 스트링들의 집합
{a1 … an | S * a1 … an and every ai is a terminal}
© 숙대 창병모
27
예제
L(G) is the language of a CFG G.
Strings of balanced parentheses:
S (S)
Sa
The language is ?
© 숙대 창병모
28
2.4 파스 트리
© 숙대 창병모
29
유도 및 파스 트리
Derivation tree = Parse tree = Syntax tree
유도과정 혹은 구문구조를 보여주는 트리
유도 트리 = 파스 트리 = 구문 트리
A sequence of production applications
S……
is a derivation.
A derivation can be drawn as a tree:
S is the tree's root.
If the derivation uses production X Y1 Y2…Yn,
X has children Y1,…,Yn.
© 숙대 창병모
30
유도 예제
CFG
E E*E
| E+E
| (E)
| N
NND|D
D0|1|2|3|4|5|6|7|8|9
생성할 스트링: 3 + 4 * 5
유도
© 숙대 창병모
31
파스 트리
E
E
+
3
E
4
© 숙대 창병모
E
*
E
5
32
유도에 대한 참조(1)
A parse tree has
terminals at the leaves.
non-terminals at the interior nodes.
An inorder traversal of the leaves is the original input.
The parse tree shows association of operations;
3 + (4 * 5)
© 숙대 창병모
33
유도에 대한 참조(2)
지금까지 좌우선 유도(leftmost derivation)를
각 단계에서 가장 왼쪽 넌터미널이 대치되었음
우우선 유도(Rightmost derivation).
3+ 4*5
주의
좌우선 유도와 우우선 유도 모두 같은 파스트리를 갖는다.
차이점은 파스트리에 가지가 추가되는 순서이다.
© 숙대 창병모
34
언어를 한번 정의해보면 어떨까?
Stmt S x = E
| S; S
| 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 > E | !E
Prgm P S
© 숙대 창병모
35
요약
구문구조
문법을 이용하여 표기
CFG in BNF
유도(derivation)
좌우선 유도(Leftmost derivation)
우우선 유도(Rightmost derivation)
파스트리(parse tree)
© 숙대 창병모
36
2.4 모호성
© 숙대 창병모
37
모호성(Ambiguity)
수식을 위한 문법
E E*E
| E+E
| (E)
| N
스트링
3+4*5
이 스트링은 두 개의 파스트리를 갖는다.
E
© 숙대 창병모
E
E
+
E
3
E
*
4
E
E
E
5
3
+
*
E
4
E
5
38
모호성(2)
모호한 문법(ambiguous grammar)
어떤 스트링에 대해 두 개 이상의 좌측 (혹은 우측) 유도를 갖는다.
두 개 이상의 파스 트리를 갖는다.
모호성은 나쁘다
왜?
© 숙대 창병모
39
모호성 처리
문법 재작성
모호하지 않도록 재작성
예
EE+T|T
TT*F | F
F N | (E)
우선 순위를 적용
© 숙대 창병모
40
모호성 예: The Dangling Else
모호한 문법
S if E then S
| if E then S else S
이 문장에 대한 두 개의 파스 트리
if e1 then if e2 then s1 else s2
S
S
if
e1
if e2 s1
© 숙대 창병모
if e1 S
S
s2
if
S
e2 s1
s2
41
모호성 예 : The Dangling Else
모호하지 않는 문법
S MATCH_IF | UNMATCH_IF
MATCH_IF if E then MATCH_IF else MATCH_IF
UNMATCH_IF if E then MATCH_IF else UNMATCH_IF
| if E then S
앞의 문법과 같은 스트링을 생성한다.
주의
모호성을 다루는 일반적인 규칙은 없다.
모호하지 않는 문법으로 자동적인 변환 방법은 없다.
© 숙대 창병모
42
2.5 EBNF와 구문 다이어그램
© 숙대 창병모
43
EBNF
BNF
EE+T|T
TT*F | F
F N | (E)
NND|D
EBNF
E T {+ T}
T F {* F}
F N | (E)
N D {D}
© 숙대 창병모
44
구문 다이어그램
구문 다이어그램
각 생성규칙을 다이어그램으로 표현
넌터미널
터미널
사각형
원
화살표
순서
예제
그림 4.11
© 숙대 창병모
45
2.6 파싱 구현
© 숙대 창병모
46
지금까지 한 것/앞으로 할 것!
Topic
Logic
Implementation
-------------------------------------------- Syntax
Grammar
Parser
Semantics
Semantics rules
Interpreter
Type
Typing rules
Type checker
© 숙대 창병모
47
recursive-descent parsing
기본 원리
입력 스트링을 좌우선 유도(leftmost derivation)하도록
문법으로부터 직접 파서 프로그램을 만든다.
구현
각 넌터미널
프로시저 내에서
생성규칙 우변을 수행 하도록 작성한다.
프로시저 호출
하나의 프로시저(함수,메쏘드) 형태로 구현한다.
생성 규칙을 적용하는 것!
ABcD
© 숙대 창병모
A( )
{
B( );
match(“c”);
D( );
}
48
예제
Command Expr ‘\n’
void Command(void)
{
int result = Expr( );
if (token ==‘\n’)
printf(“The result is: %d\n”, result);
else error();
}
void parse(void)
{ token = getchar();
Command();
}
© 숙대 창병모
main()
{ parse();
return 0;
}
49
예제
Expr Term {+Term}
void Expr(void)
{
Term( );
while (token == “+”) {
match(“+”);
Term();
}
}
void match(char c)
// 현재 토큰 확인 후 다음 토큰 읽기
{ if (token == c) token = getchar();
else error();
}
© 숙대 창병모
50
예제
그림 4.12
순환-하강 파싱 하면서 동시에 수식의 값을 계산
Expr Term {+Term}
int Expr(void)
{
int result = Term( );
while (token == “+”) {
match(“+”);
result += Term();
}
return result;
}
© 숙대 창병모
51
예제
그림 4.12
순환-하강 파싱하면서 동시에 항(Term)의 값을 계산
Term Factor {* Factor}
int Term(void)
{
int result = Factor( );
while (token == “*”) {
match(“*”);
result *= Factor();
}
return result;
}
© 숙대 창병모
52
숙제 #1
그림 4.12의 순환-하강 파서/계산기 확장
뺄셈(-), 나눗셈(/) 추가
비교연산(==, !=, >, <, !) 추가
문법(EBNF)
E AE | AE == AE | AE != AE | AE > AE | AE < AE | !E
AE T {+ T | -T}
T F {* F | / F}
F N | (E)
N D {D}
© 숙대 창병모
53