Skip to content

Commit de49179

Browse files
committed
More work on bracket method in Erlang calls.
1 parent 510a79a commit de49179

File tree

3 files changed

+17
-9
lines changed

3 files changed

+17
-9
lines changed

README.md

-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ The tests are organized in two directories: `test/erlang` and `test/elixir`. The
1414

1515
* Add exceptions
1616
* Add load paths
17-
* Add [] as method
1817
* Add interactive elixir (iex)
1918
* Implement missing types and improve STDLIB
2019
* Add generators/list comprehensions

src/elixir_parser.yrl

+16-8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ Nonterminals
2929
call_args_optional
3030
tuple
3131
list
32+
list_args
3233
bin_base_expr
3334
bin_specifier
3435
bin_specifier_list
@@ -172,8 +173,8 @@ np_call_exprs -> brackets_call : '$1'.
172173
np_call_exprs -> brackets_expr : '$1'.
173174

174175
% 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').
176+
brackets_call -> np_call_exprs dot_eol bracket_identifier list_args : build_bracket_call(build_method_call('$1', '$3', []), '$4').
177+
brackets_call -> bracket_identifier list_args : build_bracket_call(build_identifier('$1'), '$2').
177178

178179
% Method call
179180
np_method_call_expr -> np_call_exprs dot_eol method_name call_args_no_parens : build_method_call('$1', '$3', '$4').
@@ -182,7 +183,7 @@ np_method_call_expr -> without_args_method_call_expr : '$1'.
182183
without_args_method_call_expr -> np_call_exprs dot_eol method_name : build_method_call('$1', '$3', []).
183184

184185
% Brackets expression
185-
brackets_expr -> call_exprs open_bracket comma_expr close_bracket : build_bracket_call('$1', '$2', '$3').
186+
brackets_expr -> call_exprs list_args : build_bracket_call('$1', '$2').
186187
brackets_expr -> call_exprs : '$1'.
187188

188189
% Calls with parens
@@ -230,8 +231,8 @@ _np_call_exprs -> _brackets_call : '$1'.
230231
_np_call_exprs -> _brackets_expr : '$1'.
231232

232233
% 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').
234+
_brackets_call -> _np_call_exprs dot_eol bracket_identifier list_args : build_bracket_call(build_method_call('$1', '$3', []), '$4').
235+
_brackets_call -> bracket_identifier list_args : build_bracket_call(build_identifier('$1'), '$2').
235236

236237
% Method call
237238
_np_method_call_expr -> _np_call_exprs dot_eol method_name call_args_no_parens : build_method_call('$1', '$3', '$4').
@@ -240,7 +241,7 @@ _np_method_call_expr -> _without_args_method_call_expr : '$1'.
240241
_without_args_method_call_expr -> _np_call_exprs dot_eol method_name : build_method_call('$1', '$3', []).
241242

242243
% Brackets expression
243-
_brackets_expr -> _call_exprs open_bracket comma_expr close_bracket : build_bracket_call('$1', '$2', '$3').
244+
_brackets_expr -> _call_exprs list_args : build_bracket_call('$1', '$2').
244245
_brackets_expr -> _call_exprs : '$1'.
245246

246247
% Calls with parens
@@ -303,6 +304,8 @@ list -> open_bracket ']' : build_list(?line('$1'), []).
303304
list -> open_bracket comma_expr close_bracket : build_list(?line('$1'), '$2').
304305
list -> open_bracket comma_expr '|' expr close_bracket : build_list(?line('$1'), '$2', '$4').
305306

307+
list_args -> open_bracket comma_expr close_bracket : { ?line('$1'), '$2' }.
308+
306309
% Binaries declaration.
307310
bin_base_expr -> expr : build_bin_element('$1', default, default).
308311
bin_base_expr -> expr ':' integer : build_bin_element('$1', '$3', default).
@@ -437,6 +440,11 @@ np_erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier : build_er
437440
np_erlang_call_expr -> Erlang '.' base_identifier call_args_no_parens : build_erlang_call('$1', erlang, ?chars('$3'), '$4').
438441
np_erlang_call_expr -> Erlang '.' base_identifier : build_erlang_call('$1', erlang, ?chars('$3'), []).
439442

443+
% Erlang bracket calls
444+
np_erlang_call_expr -> Erlang '.' base_identifier '.' bracket_identifier list_args : build_bracket_call(build_erlang_call('$1', ?chars('$3'), ?chars('$5'), []), '$6').
445+
np_erlang_call_expr -> Erlang '.' bracket_identifier list_args : build_bracket_call(build_erlang_call('$1', erlang, ?chars('$3'), []), '$4').
446+
447+
% Erlang calls with explicit parens
440448
erlang_call_expr -> Erlang '.' base_identifier '.' base_identifier call_args_parens : build_erlang_call('$1', ?chars('$3'), ?chars('$5'), '$6').
441449
erlang_call_expr -> Erlang '.' base_identifier call_args_parens : build_erlang_call('$1', erlang, ?chars('$3'), '$4').
442450

@@ -562,8 +570,8 @@ Erlang code.
562570
build_identifier(Thing) ->
563571
{ identifier, ?line(Thing), ?chars(Thing) }.
564572

565-
build_bracket_call(Expr, Bracket, Args) ->
566-
build_method_call(Expr, { identifier, ?line(Bracket), '[]' }, Args).
573+
build_bracket_call(Expr, Args) ->
574+
build_method_call(Expr, { identifier, element(1, Args), '[]' }, element(2, Args)).
567575

568576
build_fun_call(Target, Args) ->
569577
{ fun_call, ?line(Target), Target, Args }.

test/elixir/list_test.ex

+1
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ object ListTest
6868
6969
def brackets_syntax_test
7070
2 = [1,2,3][1]
71+
2 = [1,2,3] [1]
7172
2 = ([1] + [2,3])[1]
7273
7374
2 = a_list()[1]

0 commit comments

Comments
 (0)