Skip to content

Commit 562d83a

Browse files
committed
updated function declaration syntax
1 parent abb83a6 commit 562d83a

File tree

9 files changed

+56
-54
lines changed

9 files changed

+56
-54
lines changed

benchmark/fib.hk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
fn fib(n) =>
22
if (n < 2) n
3-
else fib(n - 1) + fib(n - 2)
3+
else fib(n - 1) + fib(n - 2);
44

55
let n = to_int(args[0]);
66
let m = to_int(args[1]);

docs/grammar.ebnf

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,26 @@ statement ::= import_statement
1616
| return_statement
1717
| block
1818

19-
import_statement ::= 'import' name ( 'as' name )? ';'
20-
| 'import' STRING 'as' name ';'
21-
| 'import' '{' name ( ',' name )* '}' 'from' ( name | STRING ) ';'
19+
import_statement ::= 'import' NAME ( 'as' NAME )? ';'
20+
| 'import' STRING 'as' NAME ';'
21+
| 'import' '{' NAME ( ',' NAME )* '}' 'from' ( NAME | STRING ) ';'
2222

23-
variable_declaration ::= 'let' name '=' expression
24-
| 'mut' name ( '=' expression )?
25-
| ( 'let' | 'mut' ) '[' '_' | name ( ',' '_' | name )* ']' '=' expression
26-
| ( 'let' | 'mut' ) '{' name ( ',' name )* '}' '=' expression
23+
variable_declaration ::= 'let' NAME '=' expression
24+
| 'mut' NAME ( '=' expression )?
25+
| ( 'let' | 'mut' ) '[' '_' | NAME ( ',' '_' | NAME )* ']' '=' expression
26+
| ( 'let' | 'mut' ) '{' NAME ( ',' NAME )* '}' '=' expression
2727

28-
assign_call ::= name subscript* assign_op expression
29-
| name subscript* ( '++' | '--' )
30-
| name subscript* '[' ']' '=' expression
31-
| name subscript* subscript '=' expression
32-
| name ( subscript | call )* call
28+
assign_call ::= NAME subscript* assign_op expression
29+
| NAME subscript* ( '++' | '--' )
30+
| NAME subscript* '[' ']' '=' expression
31+
| NAME subscript* subscript '=' expression
32+
| NAME ( subscript | call )* call
3333

34-
struct_declaration ::= 'struct' name '{' ( string | name ( ',' string | name )* )? '}'
34+
struct_declaration ::= 'struct' NAME '{' ( string | NAME ( ',' string | NAME )* )? '}'
3535

36-
function_declaration ::= 'fn' name '(' ( 'mut'? name ( ',' 'mut'? name )* )? ')' ( '=>' expression | block )
36+
function_declaration ::= 'fn' NAME '(' ( 'mut'? NAME ( ',' 'mut'? NAME )* )? ')' ( '=>' expression ";" | block )
3737

38-
delete_statement ::= 'del' name subscript* '[' expression ']' ';'
38+
delete_statement ::= 'del' NAME subscript* '[' expression ']' ';'
3939

4040
if_statement ::= ( 'if' | 'if!' ) '(' ( variable_declaration ';' )? expression ')'
4141
statement ( 'else' statement )?
@@ -49,7 +49,7 @@ while_statement ::= ( 'while' | 'while!' ) '(' expression ')' statement
4949
| 'do' statement ( 'while' | 'while!' ) '(' expression ')' ';'
5050

5151
for_statement ::= 'for' '(' ( variable_declaration | assign_call )? ';' expression? ';' assign_call? ')' statement
52-
| 'foreach' '(' name 'in' expression ')' statement
52+
| 'foreach' '(' NAME 'in' expression ')' statement
5353

5454
break_statement ::= ( 'break' | 'continue' ) ';'
5555

@@ -60,7 +60,7 @@ block ::= '{' stmt* '}'
6060
assign_op ::= '=' | '|=' | '^=' | '&=' | '<<=' | '>>='
6161
| '+=' | '-=' | '*=' | '/=' | '~/=' | '%='
6262

63-
subscript ::= '[' expression ']' | '.' name
63+
subscript ::= '[' expression ']' | '.' NAME
6464

6565
call ::= '(' ( expression ( ',' expression )* )? ')'
6666

@@ -102,18 +102,18 @@ literal ::= 'nil' | 'false' | 'true' | number | string
102102

103103
array_constructor ::= '[' ( expression ( ',' expression )* )? ']'
104104

105-
struct_constructor ::= '{' ( string | name ':' expression ( ',' string | name ':' expression )* )? '}'
105+
struct_constructor ::= '{' ( string | NAME ':' expression ( ',' string | NAME ':' expression )* )? '}'
106106

107-
anonymous_struct ::= 'struct' '{' ( string | name ( ',' string | name )* )? '}'
107+
anonymous_struct ::= 'struct' '{' ( string | NAME ( ',' string | NAME )* )? '}'
108108

