@@ -11,20 +11,22 @@ block = return_statement | statement {statement} [return_statement];
11
11
(* statements *)
12
12
return_statement = "return" [expression_list] [empty_statement];
13
13
14
- statement = do_statement | if_statement | for_numeric_statement
15
- | for_generic_statement | while_statement | repeat_statement | break_statement
16
- | label_statement | goto_statement | variable_assignment
17
- | scoped_variable_declaration | function_declaration | scoped_function_declaration
18
- | function_call | empty_statement;
14
+ statement = do_statement | if_statement | for_numeric_statement | for_generic_statement
15
+ | while_statement | repeat_statement | break_statement | label_statement | goto_statement
16
+ | variable_assignment | scoped_variable_declaration | function_definition_statement
17
+ | scoped_function_definition_statement | function_call | empty_statement;
19
18
20
19
empty_statement = ";";
21
20
22
- scoped_function_declaration = "local" "function" identifier function_body;
21
+ scoped_function_definition_statement = "local" "function" identifier function_body;
23
22
24
- function_declaration = "function" function_identifier function_body;
23
+ function_definition_statement = "function" function_identifier function_body;
25
24
function_identifier = identifier {"." identifier} [":" identifier];
26
25
27
- scoped_variable_declaration = "local" identifier_list ["=" expression_list];
26
+ scoped_variable_declaration = "local" scoped_variable_list ["=" expression_list];
27
+ scoped_variable_list = scoped_variable {',' scoped_variable};
28
+ scoped_variable = identifier [attribute];
29
+ attribute = '<' identifier '>';
28
30
29
31
variable_assignment = variable_list "=" expression_list;
30
32
variable_list = variable {"," variable};
@@ -35,24 +37,20 @@ label_statement = "::" identifier "::";
35
37
break_statement = "break";
36
38
repeat_statement = "repeat" [block] "until" expression;
37
39
while_statement = "while" expression "do" [block] "end";
38
- for_generic_statement = "for" identifier_list "in" expression_list
39
- "do" [block] "end";
40
- for_numeric_statement = "for" identifier "=" expression "," expression ["," expression]
41
- "do" [block] "end";
40
+ for_generic_statement = "for" identifier_list "in" expression_list "do" [block] "end";
41
+ for_numeric_statement = "for" identifier "=" expression "," expression ["," expression] "do" [block] "end";
42
42
43
43
if_statement = "if" expression "then" [block] {"elseif" expression "then" [block]}
44
44
["else" [block]] "end";
45
45
46
46
do_statement = "do" [block] "end";
47
47
48
48
(* expressions *)
49
- expression = nil | boolean | number | string | unary_expression
50
- | binary_expression | table | vararg_expression | function_definition
51
- | prefix_expression;
49
+ expression = nil | boolean | number | string | unary_expression | binary_expression
50
+ | table | vararg_expression | function_definition | prefix_expression;
52
51
53
52
prefix_expression = variable | function_call | "(" expression ")";
54
- variable = identifier | prefix_expression "." identifier
55
- | prefix_expression "[" expression "]";
53
+ variable = identifier | prefix_expression "." identifier | prefix_expression "[" expression "]";
56
54
function_call = prefix_expression [":" identifier] argument_list;
57
55
argument_list = string | table | "(" [expression_list] ")";
58
56
expression_list = expression {"," expression};
@@ -76,8 +74,7 @@ binary_operator = "or" | "and" | "==" | "~=" | "<" | ">" | "<=" | ">=" | "|"
76
74
unary_expression = unary_operator expression;
77
75
unary_operator = "not" | "#" | "-" | "~";
78
76
79
- string = "'" {, inline_character - "'"}, "'"
80
- | '"' {, inline_character - '"'}, '"'
77
+ string = "'" {, inline_character - "'"}, "'" | '"' {, inline_character - '"'}, '"'
81
78
| multiline_start {, character}, multiline_end;
82
79
inline_character = ? any character except a newline ?;
83
80
character = ? any character ?;
@@ -106,13 +103,12 @@ identifier = (letter | "_") {, letter | decimal_digit | "_"};
106
103
letter = ? case insensitive alphabetic character ?;
107
104
108
105
(* extras *)
109
- comment = "--" {, inline_character}
110
- | "--", multiline_start {, character}, multiline_end;
106
+ comment = "--" {, inline_character} | "--", multiline_start {, character}, multiline_end;
111
107
112
108
(* "start" and "end" must have the same number of equal signs ("=") *)
113
109
multiline_start = "[" {, "="}, "[";
114
110
multiline_end = "]" {, "="}, "]";
115
111
```
116
112
117
113
[ extended bnf ] : https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
118
- [ lua manual ] : http://www.lua.org/manual/5.3 /manual.html#9
114
+ [ lua manual ] : http://www.lua.org/manual/5.4 /manual.html#9
0 commit comments