@@ -174,6 +174,7 @@ defmodule Spitfire do
174174 case result do
175175 { :ok , ast } -> { :ok , ast , comments }
176176 { :error , ast , errors } -> { :error , ast , comments , errors }
177+ { :error , :no_fuel_remaining } -> { :error , :no_fuel_remaining }
177178 end
178179 after
179180 Process . delete ( :code_formatter_comments )
@@ -619,9 +620,16 @@ defmodule Spitfire do
619620 { kvs , parser } =
620621 while2 peek_token ( parser ) == :"," <- parser do
621622 parser = parser |> next_token ( ) |> next_token ( )
622- { pair , parser } = parse_kw_identifier ( parser )
623623
624- { pair , parser }
624+ case current_token_type ( parser ) do
625+ type when type in [ :kw_identifier , :kw_identifier_unsafe ] ->
626+ { pair , parser } = parse_kw_identifier ( parser )
627+ { pair , parser }
628+
629+ _ ->
630+ # Not a keyword identifier, exit the loop
631+ { :filter , { nil , parser } }
632+ end
625633 end
626634
627635 { [ { token , value } | kvs ] , parser }
@@ -646,9 +654,16 @@ defmodule Spitfire do
646654 { kvs , parser } =
647655 while2 peek_token ( parser ) == :"," <- parser do
648656 parser = parser |> next_token ( ) |> next_token ( )
649- { pair , parser } = parse_kw_identifier ( parser )
650657
651- { pair , parser }
658+ case current_token_type ( parser ) do
659+ type when type in [ :kw_identifier , :kw_identifier_unsafe ] ->
660+ { pair , parser } = parse_kw_identifier ( parser )
661+ { pair , parser }
662+
663+ _ ->
664+ # Not a keyword identifier, exit the loop
665+ { :filter , { nil , parser } }
666+ end
652667 end
653668
654669 { [ { atom , value } | kvs ] , parser }
@@ -1698,11 +1713,9 @@ defmodule Spitfire do
16981713 { parser , is_valid } = validate_peek ( parser , current_token_type ( parser ) )
16991714
17001715 if is_valid do
1701- while peek_token ( parser ) not in terminals && calc_prec ( parser , associativity , precedence ) <- { left , parser } do
1702- case peek_token_type ( parser ) do
1703- :. -> parse_dot_expression ( next_token ( parser ) , left )
1704- _ -> { left , parser }
1705- end
1716+ while peek_token ( parser ) not in terminals && peek_token ( parser ) == :. &&
1717+ calc_prec ( parser , associativity , precedence ) <- { left , parser } do
1718+ parse_dot_expression ( next_token ( parser ) , left )
17061719 end
17071720 else
17081721 { left , parser }
@@ -2415,6 +2428,10 @@ defmodule Spitfire do
24152428 :eof
24162429 end
24172430
2431+ defp peek_token ( % { peek_token: nil } ) do
2432+ :eof
2433+ end
2434+
24182435 defp peek_token_eat_eol ( % { peek_token: { :eol , _token } } = parser ) do
24192436 peek_token_eat_eol ( next_token ( parser ) )
24202437 end
0 commit comments