Skip to content

Commit 9faf653

Browse files
committed
fix: unary operator
1 parent 476a894 commit 9faf653

File tree

2 files changed

+538
-6
lines changed

2 files changed

+538
-6
lines changed

lib/spitfire.ex

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,8 @@ defmodule Spitfire do
234234
[:"," | terminals]
235235
end
236236

237-
while peek_token(parser) not in terminals && calc_prec.(parser) <- {left, parser} do
237+
while parser.last_parsed not in [:unary_op, :at_op] && peek_token(parser) not in terminals && calc_prec.(parser) <-
238+
{left, parser} do
238239
infix =
239240
case peek_token_type(parser) do
240241
:match_op -> &parse_infix_expression/2
@@ -297,9 +298,12 @@ defmodule Spitfire do
297298
defp parse_prefix_expression(parser) do
298299
token = current_token(parser)
299300
precedence = current_precedence(parser)
301+
parser = Map.put(parser, :last_parsed, current_token_type(parser))
300302
parser = next_token(parser)
301303
{rhs, parser} = parse_expression(parser, precedence: precedence)
302304

305+
parser = Map.put(parser, :last_parsed, nil)
306+
303307
ast = {token, [], [rhs]}
304308

305309
{ast, eat_eol(parser)}
@@ -405,7 +409,7 @@ defmodule Spitfire do
405409
end,
406410
fn
407411
{node, meta, args}, acc when is_list(args) ->
408-
args = List.delete(args, [:__remove_me__])
412+
args = Enum.reject(args, &(is_list(&1) && Enum.member?(&1, :__remove_me__)))
409413
{{node, meta, args}, acc}
410414

411415
node, acc ->
@@ -421,12 +425,20 @@ defmodule Spitfire do
421425
end
422426

423427
ast =
424-
[{token, [depth: parser.stab_depth], [List.wrap(lhs), rhs]}] ++ stabs
428+
[{token, [depth: parser.stab_depth], [wrap(lhs), rhs]}] ++ Enum.reverse(stabs)
425429

426430
{ast, eat_eol(parser)}
427431
end
428432
end
429433

434+
defp wrap(nil) do
435+
[nil]
436+
end
437+
438+
defp wrap(other) do
439+
List.wrap(other)
440+
end
441+
430442
defp parse_comma(parser, lhs) do
431443
parser = parser |> next_token() |> eat_eol()
432444
{exprs, parser} = parse_comma_list(parser)
@@ -621,7 +633,8 @@ defmodule Spitfire do
621633
current_token: nil,
622634
peek_token: nil,
623635
nestings: [],
624-
stab_depth: 0
636+
stab_depth: 0,
637+
last_parsed: nil
625638
}
626639

627640
{ast, _parser} = parse_expression(parser |> next_token() |> next_token())
@@ -715,6 +728,8 @@ defmodule Spitfire do
715728
:or,
716729
:**,
717730
:range_op,
731+
:rel_op,
732+
:and_op,
718733
:mult_op,
719734
:arrow_op,
720735
:assoc_op,
@@ -778,7 +793,8 @@ defmodule Spitfire do
778793
current_token: nil,
779794
peek_token: nil,
780795
nestings: [],
781-
stab_depth: 0
796+
stab_depth: 0,
797+
last_parsed: nil
782798
}
783799
end
784800

0 commit comments

Comments
 (0)