3장

서론

* Syntax(구문) : 언어의 표현식,문장 그리고 프로그램 단위형식

* Semantics(의미론) : 표현식, 문장, 프로그램 단위에 대한 의미

* syntax 와 semantics 는 언어의 의미를 제공한다.


구문기술의 일반적인 문제 : Terminology (용어들)   


* sentence(문장)  : 언어를 구성하는 알파벳으로 구성된 스트링

* language :  sentence 의 집합

* lexeme(어휘항목)  : 가장 작은 구문단위 -> 식별자, 리터럴, 연산자, 특수어

* token : 어휘항목의 한 부류


언어의 형식적 정의

* Recognizers : 문자열을 읽어서 해당 언어에 속하는지 결정한다.

이에 해당하는 구문분석기는 4장에서 배울 것이다.

* Generators : 생성자의 구조를 비교함으로써 특정 문장의 구문이 올바른지 결정 할 수 있다.


BNF , Contest_Free Grammers

* Context-Free Grammars

- Noam Chomsky 에 의해서 발명됌

- 생성 장치 유형

- Context-free languages 

* Backus_Naur Form 

- syntax of Algol 57기술하기 위해서.

- BNF 는 문맥자유언어와 거의 동일하다. 


BNF Fundamentals

* BNF 는 구문 구조에 대해서 추상화를 사용한다

syntatic variable,  nonterminal symbols, nonterminals 로 불린다.

* Terminals 는 lexmems 나 token 이다.

* LHS 는 nonterminal 을 나타내고 RHS 는 terminal 또는 nonterminal 의 문자열로 이루어진다.


* nonterminal 은 보통 꺽쇄로 표현된다

<ident_list> -> identifier | identifier, <ident_list>

<if_stmt> -> if<logic_expr> then <stmt>


* Grammar : 유한한 규칙들의 모임이라고 할 수 있다.

* start symbol 은 nonterminal 의 특정한 요소이다.


BNF Rules


* abstraction ( nonterminal symbol) 은 1개 이상의 RHS 를 가진다.

<stmt> -> <single_stmt> | begin <stmt_list> end


Describing Lists

* syntatic lists 는 recursion 을 이용해 표현된다.

<ident_list> -> ident | ident,  <ident_list>

*  derivation(유도) 는 일련의 규칙적용을 통해서 생성된다.  start symbol 이라 불리는 문법의 특정 논터미널에서부터 시작되 terminal symbol 로만 이루어진 문장으로 끝난다.


Derivations

* 유도과정에 있는 모든 string을 문장형태( sentential form) 이라고 한다.

* sentence 는 terminal symbol 로만 이루어진 sentential form 이다.

* leftmost derivation은 가장 왼쪾에 우치한 논터미널을대체하는 것이다.

* 유도에서 다른 RHS 규칙을 선택함으로써 언어의 다른 문장을 생성할 수 있다.

* 규칙 선택시 모든 가능한 조합을 선택함으로 써 언어전체를 생성할 수 있다.

* 위 언어는 무한 집합이며 제한 시간에 언어의 모든 문장을 생성할 수 없다.


Parse Tree

* hierachical 한 유도과정

* 모든 중간 노드는 논터미널 기호를 레이블로 가지며 모든 잎 노드는 터미널 기호를 레이블로 가진다. 


Ambiguity in Grammars

* 만약에 sentential form 이 두개이상의 parse tree를 가지는 경우와 필요충분조건이다.  언어 구조가 한개 이상의 파스트리를 가지면 ,그 구조의 의미는 유일하게 결정될 수 없다. 어떤 파서가 모호한 구조를 가지면 설계자가 제공하는 비문법적 정보를 사용할 수도 있다.


unambiguous expression 

* 만약 parse tree 가 연산자 우선순위를 가진다면 ambiguity 를 가지지 않는다. 


Associatively of Operator

* operator associativity  덧셈연산 결합법칙이 성립하지 않을 수도 있다

<expr> -> <expr> + <expr> | const (ambiguous)

<expr> -> <expr> + const + const ( unambiguous)


Extended BNF

*[] 대괄호 : 선택적인 부분을 말한다.

* () 소괄호 : 다중 선택 사항에 관한 것이다., 그룹으로부터 한개의 원소가 선택되어야 할 경우

* {} 중괄호 : 무한정 반복되거나 생략될수 있음을 나타낸다. 0이상의 반복!


BNF  and EBNF

* BNF

<expr> -> <expr> + <term> | <expr> - <term> | <term>

