[PL] Language Extension : FVAE -> CFVAE & Conditional Branch

parkheeddong·2023년 6월 6일
0
post-thumbnail

1. 조건문

조건이 참일 경우 True 브랜치를, 거짓인 경우 false 브랜치를 실행한다.

✔ 일반적인 형태

if-else
if-then-else
e1 ? e2 : e3

조건문에서 특정 언어에서는 statement를 사용하고 다른 언어에선 expression을 사용한다.

expression

evaluate to value. 메모리 변경이 없다. 함수형 언어 특징.
addition, subtraction, application

statement

no evaluate to value. 메모리를 변경한다. imperative 언어.
assignment, call, loop


int x = 1은 evaluation이 아니라, 값을 assign하는 것으로 statement이다. (1 자체는 evaluation)
int y = x + 3은 evaluation이 아니라, 값을 assign하는 것으로 statement이다.
(x+3 자체는 evaluation)
if (y>0)는 expression이다.
y -= 4는 statement다.
y += 4는 statement다.

⇓E ⊆ Store × E × Value
⇒S ⊆ Store × S × Store

2. CFVAE

위 형태가 가능하도록 FVAE를 업데이트 시켜보자

1) Concrete Syntax

2) Abstract Syntax



boolean literal, conditional branch expression, less-than expression을 추가한다

4) Abstract Syntax of CFVAE : IN OCAML

5) Value Domain of CFVAE

기존 FVAE의 Value Domain = Z +D Closure

CFVAE의 Value Domain = Z +D Closure +D Bool
Bool = {true, false}

6) Update Value Domain of CFVAE : IN OCAML

7) Semantics of CFVAE


BOOL 룰이 추가되었다.

위는 기존과 동일하다.

LessThan, Cond 룰이 추가되었다.

8) Formal Semantics of CFVAE



LessThan expression

e1은 n1으로 평가되고 e2가 n2로 평가되면, e1 < e2는 n1 < n2로 평가된다.

Rule Cond case1

e1이 true로 평가되고 e2이 v로 평가되면 e1 ? e2 : e3은 v로 평가된다

Rule Cond case2

e1이 fasle로 평가되고 e3이 v로 평가되면 e1 ? e2 : e3은 v로 평가된다.

🔔 Example


(1-1)<true
e2는 integer값이어야 하는데 logical value(bool)이므로 runtime error
if (1+0) then 0+7 else 3 endif
1+0은 integer 값인데 해당 자리는 logical value어야 하기 때문에 runtime error

🌳 Boolean Support as Syntatic Sugar

우리가 만든 value domain을 simplify 할 수 있는가?! -> syntatic sugar로 가능하다!

true / false의 logical value를 사용하는 것 대신, integer value를 사용하면 된다.
parser을 업데이트하여 parser가 true를 1로, false를 0으로 인식하게 한다.
parse("true") = 1, parse("false") = 0

-> abstract syntax에서 boolean 값이 필요 없어진다.

Value Domain

Abstract Syntax & Semantics


boolean 값은 사라진다.

✔ Example

🌳 More General Form으로 변경

기존에는 e1이 1이어야 true로 평가되었다.
이 경우는 e1이 n으로 평가되고, n이 0이 아닐 경우에는 모두 10, 20 등등 모두 true로 평가되게 만든 것이다.

기존에는 1+2인 경우 runtime error가 발생했다.

이렇게 업데이트 한 이후에는, 7로 평가된다.

ocaml에서도 이렇게 bool 값을 삭제한다.

0개의 댓글