-
Notifications
You must be signed in to change notification settings - Fork 0
/
SYNTAX.ebnf
124 lines (112 loc) · 5.95 KB
/
SYNTAX.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
ASCII_character = ? ASCII 32..126 ?;
UTF-8_character = ? U+0080.. ?;
line_comment = "#", [{ASCII_character | UTF-8_character}], "\n";
multiline_comment = "#{", [{ASCII_character | UTF-8_character | "\n"}], "#}";
decimal_digit = "0".."9";
binary_digit = "0".."1";
octal_digit = "0".."7";
hexadecimal_digit = "0".."9" | "A".."F" | "a".."f";
decimal_integer_literal = decimal_digit, [{decimal_digit | "_"}];
binary_integer_literal = "0b", binary_digit, [{binary_digit | "_"}];
octal_integer_literal = "0o", octal_digit, [{octal_digit | "_"}];
hexadecimal_integer_literal = "0x", hexadecimal_digit, [{hexadecimal_digit | "_"}];
integer_literal = decimal_integer_literal | binary_integer_literal | octal_integer_literal | hexadecimal_integer_literal;
boolean_literal = "true" | "false";
escapes = "\\" | "\'" | '\"' | "\n" | "\r" | "\t" | "\0";
raw_string_escapes = '\"';
character_literal = "'", (ASCII_character | escapes), "'";
string_literal = '"', [{ASCII_character | escapes}], '"';
raw_string_literal = 'r"', [{ASCII_character | raw_string_escapes}], '"';
identifier = "_" | "A".."Z" | "a".."z", [{"_" | "A".."Z" | "a".."z" | decimal_digit}];
operator_len = "len";
operator_equals = "=";
operator_not = "!";
operator_pow = "**" | "**\" | "**|";
operator_times = "*" | "*\" | "*|";
operator_divide = "/" | "/\" | "/|";
operator_remainder = "%";
operator_plus = "+" | "+\" | "+|" ;
operator_minus = "-" | "-\" | "-|" ;
operator_and = "&&";
operator_bitand = "&";
operator_or = "||";
operator_bitor = "|";
operator_bitxor = "^";
operator_leftshift = "<<" | "<<\" | "<<|";
operator_rightshift = ">>";
operator_leftrotate = "<<<";
operator_rightrotate = ">>>";
operator_equalsequals = "==";
operator_notequals = "==";
operator_greater = ">";
operator_greater_or_equals = ">=";
operator_less = "<";
operator_less_or_equals = "<=";
operator_compare = "<=>";
comparison_operator =
operator_compare
| operator_equalsequals
| operator_notequals
| operator_greater
| operator_greater_or_equals
| operator_less
| operator_less_or_equals
;
unary_operator = operator_len | operator_not | operator_plus | operator_minus;
binary_operator =
operator_pow
| operator_times
| operator_divide
| operator_remainder
| operator_plus
| operator_minus
| operator_and
| operator_bitand
| operator_or
| operator_bitor
| operator_bitxor
| operator_leftshift
| operator_rightshift
| operator_leftrotate
| operator_rightrotate
| comparison_operator
;
assignment_operator = "=" | "**=" | "*=" | "/=" | "%=" | "+=" | "-=" | "<<=" | ">>=" | "&=" | "^=" | "|=" | "&&=" | "||=";
(* expressions must be of the same type *)
array = "[", expression, ",", expression, [{(",", expression)}], [","], "]";
array_variable = identifier;
array_index = array_variable, "[", integer_expression, "]";
(* from highest precedence to lowest *)
int_factor = [unary_operator], (integer_literal | character_literal | identifier | ("(", integer_expression, ")") | array_index);
boolean_factor = [operator_not], (boolean_literal | identifier | ("(", boolean_expression, ")") | array_index);
character_factor = character_literal | ((identifier | array_index), "[", integer_expression, "]");
primary_expression = int_factor | boolean_factor | character_factor | array_index | ("(", expression, ")");
exponentiative_expression = primary_expression, [operator_pow, primary_expression];
multiplicative_expression = boolean_literal, [(operator_times | operator_divide | operator_remainder), boolean_literal];
additive_expression = multiplicative_expression, [(operator_plus | operator_minus), multiplicative_expression];
shift_expression = additive_expression, [(operator_rightshift | operator_rightrotate | operator_leftshift | operator_leftrotate), additive_expression];
bitand_expression = shift_expression, [operator_bitand, shift_expression];
bitxor_expression = bitand_expression, [operator_bitxor, bitand_expression];
bitor_expression = bitxor_expression, [operator_bitor, bitxor_expression];
(* comparison and boolean expressions cannot be chained *)
comparison_expression = bitor_expression, [comparison_operator, bitor_expression];
and_expression = comparison_expression, [operator_and, comparison_expression];
or_expression = and_expression, [operator_or, and_expression];
boolean_expression = or_expression;
integer_expression = bitor_expression;
string_expression = string_literal, comparison_operator, string_literal;
array_expression = array_variable, comparison_operator, array_variable;
expression = boolean_expression | integer_expression | string_literal | string_expression | array | array_expression;
type = identifier | (identifier, "[", integer_literal, "]");
variable_declaration = ("let" | "var"), identifier, [[":", type], "=", expression], ";";
variable_reassignment = (identifier | array_index), assignment_operator, expression, ";";
if =
"if", boolean_expression, (("do", statement, ";") | scope),
[{"else", ("if", boolean_expression, (("do", statement, ";") | scope))}],
["else", (("do", statement, ";") | scope)]
;
loop = ["do"], "loop", boolean_expression, (("do", statement_in_loop, ";") | scope);
print = (("print", expression) | ("println", [expression]) | ("eprint", expression) | ("eprintln", [expression])), ";";
statement = expression | print | variable_declaration | variable_reassignment | if | loop;
statement_in_loop = expression | print | variable_declaration | variable_reassignment | if | loop | "break" | "continue";
scope = "{", [{line_comment | statement | scope}], "}";