<term> -> <term> * factor | <term> / <factor> | <factor>


* EBNF

<expr> -> <term> { (+ | -) <term> }

<term> -> <factor> { (* | / ) <factor>  }


Recent Variations in EBNF

* Alternative RHS 별도의 줄에 표현한다

* 화살표 대신에 콜론이 사용된다

* 대괄호 선택사항 대신에 opt 작은첨자 사용

* 소괄호 리스트에서 선택사항을 나타내기 위해 oneof 작은첨자를 사용


Static Semantics(정적의미론)

* Nothing to do with meaning

* Context-free grammars 는 프로그래밍 언어의 모든 구문을 표현할 수 없다.

* types of operands in expression 과 같은cumbersome

* non_context-free ( 사용되기 전에 선언되는 변수들)


Attribute Grammars

* 속성문법은 parse tree nodes 에 semantic info 를 준다

* Primary value of AGs

- compiler design

- static Semantics specification


* Definition 어려워...

 속성문법은 다음의 특징들이 첨가된 문법이다.

- 각 문법기호 X 에 속성들의 집함 A(X) 를 연관시킨다.

- 각 rule은 특정 nonterminal 의 속성 값을 정의하는 함수의 집합을 가진다

- attribute consistency 를 체크하기 위한 술어함수를 지닌다.

- X0 -> x1,,, Xn 을 rule이라고 하자.


* 속성값 계산

- 만약 모든 속성이 상속된다면 트리는 top0down 으로 진행된다

- 만약 모든 속성이 합성된다면 잎노드 부터 루트 노드까지 bottom-up 으로 진행된다

- 많은 경우 두가지 모두 사용된다.


Semantics

동적의미론에 대해서 범용적으로 채택되는 표기법이 개발되지 않았다.


Operational Semantics

- 명령어의 의미는 명령어의 실행으로 발생한 컴퓨터의 상태 변화로 표현된다.

- operational semantics 을 high level language 에서 사용하기 위해선 버츄얼머신이 필요하다.

- 하드웨어 pure interpreter 는 너무 비싸다

- 소프트웨어 pure interpreter 도 문제를 지닌다

- 특정 컴퓨터의 특성에 따라서  동작을 이해하기 어렵다

- 단지 동일한 사양을 갖는 컴퓨터에서만 적용가능하다


=> 대안 : complete computer simulation

- 저급언어로 번역해주는 번역기가 필요하다

- 가상 기계를 만든다

=> 사용되는 곳 : language manual , textbook , teaching programming language


Denotational Semantics(표기의미론)

- 가장 엄격하고 널리 알려진 프로그램 의미 기술 방법

- 재귀 함수 이론에 견고하게 기반하고 있다.


* 표기의미론의 절차

- 수학적 객체와 그요소의 사례를 수학적 객체의 사례로 사상하는 함수를 정의

- 언어의 의미구성은 오직 프로그램의 변수값에 의해서 정의된다


program 의 상태는 모든 현재의 변수값이다.

s = {<i1,v1> , <i2,v2> , ... , <in,vn> }

VARMAP 을 변수이름과 상태를 입력받았을때 현재 그 변수값을 리턴하는 함수라고 정의하자


<dec_num> ->   '0' | '1' | '2' | '3' | '4' | '5' | 

              '6' | '7' | '8' | '9' | 

              <dec_num> ('0' | '1' | '2' | '3' |

                         '4' | '5' | '6' | '7' | 

                         '8' | '9')

Mdec('0') = 0,  Mdec ('1') = 1, …,  Mdec ('9') = 9

Mdec (<dec_num> '0') = 10 * Mdec (<dec_num>)

