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
125
126
127
128
|
_(expr_noblock): _(expr_assign);
_(expr_assign)
: _(expr_0)
| _(expr_0) assign_op _(expr_assign)
;
_(expr_0): _(expr_range);
_(expr_range)
: _(expr_range_n)
| _(expr_range_n) DOUBLEDOT
| _(expr_range_n) DOUBLEDOT _(expr_range_n)
| DOUBLEDOT _(expr_range_n)
| DOUBLEDOT
;
_(expr_range_n): _(expr_bor);
_(expr_bor)
: _(expr_band)
| _(expr_bor) DOUBLEPIPE _(expr_band) { }
;
_(expr_band)
: _(expr_equ)
| _(expr_band) DOUBLEAMP _(expr_equ) { }
;
_(expr_equ)
: _(expr_cmp)
| _(expr_equ) DOUBLEEQUAL _(expr_cmp)
| _(expr_equ) EXCLAMEQUAL _(expr_cmp)
;
_(expr_cmp)
: _(expr_cmp_n)
| _(expr_cmp) '<' _(expr_cmp_n) {}
| _(expr_cmp) '>' _(expr_cmp_n) {}
| _(expr_cmp) GTEQUAL _(expr_cmp_n) {}
| _(expr_cmp) LTEQUAL _(expr_cmp_n) {}
;
_(expr_cmp_n): _(expr_or);
_(expr_or)
: _(expr_and)
| _(expr_or) '|' _(expr_and) { }
;
_(expr_and)
: _(expr_xor)
| _(expr_and) '&' _(expr_xor) { }
;
_(expr_xor)
: _(expr_8)
| _(expr_xor) '^' _(expr_8) { }
;
_(expr_8)
: _(expr_9)
| _(expr_8) DOUBLELT _(expr_9) {}
| _(expr_8) DOUBLEGT _(expr_9) {}
;
_(expr_9)
: _(expr_10)
| _(expr_9) '+' _(expr_10) {}
| _(expr_9) '-' _(expr_10) {}
;
/* 10: Times/Div/Modulo */
_(expr_10)
: _(expr_10n)
| _(expr_10) '*' _(expr_10n) {}
| _(expr_10) '/' _(expr_10n) {}
| _(expr_10) '%' _(expr_10n) {}
;
_(expr_10n): _(expr_cast);
/* 11: Cast */
_(expr_cast)
: _(expr_12)
| _(expr_cast) RWD_as type_ele { bnf_trace(context, "expr:cast"); }
;
_(expr_12)
: _(expr_fc)
| '-' _(expr_12)
| '!' _(expr_12)
| '*' _(expr_12)
/* | RWD_box expr_12 */
| '&' _(expr_12)
| '&' block /*HACK*/
| '&' RWD_mut _(expr_12)
| DOUBLEAMP _(expr_12) { }
| DOUBLEAMP RWD_mut _(expr_12) { }
| RWD_box _(expr)
;
_(expr_fc)
: _(expr_value)
| _(expr_fc) '(' expr_list ')'
| _(expr_fc) '[' expr ']'
| _(expr_fc) '.' INTEGER
| _(expr_fc) '.' expr_path_seg '(' expr_list ')'
| _(expr_fc) '.' expr_path_seg
_(expr_value)
: CHARLIT | INTEGER | FLOAT | STRING
| expr_blocks
| expr_path '(' expr_list opt_comma ')' { bnf_trace(context, "function call"); }
#ifndef SUFFIX_is__NOSTRLIT
| expr_path '{' struct_literal_list '}' { bnf_trace(context, "struct literal"); }
| expr_path '{' struct_literal_list ',' '}' { bnf_trace(context, "struct literal"); }
| expr_path '{' struct_literal_list ',' DOUBLEDOT expr_0 '}' { bnf_trace(context, "struct literal (with default)"); }
#endif
| expr_path
| RWD_self
| '(' expr ')'
#ifndef SUFFIX_is__NOBRACE
//| block
#endif
| '(' ')'
| '(' expr ',' expr_list ')'
| '[' ']'
| '[' expr ']'
| '[' expr ',' ']'
| '[' expr ',' expr_list_p opt_comma ']'
| '[' expr ';' expr ']'
| MACRO tt_paren { bnf_trace(context, "Expr macro invocation"); }
| MACRO tt_square { bnf_trace(context, "Expr macro invocation"); }
| _(closure)
| RWD_move _(closure)
;
_(closure)
: '|' closure_arg_list '|' closure_ret expr
| DOUBLEPIPE closure_ret expr
;
|