@@ -6,108 +6,104 @@ Complete Lua syntax in [extended BNF][extended bnf], adapted from it’s
66``` ebnf
77chunk = [block];
88
9- block = return_statement | statement {statement } [return_statement ];
9+ block = retstat | stat {stat } [retstat ];
1010
1111(* statements *)
12- return_statement = "return" [expression_list ] [empty_statement ];
12+ retstat = "return" [explist ] [emptstat ];
1313
14- statement = empty_statement | variable_assignment | scoped_variable_declaration | function_call
15- | label_statement | goto_statement | break_statement | do_statement | while_statement | repeat_statement
16- | if_statement | for_numeric_statement | for_generic_statement | function_definition_statement
17- | scoped_function_definition_statement;
14+ stat = emptstat | varassign | locvardecl | funccall | labstat | gotstat | brstat
15+ | dostat | whistat | repstat | ifstat | foristat | forstat | funcdefstat | locfuncdefstat;
1816
19- scoped_function_definition_statement = "local" "function" identifier function_body ;
17+ locfuncdefstat = "local" "function" name funcbody ;
2018
21- function_definition_statement = "function" function_identifier function_body ;
22- function_identifier = identifier {"." identifier } [":" identifier ];
19+ funcdefstat = "function" funcname funcbody ;
20+ funcname = name {"." name } [":" name ];
2321
24- for_generic_statement = "for" identifier_list "in" expression_list "do" [block] "end";
22+ forstat = "for" namelist "in" explist "do" [block] "end";
2523
26- for_numeric_statement = "for" identifier "=" expression "," expression ["," expression ] "do" [block] "end";
24+ foristat = "for" name "=" exp "," exp ["," exp ] "do" [block] "end";
2725
28- if_statement = "if" expression "then" [block] {"elseif" expression "then" [block]}
29- ["else" [block]] "end";
26+ ifstat = "if" exp "then" [block] {"elseif" exp "then" [block]} ["else" [block]] "end";
3027
31- repeat_statement = "repeat" [block] "until" expression ;
28+ repstat = "repeat" [block] "until" exp ;
3229
33- while_statement = "while" expression "do" [block] "end";
30+ whistat = "while" exp "do" [block] "end";
3431
35- do_statement = "do" [block] "end";
32+ dostat = "do" [block] "end";
3633
37- break_statement = "break";
34+ brstat = "break";
3835
39- goto_statement = "goto" identifier ;
40- label_statement = "::" identifier "::";
36+ gotstat = "goto" name ;
37+ labstat = "::" name "::";
4138
42- scoped_variable_declaration = "local" scoped_variable_list ["=" expression_list ];
43- scoped_variable_list = scoped_variable {',' scoped_variable };
44- scoped_variable = identifier [attribute ];
45- attribute = '<' identifier '>';
39+ locvardecl = "local" locvarlist ["=" explist ];
40+ locvarlist = locvar {',' locvar };
41+ locvar = name [attr ];
42+ attr = '<' name '>';
4643
47- variable_assignment = variable_list "=" expression_list ;
48- variable_list = variable {"," variable };
44+ varassign = varlist "=" explist ;
45+ varlist = var {"," var };
4946
50- empty_statement = ";";
47+ emptstat = ";";
5148
5249(* expressions *)
53- expression = "nil" | "false" | "true" | number | string | vararg_expression | function_definition
54- | prefix_expression | table | unary_expression | binary_expression ;
50+ exp = "nil" | "false" | "true" | num | str | varargexp | funcdef | prefixexp | table
51+ | unexp | binexp ;
5552
56- prefix_expression = variable | function_call | "(" expression ")";
57- variable = identifier | prefix_expression "[" expression "]" | prefix_expression "." identifier ;
58- function_call = prefix_expression [":" identifier] argument_list ;
59- argument_list = "(" [expression_list ] ")" | table | string ;
60- expression_list = expression {"," expression };
53+ prefixexp = var | funccall | "(" exp ")";
54+ var = name | prefixexp "[" exp "]" | prefixexp "." name ;
55+ funccall = prefixexp [":" name] arglist ;
56+ arglist = "(" [explist ] ")" | table | str ;
57+ explist = exp {"," exp };
6158
62- function_definition = "function" function_body ;
63- function_body = "(" [parameter_list ] ")" [block] "end";
64- parameter_list = identifier_list ["," vararg_expression ] | vararg_expression ;
65- identifier_list = identifier {"," identifier };
59+ funcdef = "function" funcbody ;
60+ funcbody = "(" [parlist ] ")" [block] "end";
61+ parlist = namelist ["," varargexp ] | varargexp ;
62+ namelist = name {"," name };
6663
67- vararg_expression = "...";
64+ varargexp = "...";
6865
69- table = "{" [field_list ] "}";
70- field_list = field {field_separator field} [field_separator ];
71- field = "[" expression "]" "=" expression | identifier "=" expression | expression ;
72- field_separator = "," | ";";
66+ table = "{" [fieldlist ] "}";
67+ fieldlist = field {fieldsep field} [fieldsep ];
68+ field = "[" exp "]" "=" exp | name "=" exp | exp ;
69+ fieldsep = "," | ";";
7370
74- binary_expression = expression binary_operator expression ;
75- binary_operator = "or" | "and" | "==" | "~=" | "<" | ">" | "<=" | ">=" | "|"
76- | "~" | "&" | "<<" | ">>" | " .." | "+" | "-" | "*" | "/" | "//" | "%" | "^";
71+ binexp = exp binop exp ;
72+ binop = "or" | "and" | "==" | "~=" | "<" | ">" | "<=" | ">=" | "|" | "~" | "&" | "<<" | ">> "
73+ | ".." | "+" | "-" | "*" | "/" | "//" | "%" | "^";
7774
78- unary_expression = unary_operator expression ;
79- unary_operator = "not" | "#" | "-" | "~";
75+ unexp = unop exp ;
76+ unop = "not" | "#" | "-" | "~";
8077
81- string = "'" {, inline_character - "'"}, "'" | '"' {, inline_character - '"'}, '"'
82- | multiline_start {, character}, multiline_end;
83- inline_character = ? any character except a newline ?;
84- character = ? any character ?;
78+ str = "'" {, inchar - "'"}, "'" | '"' {, inchar - '"'}, '"' | multstart {, char}, multend;
79+ inchar = ? any char except a newline ?;
80+ char = ? any char ?;
8581
86- number = decimal | hexadecimal ;
82+ num = dec | hex ;
8783
88- hexadecimal = ["-"] ("0x" | "0X"), hexadecimal_numeral [, ("p" | "P"), exponent];
89- hexadecimal_numeral = hexadecimal_digit {, hexadecimal_digit }
90- | hexadecimal_digit {, hexadecimal_digit }, "." {, hexadecimal_digit }
91- | {hexadecimal_digit ,} ".", hexadecimal_digit {, hexadecimal_digit };
92- hexadecimal_digit = ? hexadecimal numeric character ?;
84+ hex = ["-"] ("0x" | "0X"), hexnum [, ("p" | "P"), exponent];
85+ hexnum = hexdigit {, hexdigit }
86+ | hexdigit {, hexdigit }, "." {, hexdigit }
87+ | {hexdigit ,} ".", hexdigit {, hexdigit };
88+ hexdigit = ? hex numeric char ?;
9389
94- decimal = ["-"] decimal_numeral [, ("e" | "E"), exponent];
95- decimal_numeral = decimal_digit {, decimal_digit }
96- | decimal_digit {, decimal_digit }, "." {, decimal_digit }
97- | {decimal_digit ,} ".", decimal_digit {, decimal_digit };
98- decimal_digit = ? decimal numeric character ?;
90+ dec = ["-"] decnum [, ("e" | "E"), exponent];
91+ decnum = decdigit {, decdigit }
92+ | decdigit {, decdigit }, "." {, decdigit }
93+ | {decdigit ,} ".", decdigit {, decdigit };
94+ decdigit = ? dec numeric char ?;
9995
100- exponent = [("+" | "-") ,] decimal_digit {, decimal_digit };
96+ exponent = [("+" | "-") ,] decdigit {, decdigit };
10197
102- identifier = (letter | "_") {, letter | decimal_digit | "_"};
103- letter = ? case insensitive alphabetic character ?;
98+ name = (letter | "_") {, letter | decdigit | "_"};
99+ letter = ? case insensitive alphabetic char ?;
104100
105101(* extras *)
106- comment = "--" {, inline_character } | "--", multiline_start {, character }, multiline_end ;
102+ comment = "--" {, inchar } | "--", multstart {, char }, multend ;
107103
108- (* "start" and "end" must have the same number of equal signs ("=") *)
109- multiline_start = "[" {, "="}, "[";
110- multiline_end = "]" {, "="}, "]";
104+ (* "start" and "end" must have the same num of equal signs ("=") *)
105+ multstart = "[" {, "="}, "[";
106+ multend = "]" {, "="}, "]";
111107```
112108
113109[ extended bnf ] : https://en.wikipedia.org/wiki/Extended_Backus%E2%80%93Naur_form
0 commit comments