monkey는 typescript로 작성된 node.js런타임 환경에서 실행되는 인터프리터 언어입니다.
Writing an INTERPRETER in go에서 소개된 간단한 장난감 언어를 Typescript로 구현하였습니다.
literal: <boolean_literal> | <integer_literal> | <identifier>
boolean_literal: true | false
integer_literal: [0-9]+
string_literal: "([a-zA-Z_])*"
function_literal:
fn <parameters> <blockstatement>
parameters:
( <parameter one>, <parameter two>, <parameter three>, ... )
identifier: [a-zA-Z_]+
expression:
<literal> | <identifier> |
<infix_expression> |
<prefix_expression> |
<call_expression>
prefix_expression: <prefix_operator><expression>
prefix_operator: + | - | !
infix_expression: <expression> <infix_operator> <expression>
call_expression: <expression> (<comma seperated expressions>)
statement: <expression>; | <if_statement> | <let_statement>
if_statement:
if (<condition>) <consequence> else <alternative> |
if (<condition>) <consequence>
let_statement:
let <identifier> = <expression>
...
명령문은 값을 생성하지 않는반면 표현식은 값을 생성해냅니다.
let a = fn(x) { x + 5 }; 은 명령문입니다.
a(10); 은 표현식입니다.
monkey언어에서 let 문과 return 문을 제외하면 모두 표현식입니다.
-5;
!true;
5 + 5;
5 - 5;
5 / 5;
5 * 5;
5 * (5 + 5)((5 + 5) * 5) * 5;
add(2, 3);
add(add(2, 3), add(5, 10));
max(5, add(5, 5 * 5));
(foo * bar) / foobar;
add(foo, bar);
함수는 일급 시민입니다. 따라서 함수 리터럴 역시 표현식입니다.
Monkey 언어에는 if 표현식이 이라는 특이한 문법이 있습니다.
let result = if (10 > 5) { true } else { false };
result // => true