Mdec (<dec_num> '1’) = 10 * Mdec (<dec_num>) + 1

Mdec (<dec_num> '9') = 10 * Mdec (<dec_num>) + 9


( 재귀적인 성질이 강함)


* 표기의미론에 대한 평가

- 프로그램의 correctness 를 증명할 수 있다.

- 프로그램을 엄밀한 방법으로 생각할 수 있다

- 언어 디자인에 도움을 준다

- compiler 생성 시스템에 사용된다.

- 그것의 복잡성 떄문에 언어사용자들은 잘 쓰지 않는다



Axiomatic Semantics(공리 의미론)

* 수학 논리에 기반한다

* 공리적 의미론에서 사용되는 논리식을 술어 또는 단언이라고 한다.

* 이러한 단언들을 각각 그 문장에 대한 전조건과 후조건이라 부른다.


* 최약전조건 : 후조건의 유효성을 보장하는 최소로 제약된 전조건이다.

* 프로그램의 증명은 프로그램의 마지막 문장에 대한 후조건으로 사용하는 것으로 시작된다.

* 추론규칙은 한 단언의 참 값을 다른 단언들의 값에 기반하여 추론하는 방법이다.

상단부분을 조건부, 하단부분을 결론부라고 할 때 위부분이 참이면 결론부가 참임을 추론할 수 있다고 한다.

* 공리 : 참이라고 가정되는 논리문장이다. 따라서 조건부가 없는 추론 규칙이다.




예상문제


1. 프로그래밍 언어를 학습하는 이유를 5가지만 서술하시오

- 생각을 표현할 수 있는 능력이 향상된다

- 적합한 언어를 선택할 수 있는 배경이 향상된다.

- 새로운 언어를 배울 수 있는 능력이 향상된다.

- 구현의 중요성에 대해서 보다 많이 이해한다.

- 전반적으로 전자계산 분야의 이해가 향상된다.


1-1. 프로그래밍 언어 평가 기준은 서로 상충되는 평가기준이 있다. 4가 지 예를 들어 설명하시오(20).


판독성 : 얼마나 쉽게 읽고 이해할 수 있느냐

작성력 : 선택된 문제 영역에 대해 프로그램을 생성하는 데 언어가 얼마나 쉽게 사용될 수 있느냐

신뢰성 : 모든 조건 하에서 주어진 명세에 따라 수행한다면 신뢰적이라고 한다.

비용 : 프로그래머 교육비용, 작성비용, 컴파일비용,실행비용,구현시스템비용,신뢰성부족에따른비용,유지보수비용


상충되는평가기준

신뢰성과 실행비용

판독성과 작성력

유연성과 신뢰성

작성력과 신뢰성


1-2. 직교성의 의미, 프로그래밍 언어에 미치는 영향

적은개 수의 기본 구조들이 적은 개수의 방법으로 조합되어 언어의 제어 구조와 데이터 구조가 생성될 수 있다는것.

직교적이면 더 적은 예외사항을 갖는다. 따라서 더 높은 정규성을 의미한다.

지나치게 높은 직교성은 불필요한 복잡성을 초래할 수 있다.


1-3. 프로그래밍 언어 구현방법중 혼합형 구현 시스템에 대하여 설명

컴파일러와 순수 인터프리터 간의 절충이다. 즉, 고급 언어 프로그램을 용이한 해석이 가능하도록 설계된 중간 언어로 번역한다. 이 방법은 원시 언어 문장이 단지 한 번만 해석되기 때문에 순수해석보다 더 빠르다. 이런 구현을 혼합형 구현 시스템이라 부른다.


2. Algol 60의 가장 중요한 개발 사항을 4가지를 서술하라

- 블록 구조 개념이 도입되었다.

- 부프로그램에 매개변수를 전달하는 두 개의 다른 방법이 허용되었다.

- 프로시저는 재귀적일 수 있게 허용되었다.

- 스택-동적 배열이 허용되었다. 

 

2-1.C++는 초기에 클래스를 가진 C라고 불리어 졌다. C++의 초기 목적 은 무엇인가? 간단히 서술하시오(10)

- 클래스와 상속을 사용하여 조직될 수 있듯이 조직될 수 있는 언어를 제공하는것

- 중요한 목적은 C 와 비교해서 성능 저하가 거의 또는 전혀 없어야 한다는 것

- C가 사용될 수 있는 모든 응용에 대해서 사용될 수 있어야 한다는 것


2-2. 별칭의 3가지 예를 쓰시오

- buffer overflow

- pointers

- foreach loop 문에서 사용되기도 한다.


2-3. smalltalk 에 대해서 서술하시오. 

- smalltalk 은 객체지향 프로그래밍을 완전히 지원하는 첫 번째 프로그래밍 언어이다. 

- smalltalk 은 그래픽 사용자 인터페이스와 객체-지향 프로그래밍을 발전시켰다.

- 데이터 추상화, 상속,다이나믹 바인딩 등이 사용된다.


3. 다음 각문장과 후조건에 대해서 최약 전조건을 계산하라(20).

1.  a = 2 * ( b - 1) { a > 0} 

2*(b-1) > 0

{b > 1}  이 최약 전조건이다.

 

2. b = b + 2 * a - 1{b > 1}

b+ 2*a -1 > 1

{b > 2*a+2} 이 최약 전조건이다.


3. a = 2 * b + 1; b = a - 3 {b < 0}

a-3 < 0

a < 3 이 첫번째 배정문의 후조건이 된다.

2*b+1 < 3

{b < 1}이 최약 전조건이다.


4. 
if( x > 0) then y = y + 1 else y = y-1 { y > 0} 

then 절의 논리문에서 y +1 > 0 으로부터 y > -1 을 생성한다.

else 에 동일한 공리를 적용하여y > 1 을 생성한다. 

{y >1} => {y>-1} 이 성립하기 때문에 {y>1}  을 전조건으로 사용할수 있다.



3-1.  다음 배정문과 후조건에 대하여 각각 최약 전조건(weakest precondition)을 구하시오(20).

1. a := (b + 5) / 2 { a > 6 }

b+5 > 12

{b > 7} 이 최약 전조건이 된다.


2. a := 3 * ( 2 * b + a ) { a < 6 }

{2*b + a < 2} 이 최약전조건이 된다.


3. a := 2 * b +1; b = a 
3 {b < 0}

a<3  이 첫번째 논리문의 후조건이 된다.

2*b +1 < 3 이므로 {b<1} 이 최약 전조건이 된다.


4. 
if (x > 0 ) y := y - 1 else y := y + 1 {y > 0} 

then 절의 논리문에서 후조건 {y>0} 을 이용해 y>1 의 단언을 생성한다.

else 절의 논리문에서 후조건 {y>0} 을 이용해 y>-1 의 단언을 생성한다.

y>-1 => y>1 이므로 {y>1} 이 전조건이 된다. 


3-2. 

 1) 일반

  y = (x-5) / 2 {y < 6}

