제 5 장 구문 정의 프로그래밍 언어의 기본 문자 집합 Alphabet 문자 (A-Z) 26 개 + 아라비아 숫자 (0 - 9) 10 개 예 ) Fortran : 기본 문자 집합 + 13 개의 특수문자 (=+ - * / ( ),. $ ‘ : 공백 ) Algol60 : 알파벳 대소문자 52 개 +Digit 10 개 + 28 개의 특수문자 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) 정의 예 ::= | | ::= | | ::=A | B | C |... | X | Y | Z ::=A | B | C |... | X | Y | Z ::=0 | 1 | 2 |... | 8 | 9 ::=0 | 1 | 2 |... | 8 | 9 메타기호 ::= 정의하다, nonterminal, | 택일기호 메타기호 ::= 정의하다, nonterminal, | 택일기호
구문 정의 EBNF(Extended Backus-Naur Form) 표기법 BNF 표기법을 확장하여 보다 읽기 쉽고, 간단하게 표현된 표기법 BNF 보다 추가된 특수한 의미를 갖는 EBNF 의 메타 기호 반복 : { }, { } 번 이상 반복 선택 : [ ] 0 또는 1 번 선택 { }, [ ], |, ( ), ::= 와 같은 메타 기호를 언어의 terminal 로 사용하는 경우 ‘|’, ‘::=‘ 와 같이 인용부호로 묶어 표현 sub-pascal 시작부에 대한 EBNF 표기 ::=program ;. ::=program ;. ::=[ ][ ]{ } ::=[ ][ ]{ } ::=const = { ; = } ; ::=const = { ; = } ; ::=var : { ; : } ; ::=var : { ; : } ; ::= {, } ::= {, } ::=procedure ['(' ')'] ; ; ::=procedure ['(' ')'] ; ; ::=begin { ; } end ::=begin { ; } end
구문 정의 구문 도표 (Syntax diagram) 구문 도표 구문 도표는 그 형태가 순서도와 유사 구문 도표는 EBNF 와 일대일 대응 다시 정의될 대상은 네모칸으로 terminal 기호는 원이나 타원형으로 표시 이들 사이는 지시선으로 연결 예 : 예 : 예 : 예 : nonterminal B terminal x xx BB
AA X1X1X1X1 X1X1X1X1 X2X2X2X2 X2X2X2X2 XnXnXnXn XnXnXnXn AA... x1x1x1x1 x1x1x1x1 x2x2x2x2 x2x2x2x2 xnxnxnxn xnxnxnxn α2α2α2α2 α2α2α2α2 αnαnαnαn αnαnαnαn α1α1α1α1 α1α1α1α AA 구문 도표 그리는 방법 A ::= X 1 X 2...X n X i 가 nonterminal 인 경우 x i 가 terminal 인 경우 A ::= α 1 | α 2 |... | α n α 1,α 2, …,α n 이 nonterminal 일 경우 구문 정의
구문 도표 그리는 방법 ( 계속 ) EBNF A ::= { } EBNF A ::= [ ] A ::= (α 1 α 2 )β 구문 도표 그리는 방법 ( 계속 ) EBNF A ::= { } EBNF A ::= [ ] A ::= (α 1 α 2 )β αα AA αα AA α2α2α2α2 α2α2α2α2 α1α1α1α1 α1α1α1α1 AA ββ
구문 정의 xx BB‘)’‘)’ ‘(’‘(’AAAA CC BB AA CC ++ xx ‘)’‘)’ ‘(’‘(’ AA AA AA 예제 (EBNF 구문도표 ) (EBNF 구문도표 ) A ::= x | ‘(’ B ‘)’ B ::= AC C ::= {+A} ( 조건 ) ( 조건 ) V N = { A, B, C } V T = { +, x, (, ) } 예제 (EBNF 구문도표 ) (EBNF 구문도표 ) A ::= x | ‘(’ B ‘)’ B ::= AC C ::= {+A} ( 조건 ) ( 조건 ) V N = { A, B, C } V T = { +, x, (, ) } ++
구문 정의 Sub-pascal 시작부 구문도표
파스 트리 (Parse Tree) 파스 트리 원시 프로그램의 문법 검사 과정에서 내부적으로 생성되는 트리 형태의 자료구조 문장 표현이 BNF 에 의해 작성될 수 있는지 여부를 나타냄 예 : 식별자에 대한 BNF 를 통해 다음 TEST1 에 대한 파스 트리 작성 구문 정의 ::= | ::= | | | ::=A | B | C |... | X | Y | Z ::=A | B | C |... | X | Y | Z ::=0 | 1 | 2 |... | 8 | 9 ::=0 | 1 | 2 |... | 8 | 9 T E S T 1
구문 정의 구문과 프로그램 신뢰성 (reliability) 구문 (syntax) 언어의 신뢰성에 영향 FORTRAN PL/I DO 10 I = 2.6 DO 10 I = 2.6 A(I) = B + C(I) A(I) = B + C(I) 10 CONTINUE DO 10 I = 2.6 DO 10 I = 2.6 A(I) = B + C(I) A(I) = B + C(I) 10 CONTINUE A = B = C 2.6 의 오류 (. 대신, 사용해야 함 ) DO10I 에 2.6 배정으로 인식 2.6 의 오류 (. 대신, 사용해야 함 ) DO10I 에 2.6 배정으로 인식 다중배정문의 의미 (A 와 B 에 C 값 저장 ) (B equal to C) 의 결과를 A 에 저장하는 문장으로 인식 문장으로 인식 다중배정문의 의미 (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 해석 ① 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 else S2 end ② if c1 then begin if c2 then S1 end else S2 ② 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 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 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 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.