Skip to content

Commit 510a79a

Browse files
committed
More brackets expressions.
1 parent 5187dad commit 510a79a

File tree

2 files changed

+43
-6
lines changed

2 files changed

+43
-6
lines changed

src/elixir_parser.yrl

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ Nonterminals
88
decl
99
expr _expr
1010
np_call_exprs _np_call_exprs
11+
brackets_call _brackets_call
1112
np_method_call_expr _np_method_call_expr
1213
without_args_method_call_expr _without_args_method_call_expr
1314
np_erlang_call_expr
@@ -78,7 +79,7 @@ Nonterminals
7879
.
7980

8081
Terminals
81-
punctuated_identifier identifier float integer constant
82+
bracket_identifier punctuated_identifier identifier float integer constant
8283
atom interpolated_atom string interpolated_string regexp interpolated_regexp
8384
char_list interpolated_char_list
8485
div rem module object do end def eol Erlang true false
@@ -167,16 +168,21 @@ expr -> np_call_exprs : '$1'.
167168
np_call_exprs -> np_method_call_expr : '$1'.
168169
np_call_exprs -> np_erlang_call_expr : '$1'.
169170
np_call_exprs -> base_identifier : '$1'.
171+
np_call_exprs -> brackets_call : '$1'.
170172
np_call_exprs -> brackets_expr : '$1'.
171173

174+
% Brackets call
175+
brackets_call -> np_call_exprs dot_eol bracket_identifier open_bracket comma_expr close_bracket : build_bracket_call(build_method_call('$1', '$3', []), '$4', '$5').
176+
brackets_call -> bracket_identifier open_bracket comma_expr close_bracket : build_bracket_call(build_identifier('$1'), '$2', '$3').
177+
172178
% Method call
173179
np_method_call_expr -> np_call_exprs dot_eol method_name call_args_no_parens : build_method_call('$1', '$3', '$4').
174180
np_method_call_expr -> implicit_method_name call_args_no_parens : build_local_call('$1', '$2').
175181
np_method_call_expr -> without_args_method_call_expr : '$1'.
176182
without_args_method_call_expr -> np_call_exprs dot_eol method_name : build_method_call('$1', '$3', []).
177183

178-
% Brackets call
179-
brackets_expr -> call_exprs open_bracket comma_expr close_bracket : build_method_call('$1', { identifier, ?line('$2'), '[]' }, '$3').
184+
% Brackets expression
185+
brackets_expr -> call_exprs open_bracket comma_expr close_bracket : build_bracket_call('$1', '$2', '$3').
180186
brackets_expr -> call_exprs : '$1'.
181187

182188
% Calls with parens
@@ -220,16 +226,21 @@ _expr -> _np_call_exprs : '$1'.
220226
_np_call_exprs -> _np_method_call_expr : '$1'.
221227
_np_call_exprs -> np_erlang_call_expr : '$1'.
222228
_np_call_exprs -> base_identifier : '$1'.
229+
_np_call_exprs -> _brackets_call : '$1'.
223230
_np_call_exprs -> _brackets_expr : '$1'.
224231

232+
% Brackets call
233+
_brackets_call -> _np_call_exprs dot_eol bracket_identifier open_bracket comma_expr close_bracket : build_bracket_call(build_method_call('$1', '$3', []), '$4', '$5').
234+
_brackets_call -> bracket_identifier open_bracket comma_expr close_bracket : build_bracket_call(build_identifier('$1'), '$2', '$3').
235+
225236
% Method call
226237
_np_method_call_expr -> _np_call_exprs dot_eol method_name call_args_no_parens : build_method_call('$1', '$3', '$4').
227238
_np_method_call_expr -> implicit_method_name call_args_no_parens : build_local_call('$1', '$2').
228239
_np_method_call_expr -> _without_args_method_call_expr : '$1'.
229240
_without_args_method_call_expr -> _np_call_exprs dot_eol method_name : build_method_call('$1', '$3', []).
230241

231-
% Brackets call
232-
_brackets_expr -> _call_exprs open_bracket comma_expr close_bracket : build_method_call('$1', { identifier, ?line('$2'), '[]' }, '$3').
242+
% Brackets expression
243+
_brackets_expr -> _call_exprs open_bracket comma_expr close_bracket : build_bracket_call('$1', '$2', '$3').
233244
_brackets_expr -> _call_exprs : '$1'.
234245

235246
% Calls with parens
@@ -548,6 +559,11 @@ Erlang code.
548559
% The following directive is needed for (significantly) faster compilation
549560
% of the generated .erl file by the HiPE compiler. Please do not remove.
550561
% -compile([{hipe,[{regalloc,linear_scan}]}]).
562+
build_identifier(Thing) ->
563+
{ identifier, ?line(Thing), ?chars(Thing) }.
564+
565+
build_bracket_call(Expr, Bracket, Args) ->
566+
build_method_call(Expr, { identifier, ?line(Bracket), '[]' }, Args).
551567

552568
build_fun_call(Target, Args) ->
553569
{ fun_call, ?line(Target), Target, Args }.

test/elixir/list_test.ex

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,23 @@ object ListTest
6868
6969
def brackets_syntax_test
7070
2 = [1,2,3][1]
71+
2 = ([1] + [2,3])[1]
72+
7173
2 = a_list()[1]
7274
2 = self.a_list()[1]
73-
2 = ([1] + [2,3])[1]
75+
2 = a_list[1]
76+
2 = self.a_list[1]
7477
[1] = a_list [1]
78+
[1] = self.a_list [1]
79+
2 = 6 - 1 - self.a_list[1] - 1
80+
81+
2 = a_list!()[1]
82+
2 = self.a_list!()[1]
83+
2 = a_list![1]
84+
2 = self.a_list![1]
85+
[1] = a_list! [1]
86+
[1] = self.a_list! [1]
87+
2 = 6 - 1 - self.a_list![1] - 1
7588
end
7689
7790
protected
@@ -83,4 +96,12 @@ object ListTest
8396
def a_list(list)
8497
list
8598
end
99+
100+
def a_list!
101+
[1,2,3]
102+
end
103+
104+
def a_list!(list)
105+
list
106+
end
86107
end

0 commit comments

Comments
 (0)