[PL] Syntactic Sugar

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

🔔 Syntatic Sugar(문법적 설탕)이란?

개발자의 편의성을 위해 Concrete Syntax를 확장한 것이다.

기존 언어의 구성요소를 조금 더 쉽고 편하게 사용할 수 있도록 추가적으로 제공해주는 문법이다.

대부분 그저 lambda abstraction와 application 만으로만 프로그램을 작성하는 것은 어렵기 때문에 syntatic sugar을 통해 프로그래머가 좀 더 쉽게 작성할 수 있도록 한다.

📌 Example

x = x + 5;x += 5;
전자와 후자는 동일한 semantic을 가지고 있다.
언어는 전자만 문법으로 제공해도 되지만 프로그래머를 위해 후자도 제공한다. 이것이 바로 syntatic sugar이다!

단지 Concrete Syntax과 Parser를 변경하면 되며, Abstract Syntax과 Semantics를 변경할 필요는 없다.

따라서 언어 디자이너의 burden이 크지 않다.

📌 Example

syntax sugar 없이 negation operator을 더해보자.

Concrete Syntax


concrete syntax에 "-" "(" expr ")"을 더하여 업데이트해준다.

Abstract Syntax


abstract syntax에 -e를 추가하여 업데이트한다.

parser

parser도 negation operator을 이해할 수 있도록 업데이트 한다.

semantics


semantic까지 업데이트 한다.

-> 4가지의 update가 필요하다.

📌 Example

syntatic sugar을 사용해 보자.
negation을 지원하도록 업데이트 하되, syntatic sugar을 사용한다.

Concrete Syntax


"-" "(" expr ")" 를 추가하여 업데이트한다.

parser

parser도 이 negation operator을 이해할 수 있도록 업데이트한다.
그러나 parser가 concrete syntax를 evaluate할 때에는, "-(expr)"을 "0 - (e)"로 변환시킨다.
"- (2+3)"은 "0 - (2 + 3)"로 변환 (기존의 expr - expr 이용)

🌳 parser가 이렇게 negation expression을 변환함으로서, 우리는 abstract syntax와 semantic을 변경할 필요가 없어진다.




🔔 Named Function Support

syntatic sugar을 사용해서 named function을 만들 수 있다.


FVAE 언어에서 익명함수를 지원하도록 fun var -> expr를 추가하여 Concrete syntax 를 업데이트하였다.

이제, let var var = expr in expr을 추가하여 FVAE가 named function도 지원할 수 있도록 해 보자!
우리는 syntatic sugar을 이용하여 concrete syntax와 parser만을 업데이트 해보자.

parser는 concrete syntax let var1 var2 = expr1 in expr2를 abstract syntax let var1 = (ʎvar2, expr1) in expr2로 변환시켜야 한다.
즉, 첫 번째 rule let var = expr in expr을 이용하고, 세번째 rule(func var -> expr) 을 이용할 수 있다.

parser가 이렇게 변환시켜주기 때문에, abstract syntax와 semantics를 변환할 필요가 없게 된다.

Example

parse("let foo x = x + 1 in foo 3")
= let foo = (ʎx. x + 1) in foo 3




🔔 Multiple Parameters Support

syntax sugar을 이용해서 FVAE가 multipe parameter도 지원하도록 만들어 보자.

fun var_list -> expr 로 concrete syntax를 추가한다. var_list ::= var var_list | var 이다.

parser는 concrete syntax fun var_list -> expr 을 abstract syntaxʎvar1. ʎvar2. expr로 변환 시켜준다.
기존에 정의한 ʎx.e syntax를 이용한 것이다.

Example

parse("(fun x y -> x + y) 1 3")
= (ʎx.ʎy.x + y) 1 3

0개의 댓글