개발자의 편의성을 위해 Concrete Syntax를 확장한 것이다.
기존 언어의 구성요소를 조금 더 쉽고 편하게 사용할 수 있도록 추가적으로 제공해주는 문법이다.
대부분 그저 lambda abstraction와 application 만으로만 프로그램을 작성하는 것은 어렵기 때문에 syntatic sugar을 통해 프로그래머가 좀 더 쉽게 작성할 수 있도록 한다.
x = x + 5;
와 x += 5;
전자와 후자는 동일한 semantic을 가지고 있다.
언어는 전자만 문법으로 제공해도 되지만 프로그래머를 위해 후자도 제공한다. 이것이 바로 syntatic sugar이다!
단지 Concrete Syntax과 Parser를 변경하면 되며, Abstract Syntax과 Semantics를 변경할 필요는 없다.
따라서 언어 디자이너의 burden이 크지 않다.
syntax sugar 없이 negation operator을 더해보자.
Concrete Syntax
concrete syntax에"-" "(" expr ")"
을 더하여 업데이트해준다.Abstract Syntax
abstract syntax에 -e를 추가하여 업데이트한다.parser
parser도 negation operator을 이해할 수 있도록 업데이트 한다.
semantics
semantic까지 업데이트 한다.-> 4가지의 update가 필요하다.
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을 변경할 필요가 없어진다.
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를 변환할 필요가 없게 된다.
parse("let foo x = x + 1 in foo 3")
= let foo = (ʎx. x + 1) in foo 3
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를 이용한 것이다.
parse("(fun x y -> x + y) 1 3")
= (ʎx.ʎy.x + y) 1 3