forked from mingodad/plgh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtree-sitter-lua.ebnf
103 lines (54 loc) · 5.52 KB
/
tree-sitter-lua.ebnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*
Grammar originally from https://github.com/Azganoth/tree-sitter-lua
Converted by excuting:
qjs json2ebnf.js
Then manualy fixing the problems reported by https://www.bottlecaps.de/rr/ui in a way to allow visualization (correctnes is not the priority now)
*/
program ::= ( ( _statement )* ( return_statement )? )
return_statement ::= ( 'return' ( ( _expression ( ( ',' _expression ) )* ) )? ( _empty_statement )? )
_statement ::= ( ( _expression ) | variable_declaration | local_variable_declaration | do_statement | if_statement | while_statement | repeat_statement | for_statement | for_in_statement | goto_statement | break_statement | label_statement | _empty_statement | ( function_statement ) | ( local_function_statement ) | ( function_call_statement ) )
variable_declaration ::= ( ( ( _variable_declarator ) ( ( ',' ( _variable_declarator ) ) )* ) '=' ( _expression ( ( ',' _expression ) )* ) )
local_variable_declaration ::= ( 'local' ( _local_variable_declarator ) ( ( '=' ( _expression ( ( ',' _expression ) )* ) ) )? )
_variable_declarator ::= ( identifier | ( _prefix '[' _expression ']' ) | field_expression )
field_expression ::= ( _prefix '.' ( identifier ) )
_local_variable_declarator ::= ( identifier ( ( ',' identifier ) )* )
do_statement ::= ( 'do' ( _statement )* ( return_statement )? 'end' )
if_statement ::= ( 'if' ( _expression ) 'then' ( _statement )* ( return_statement )? ( elseif )* ( else )? 'end' )
elseif ::= ( 'elseif' ( _expression ) 'then' ( _statement )* ( return_statement )? )
else ::= ( 'else' ( _statement )* ( return_statement )? )
while_statement ::= ( 'while' ( _expression ) 'do' ( _statement )* ( return_statement )? 'end' )
repeat_statement ::= ( 'repeat' ( _statement )* ( return_statement )? 'until' ( _expression ) )
for_statement ::= ( 'for' ( _loop_expression ) 'do' ( _statement )* ( return_statement )? 'end' )
for_in_statement ::= ( 'for' ( _in_loop_expression ) 'do' ( _statement )* ( return_statement )? 'end' )
_loop_expression ::= ( identifier '=' _expression ',' _expression ( ( ',' _expression ) )? )
_in_loop_expression ::= ( ( identifier ( ( ',' identifier ) )* ) 'in' ( _expression ( ( ',' _expression ) )* ) )
goto_statement ::= ( 'goto' identifier )
break_statement ::= 'break'
label_statement ::= ( '::' identifier '::' )
_empty_statement ::= ';'
function_statement ::= ( 'function' function_name _function_body )
local_function_statement ::= ( 'local' 'function' identifier _function_body )
function_call_statement ::= ( ( ( _prefix arguments ) | ( _prefix ':' ( identifier ) arguments ) ) )
arguments ::= ( ( '(' ( ( _expression ( ( ',' _expression ) )* ) )? ')' ) | table | string )
function_name ::= ( ( identifier | function_name_field ) ( ( ':' ( identifier ) ) )? )
function_name_field ::= ( ( identifier ) ( ( '.' ( identifier ) ) )* )
parameters ::= ( '(' ( ( ( self | spread | identifier ) ( ( ',' identifier ) )* ( ( ',' spread ) )? ) )? ')' )
_function_body ::= ( parameters ( _statement )* ( return_statement )? 'end' )
_expression ::= ( spread | _prefix | next | function_definition | table | binary_operation | unary_operation | string | number | nil | true | false | identifier )
spread ::= '...'
self ::= 'self'
next ::= 'next'
global_variable ::= ( '_G' | '_VERSION' )
_prefix ::= ( self | global_variable | _variable_declarator | ( ( function_call_statement ) ) | ( '(' _expression ')' ) )
function_definition ::= ( 'function' _function_body )
table ::= ( '{' ( _field_sequence )? '}' )
field ::= ( ( '[' _expression ']' '=' _expression ) | ( identifier '=' _expression ) | _expression )
_field_sequence ::= ( ( field ( ( _field_sep field ) )* ( _field_sep )? ) )
_field_sep ::= ( ',' | ';' )
binary_operation ::= ( ( ( _expression 'or' _expression ) ) | ( ( _expression 'and' _expression ) ) | ( ( _expression '<' _expression ) ) | ( ( _expression '<=' _expression ) ) | ( ( _expression '==' _expression ) ) | ( ( _expression '~=' _expression ) ) | ( ( _expression '>=' _expression ) ) | ( ( _expression '>' _expression ) ) | ( ( _expression '|' _expression ) ) | ( ( _expression '~' _expression ) ) | ( ( _expression '&' _expression ) ) | ( ( _expression '<<' _expression ) ) | ( ( _expression '>>' _expression ) ) | ( ( _expression '+' _expression ) ) | ( ( _expression '-' _expression ) ) | ( ( _expression '*' _expression ) ) | ( ( _expression '/' _expression ) ) | ( ( _expression '//' _expression ) ) | ( ( _expression '%' _expression ) ) | ( ( _expression '..' _expression ) ) | ( ( _expression '^' _expression ) ) )
unary_operation ::= ( ( ( 'not' | '#' | '-' | '~' ) _expression ) )
number ::= ( ( ( ( ( '0' | ( ( '0' )? [1-9] ( [0-9]+ )? ) ) '.' ( [0-9]+ )? ( ( ( 'e' | 'E' ) ( ( ( '-' | '+' ) )? [0-9]+ ) ) )? ) | ( '.' [0-9]+ ( ( ( 'e' | 'E' ) ( ( ( '-' | '+' ) )? [0-9]+ ) ) )? ) | ( ( '0' | ( ( '0' )? [1-9] ( [0-9]+ )? ) ) ( ( ( 'e' | 'E' ) ( ( ( '-' | '+' ) )? [0-9]+ ) ) )? ) ) | ( ( '0x' | '0X' ) [a-fA-F0-9]+ ( ( '.' [a-fA-F0-9]+ ) )? ( ( ( 'p' | 'P' ) ( ( ( '-' | '+' ) )? [0-9]+ ) ) )? ) ) )
nil ::= 'nil'
true ::= 'true'
false ::= 'false'
identifier ::= [a-zA-Z_][a-zA-Z0-9_]*