구문 도표 그리는 방법

Report
제5장
구문 정의
 프로그래밍 언어의 기본 문자 집합
 Alphabet 문자 (A-Z) 26개 + 아라비아 숫자 (0 - 9) 10개
 예) Fortran : 기본 문자 집합 + 13개의 특수문자(=+ - * / ( ) , . $ ‘ : 공백)
Algol60 : 알파벳 대소문자 52개 +Digit 10개 + 28개의 특수문자
(p82 그림 5.1 참조)
 문자 코드 체계
 EBCDIC(Extended Binary Coded Decimal Interchange Code)
 IBM에서 제안, 8비트 조합 코드
 ASCII(American Standard Code for Information Interchange)
 ANSI에서 제안, 7비트 조합 코드(128개의 문자 표현)
 영문자 대소문자 52개 + 숫자 10개 + 33개 특수문자 +33개의 제어문자
 정합 순서(collating sequence)
 문자 또는 문자열에 대한 일반적인 순서
 언어 구현시에 결정, 일반적으로 문자의 bit 조합 표현 순서에 영향
 예) 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 , A < B < C < ... < X < Y < Z
구문 정의
 예약어(Reserved Words, Key Words)




언어 어휘를 구성하는 단어나 기호 형태의 문자 알파벳
프로그램의 변수 이름으로 사용할 수 없음
장점 : 프로그램 판독성 증가, 컴파일러가 기호 테이블을 빠른 시간에 탐색
단점 : 많은 예약어
 기억에 어려움,
언어 확장시 新 예약어와 이전에 사용된 프로그램의 식별자와 중복 우려
구문 정의
 BNF 표기법
 BNF(Backus-Naur Form) 표기법
 구문(syntax) 형식을 정의하는 가장 보편적인 표기법
 한 언어의 구문에 대한 BNF 정의
 언어의 문장을 생성하는 생성 규칙(production rule) 정의
 생성 규칙
 생성 규칙의 왼쪽(정의될 대상), 오른쪽에는 그 대상에 대한 정의가 표현
 BNF 표기법에 의한 식별자(identifier) 정의 예
<identifier> ::= <letter>| <identifier><letter> | <identifier><digit>
<letter> ::=A | B | C | ... | X | Y | Z
<digit> ::=0 | 1 | 2 | ... | 8 | 9
메타기호 ::= 정의하다 , < > nonterminal, | 택일기호
구문 정의
 EBNF(Extended Backus-Naur Form) 표기법
 BNF 표기법을 확장하여 보다 읽기 쉽고, 간단하게 표현된 표기법
 BNF보다 추가된 특수한 의미를 갖는 EBNF의 메타 기호
 반복 : { }, { }07
0 번 이상 반복
 선택 : [ ]
0 또는 1번 선택
 { }, [ ], |, ( ), ::=와 같은 메타 기호를 언어의 terminal로 사용하는 경우
 ‘|’, ‘::=‘ 와 같이 인용부호로 묶어 표현
 sub-pascal 시작부에 대한 EBNF 표기
<subpascal> ::=program <ident>;<block> .
<block> ::=[<const_dcl>][<var_dcl>]{<proc_dcl>} <compound-st>
<const_dcl> ::=const <ident> = <number> {;<ident> = <number> };
<var_dcl> ::=var <ident_list> : <type> {; <ident_list> : <type> };
<ident_list> ::=<ident> {,<ident>}
<proc_dcl> ::=procedure <ident>['('<formal_param>')'];<block>;
<compound-st> ::=begin <statement> {;<statement>} end
구문 정의
 구문 도표(Syntax diagram)
 구문 도표
 구문 도표는 그 형태가 순서도와 유사
 구문 도표는 EBNF 와 일대일 대응
 다시 정의될 대상은 네모칸으로 terminal 기호는 원이나 타원형으로 표시
 이들 사이는 지시선으로 연결
예:
terminal x
x
nonterminal B
B
구문 정의
 구문 도표 그리는 방법
 A ::= X1X2 ...Xn
 Xi가 nonterminal인 경우
A
X1
X2
...
Xn
x2
...
xn
 xi가 terminal인 경우
A
x1
 A ::= α1|α2| ...|αn
α1
A
α2
...
αn
α1,α2, …,αn 이 nonterminal일 경우
구문 정의
 구문 도표 그리는 방법(계속)
 EBNF A ::= {  }
A
α
 EBNF A ::= [  ]
A
α
 A ::= (α1α2)β
α1
β
A
α2
구문 정의
A
x
 예제
‘(’
(EBNF 구문도표)
A ::= x |‘(’ B ‘)’
B ::= AC
C ::= {+A}
B
‘)’
B
C
A
C
A
+
(조건)
VN = { A, B, C }
VT = { +, x, (, ) }
A
x
‘(’
‘)’
A
A
+
구문 정의
 Sub-pascal 시작부 구문도표
구문 정의
 파스 트리(Parse Tree)
 파스 트리
 원시 프로그램의 문법 검사 과정에서 내부적으로 생성되는 트리 형태의 자료구조
 문장 표현이 BNF에 의해 작성될 수 있는지 여부를 나타냄
 예 : 식별자에 대한 BNF를 통해 다음 TEST1에 대한 파스 트리 작성
<identifier>
<digit>
<identifier>
<identifier> ::=<letter> |
<identifier><letter> |
<identifier><digit>
<letter> ::=A | B | C | ... | X | Y | Z
<digit> ::=0 | 1 | 2 | ... | 8 | 9
<identifier>
<identifier>
<identifier>
<letter>
<letter>
<letter>
<letter>
T
E
S
T
1
구문 정의
 구문과 프로그램 신뢰성(reliability)
 구문(syntax)
 언어의 신뢰성에 영향
 FORTRAN
 2.6의 오류 ( . 대신 , 사용해야 함)
 DO10I에 2.6 배정으로 인식
DO 10 I = 2.6
A(I) = B + C(I)
10 CONTINUE
 PL/I
A=B=C
 다중배정문의 의미(A와 B에 C값 저장)
 (B equal to C)의 결과를 A에 저장하는
문장으로 인식
 현수(dangling) else 문제
 중첩된 if 문에서 else는 어떤 if의 else인가?
 예제
if c1 then if c2 then S1 else S2
해석
① if c1 then (if c2 then S1 else S2)
② if c1 then (if c2 then S1) else S2
구문 정의
 각 언어에서의 dangling else 문제 해결책
 Algol 60
① if c1 then begin if c2 then S1 else S2 end
② if c1 then begin if c2 then S1 end else S2
 Algol 68
① if c1 then if c2 then S1 else S2 fi fi
② if c1 then if c2 then S1 fi else S2 fi
 PL/I
② IF c1 THEN IF c2 THEN S1; ELSE S2;
또는
IF c1 THEN IF c2 THEN S1; ELSE; ELSE S2;
 Pascal
② if c1 then begin if c2 then S1 end else S2
또는
if c1 then if c2 then S1 else else S2
※ PL/1과 pascal은 일반적으로 ①의 경우로 해석
Programming Languages
- The end of Chapter 5 -
To Be Continue ...
Copyright, 1999 © H. Y. Kwak, Cheju National University.

similar documents