x-5 < 12

{x < 17} 이 최약 전조건이 된다.


 2) 순차

  a = 3 * (2b + a)

  b = 2 * a - 1

{b<5}

{a < 3}  이 첫번쨰 논리문의 후조건이 된다.

{2b+a < 1} 이 최약 전조건이다.


 3) if절(imply)

  if(x>0)

y = y+1

  else

y = y-1 {y > 0}

then 절의 논리문에서 후조건 {y>0} 을 이용해 y>1 의 단언을 생성한다.

else 절의 논리문에서 후조건 {y>0} 을 이용해 y>-1 의 단언을 생성한다.

y>-1 => y>1 이므로 {y>1} 이 전조건이 된다. 




 4) while절(loop불변자이용)

 while(y<>x)(y=y+1) {y = x}








3-3 . {s>1} while(s>1){s *=2 }{s=1} 책에 나와있는 문제. 이 프로그램이 옳음을 보이시오.





3-4. 문법이 주어지고 모호함을 보이시오. 모호함을 해결하시오. 

<assign> -> <id> = <expr>

<id> -> A|B|C

<expr> -> <expr> + <expr>

| <expr> * <expr>

| (<expr>)

|<id>


단순 배정문에 대한 모호한 문법

A = B + C * A

 두개의 다른 파스 트리로 표현된다.

따라서 이 모호함을 해결해보자!

<assign> -> <id> = <expr>

<id> -> A|B|C

<expr> -> <expr> + <term> | <term>

<term> -> <term> * <factor> | <factor>

<factor> -> (<expr>) | <id>


이렇게 만들고 최우단유도나 최좌단유도가 모두 같은 파스트리를 만드는것을 보이면 된다.





4. 다음 프로그램이 정확하다는 것을 증명하시오(10). { x = A AND y = B}

t = x;
x = y;

y = t; {x=BANDy= A}


5. 아래에 주어진 문법에 대하여 답하시오(20).

r1. E-> E + T r3. T-> T / F r5. F->(E)

r2. E-> T r4. T->F r6. F->id

1 id / id + id의 최좌단 유도(leftmost derivation)와 최우단 유도(rightmost derivation)을 구하시오.

2 다음 LR 파싱 테이블을 사용하여 id / id + id에 대한 LR 파싱 과정을 보이시오. 







5-1.





'학부공부' 카테고리의 다른 글

네트워크 2장 application Layer  (0) 2017.10.20
프언 유원희  (3) 2017.10.17
  1. 자손9319 2017.10.18 06:05 신고

    와... 프언을 공부하네 실화냐

    • ryul 2017.10.18 13:43

      ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ뭐야 어캐알았지

  2. ㅁㅁㅁㅁ 2018.11.12 16:28

    문제 출처가 어딘가요?

+ Recent posts