109-
anonymous_function ::= '|' ( 'mut'? name ( ',' 'mut'? name )* )? '|' ( '=>' expression | block )
109+
anonymous_function ::= '|' ( 'mut'? NAME ( ',' 'mut'? NAME )* )? '|' ( '=>' expression | block )
110110
| '||' ( '=>' expression | block )
111111

112112
if_expression ::= ( 'if' | 'if!' ) '(' expression ')' expression 'else' expression
113113

114114
match_expression ::= 'match' '(' expression ')' '{' expression '=>' expression ( ',' expression '=>' expression )*
115115
',' '_' '=>' expression '}'
116116

117-
subscript_call ::= name ( subscript | call )* ( '{' ( expression ( ',' expression )* )? '}' )?
117+
subscript_call ::= NAME ( subscript | call )* ( '{' ( expression ( ',' expression )* )? '}' )?
118118

119119
group_expression ::= '(' expression ')'

docs/grammar.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -197,26 +197,26 @@ statement ::= import_statement
197197
| return_statement
198198
| block
199199
200-
import_statement ::= 'import' name ( 'as' name )? ';'
201-
| 'import' STRING 'as' name ';'
202-
| 'import' '{' name ( ',' name )* '}' 'from' ( name | STRING ) ';'
200+
import_statement ::= 'import' NAME ( 'as' NAME )? ';'
201+
| 'import' STRING 'as' NAME ';'
202+
| 'import' '{' NAME ( ',' NAME )* '}' 'from' ( NAME | STRING ) ';'
203203
204-
variable_declaration ::= 'let' name '=' expression
205-
| 'mut' name ( '=' expression )?
206-
| ( 'let' | 'mut' ) '[' '_' | name ( ',' '_' | name )* ']' '=' expression
207-
| ( 'let' | 'mut' ) '{' name ( ',' name )* '}' '=' expression
204+
variable_declaration ::= 'let' NAME '=' expression
205+
| 'mut' NAME ( '=' expression )?
206+
| ( 'let' | 'mut' ) '[' '_' | NAME ( ',' '_' | NAME )* ']' '=' expression
207+
| ( 'let' | 'mut' ) '{' NAME ( ',' NAME )* '}' '=' expression
208208
209-
assign_call ::= name subscript* assign_op expression
210-
| name subscript* ( '++' | '--' )
211-
| name subscript* '[' ']' '=' expression
212-
| name subscript* subscript '=' expression
213-
| name ( subscript | call )* call
209+
assign_call ::= NAME subscript* assign_op expression
210+
| NAME subscript* ( '++' | '--' )
211+
| NAME subscript* '[' ']' '=' expression
212+
| NAME subscript* subscript '=' expression
213+
| NAME ( subscript | call )* call
214214
215-
struct_declaration ::= 'struct' name '{' ( string | name ( ',' string | name )* )? '}'
215+
struct_declaration ::= 'struct' NAME '{' ( string | NAME ( ',' string | NAME )* )? '}'
216216
217-
function_declaration ::= 'fn' name '(' ( 'mut'? name ( ',' 'mut'? name )* )? ')' ( '=>' expression | block )
217+
function_declaration ::= 'fn' NAME '(' ( 'mut'? NAME ( ',' 'mut'? NAME )* )? ')' ( '=>' expression ";" | block )
218218
219-
delete_statement ::= 'del' name subscript* '[' expression ']' ';'
219+
delete_statement ::= 'del' NAME subscript* '[' expression ']' ';'
220220
221221
if_statement ::= ( 'if' | 'if!' ) '(' ( variable_declaration ';' )? expression ')'
222222
statement ( 'else' statement )?
@@ -230,7 +230,7 @@ while_statement ::= ( 'while' | 'while!' ) '(' expression ')' statement
230230
| 'do' statement ( 'while' | 'while!' ) '(' expression ')' ';'
231231
232232
for_statement ::= 'for' '(' ( variable_declaration | assign_call )? ';' expression? ';' assign_call? ')' statement
233-
| 'foreach' '(' name 'in' expression ')' statement
233+
| 'foreach' '(' NAME 'in' expression ')' statement
234234
235235
break_statement ::= ( 'break' | 'continue' ) ';'
236236
@@ -241,7 +241,7 @@ block ::= '{' stmt* '}'
241241
assign_op ::= '=' | '|=' | '^=' | '&=' | '<<=' | '>>='
242242
| '+=' | '-=' | '*=' | '/=' | '~/=' | '%='
243243
244-
subscript ::= '[' expression ']' | '.' name
244+
subscript ::= '[' expression ']' | '.' NAME
245245
246246
call ::= '(' ( expression ( ',' expression )* )? ')'
247247
@@ -283,19 +283,19 @@ literal ::= 'nil' | 'false' | 'true' | number | string
283283
284284
array_constructor ::= '[' ( expression ( ',' expression )* )? ']'
285285
286-
struct_constructor ::= '{' ( string | name ':' expression ( ',' string | name ':' expression )* )? '}'
286+
struct_constructor ::= '{' ( string | NAME ':' expression ( ',' string | NAME ':' expression )* )? '}'
287287
288-
anonymous_struct ::= 'struct' '{' ( string | name ( ',' string | name )* )? '}'
288+
anonymous_struct ::= 'struct' '{' ( string | NAME ( ',' string | NAME )* )? '}'
289289
290-
anonymous_function ::= '|' ( 'mut'? name ( ',' 'mut'? name )* )? '|' ( '=>' expression | block )
290+
anonymous_function ::= '|' ( 'mut'? NAME ( ',' 'mut'? NAME )* )? '|' ( '=>' expression | block )
291291
| '||' ( '=>' expression | block )
292292
293293
if_expression ::= ( 'if' | 'if!' ) '(' expression ')' expression 'else' expression
294294
295295
match_expression ::= 'match' '(' expression ')' '{' expression '=>' expression ( ',' expression '=>' expression )*
296296
',' '_' '=>' expression '}'
297297
298-
subscript_call ::= name ( subscript | call )* ( '{' ( expression ( ',' expression )* )? '}' )?
298+
subscript_call ::= NAME ( subscript | call )* ( '{' ( expression ( ',' expression )* )? '}' )?
299299
300300
group_expression ::= '(' expression ')'
301301
```

examples/distance.hk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct Point {
1111
x, y
1212
}
1313

14-
fn deg_to_rad(deg) => deg * PI / 180.0
14+
fn deg_to_rad(deg) => deg * PI / 180.0;
1515

1616
fn euclidean_distance(p1, p2) {
1717
let dx = abs(p1.x - p2.x);

examples/fibonacci.hk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
fn fibonacci(n) =>
66
if (n < 2) n
7-
else fibonacci(n - 1) + fibonacci(n - 2)
7+
else fibonacci(n - 1) + fibonacci(n - 2);
88

99
println(fibonacci(8));

examples/nbody.hk

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ struct Body {
1818
mass
1919
}
2020

21-
fn sun() => Body { 0, 0, 0, 0, 0, 0, SOLAR_MASS }
21+
fn sun() => Body { 0, 0, 0, 0, 0, 0, SOLAR_MASS };
2222

2323
fn jupiter() => Body {
2424
4.84143144246472090e+00,
@@ -28,7 +28,7 @@ fn jupiter() => Body {
2828
7.69901118419740425e-03 * DAYS_PER_YEAR,
2929
-6.90460016972063023e-05 * DAYS_PER_YEAR,
3030
9.54791938424326609e-04 * SOLAR_MASS
31-
}
31+
};
3232

3333
fn saturn() => Body {
3434
8.34336671824457987e+00,
@@ -38,7 +38,7 @@ fn saturn() => Body {
3838
4.99852801234917238e-03 * DAYS_PER_YEAR,
3939
2.30417297573763929e-05 * DAYS_PER_YEAR,
4040
2.85885980666130812e-04 * SOLAR_MASS
41-
}
41+
};
4242

4343
fn uranus() => Body {
4444
1.28943695621391310e+01,
@@ -48,7 +48,7 @@ fn uranus() => Body {
4848
2.37847173959480950e-03 * DAYS_PER_YEAR,
4949
-2.96589568540237556e-05 * DAYS_PER_YEAR,
5050
4.36624404335156298e-05 * SOLAR_MASS
51-
}
51+
};
5252

5353
fn neptune() => Body {
5454
1.53796971148509165e+01,
@@ -58,7 +58,7 @@ fn neptune() => Body {
5858
1.62824170038242295e-03 * DAYS_PER_YEAR,
5959
-9.51592254519715870e-05 * DAYS_PER_YEAR,
6060
5.15138902046611451e-05 * SOLAR_MASS
61-
}
61+
};
6262

6363
fn offset_momentum(mut bodies) {
6464
mut px = 0;

src/compiler.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,7 @@ static void compile_function_declaration(Compiler *comp)
10471047
{
10481048
scanner_next_token(scan);
10491049
compile_expression(&childComp);
1050+
consume(comp, TOKEN_KIND_SEMICOLON);
10501051
hk_chunk_emit_opcode(childChunk, HK_OP_RETURN);
10511052
goto end;
10521053
}
@@ -1088,6 +1089,7 @@ static void compile_function_declaration(Compiler *comp)
10881089
{
10891090
scanner_next_token(scan);
10901091
compile_expression(&childComp);
1092+
consume(comp, TOKEN_KIND_SEMICOLON);
10911093
hk_chunk_emit_opcode(childChunk, HK_OP_RETURN);
10921094
goto end;
10931095
}

tests/function_call_test.hk

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11

2-
fn f() => nil
2+
fn f() => nil;
33

4-
fn g(a) => nil
4+
fn g(a) => nil;
55

6-
fn h(a, b) => nil
6+
fn h(a, b) => nil;
77

88
f();
99
f(1);

tests/function_declaration_test.hk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ let g = |a, b| {
77
return a - b;
88
};
99

10-
fn h(a, b) => a + b
10+
fn h(a, b) => a + b;
1111

1212
let i = |a, b| => a - b;
1313

0 commit comments

Comments
 (0)