@@ -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