Skip to content

Commit e759a18

Browse files
committed
Add function definition
1 parent c1f7b15 commit e759a18

File tree

4 files changed

+30044
-26710
lines changed

4 files changed

+30044
-26710
lines changed

corpus/functions.txt

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
============================================
2+
Function definitions
3+
============================================
4+
5+
f = function() return false end
6+
7+
a.b.f = function() return true end
8+
9+
local f
10+
f = function() return 'some string' end
11+
12+
a.b.f = function(self, test, ...) return 10 end
13+
14+
---
15+
16+
(lua
17+
(variable_declaration (variable_declarator (identifier))
18+
(function_definition (parameters)
19+
(return_statement (false))))
20+
21+
(variable_declaration (variable_declarator (identifier) (property_identifier) (property_identifier))
22+
(function_definition (parameters)
23+
(return_statement (true))))
24+
25+
(local_variable_declaration (variable_declarator (identifier)))
26+
27+
(variable_declaration (variable_declarator (identifier))
28+
(function_definition (parameters)
29+
(return_statement (string))))
30+
31+
(variable_declaration (variable_declarator (identifier) (property_identifier) (property_identifier))
32+
(function_definition (parameters (self) (identifier) (spread))
33+
(return_statement (number)))))

grammar.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,11 +190,34 @@ module.exports = grammar({
190190

191191
_empty_statement: $ => ';',
192192

193+
// Functions
194+
parameters: $ => seq(
195+
'(',
196+
optional(choice(
197+
seq(
198+
optional(seq($.self, optional(','))),
199+
sequence($.identifier),
200+
optional(seq(',', $.spread))
201+
),
202+
seq($.spread)
203+
)),
204+
')'
205+
),
206+
207+
_function_body: $ => seq(
208+
$.parameters,
209+
repeat($._statement),
210+
optional($.return_statement),
211+
'end'
212+
),
213+
193214
// Expressions
194215
_expression: $ => choice(
195216
$.spread,
196217
$._prefix,
197218

219+
$.function_definition,
220+
198221
$.table,
199222

200223
$.binary_operation,
@@ -220,6 +243,12 @@ module.exports = grammar({
220243
seq('(', $._expression, ')')
221244
),
222245

246+
// Definitions
247+
function_definition: $ => seq(
248+
'function',
249+
$._function_body
250+
),
251+
223252
// Tables
224253
table: $ => seq(
225254
'{',

src/grammar.json

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,153 @@
814814
"type": "STRING",
815815
"value": ";"
816816
},
817+
"parameters": {
818+
"type": "SEQ",
819+
"members": [
820+
{
821+
"type": "STRING",
822+
"value": "("
823+
},
824+
{
825+
"type": "CHOICE",
826+
"members": [
827+
{
828+
"type": "CHOICE",
829+
"members": [
830+
{
831+
"type": "SEQ",
832+
"members": [
833+
{
834+
"type": "CHOICE",
835+
"members": [
836+
{
837+
"type": "SEQ",
838+
"members": [
839+
{
840+
"type": "SYMBOL",
841+
"name": "self"
842+
},
843+
{
844+
"type": "CHOICE",
845+
"members": [
846+
{
847+
"type": "STRING",
848+
"value": ","
849+
},
850+
{
851+
"type": "BLANK"
852+
}
853+
]
854+
}
855+
]
856+
},
857+
{
858+
"type": "BLANK"
859+
}
860+
]
861+
},
862+
{
863+
"type": "SEQ",
864+
"members": [
865+
{
866+
"type": "SYMBOL",
867+
"name": "identifier"
868+
},
869+
{
870+
"type": "REPEAT",
871+
"content": {
872+
"type": "SEQ",
873+
"members": [
874+
{
875+
"type": "STRING",
876+
"value": ","
877+
},
878+
{
879+
"type": "SYMBOL",
880+
"name": "identifier"
881+
}
882+
]
883+
}
884+
}
885+
]
886+
},
887+
{
888+
"type": "CHOICE",
889+
"members": [
890+
{
891+
"type": "SEQ",
892+
"members": [
893+
{
894+
"type": "STRING",
895+
"value": ","
896+
},
897+
{
898+
"type": "SYMBOL",
899+
"name": "spread"
900+
}
901+
]
902+
},
903+
{
904+
"type": "BLANK"
905+
}
906+
]
907+
}
908+
]
909+
},
910+
{
911+
"type": "SEQ",
912+
"members": [
913+
{
914+
"type": "SYMBOL",
915+
"name": "spread"
916+
}
917+
]
918+
}
919+
]
920+
},
921+
{
922+
"type": "BLANK"
923+
}
924+
]
925+
},
926+
{
927+
"type": "STRING",
928+
"value": ")"
929+
}
930+
]
931+
},
932+
"_function_body": {
933+
"type": "SEQ",
934+
"members": [
935+
{
936+
"type": "SYMBOL",
937+
"name": "parameters"
938+
},
939+
{
940+
"type": "REPEAT",
941+
"content": {
942+
"type": "SYMBOL",
943+
"name": "_statement"
944+
}
945+
},
946+
{
947+
"type": "CHOICE",
948+
"members": [
949+
{
950+
"type": "SYMBOL",
951+
"name": "return_statement"
952+
},
953+
{
954+
"type": "BLANK"
955+
}
956+
]
957+
},
958+
{
959+
"type": "STRING",
960+
"value": "end"
961+
}
962+
]
963+
},
817964
"_expression": {
818965
"type": "CHOICE",
819966
"members": [
@@ -825,6 +972,10 @@
825972
"type": "SYMBOL",
826973
"name": "_prefix"
827974
},
975+
{
976+
"type": "SYMBOL",
977+
"name": "function_definition"
978+
},
828979
{
829980
"type": "SYMBOL",
830981
"name": "table"
@@ -909,6 +1060,19 @@
9091060
}
9101061
]
9111062
},
1063+
"function_definition": {
1064+
"type": "SEQ",
1065+
"members": [
1066+
{
1067+
"type": "STRING",
1068+
"value": "function"
1069+
},
1070+
{
1071+
"type": "SYMBOL",
1072+
"name": "_function_body"
1073+
}
1074+
]
1075+
},
9121076
"table": {
9131077
"type": "SEQ",
9141078
"members": [

0 commit comments

Comments
 (0)