defmodule Zig.Parser.While do defstruct [ :block, :label, :condition, :payload, :continue, :location, :else_payload, :else, inline: false ] alias Zig.Parser.Block def parse([:LPAREN, condition, :RPAREN | rest]) do parse_payload(%__MODULE__{condition: condition}, rest) end defp parse_payload(while, [:|, payload, :| | rest]) do while |> Map.replace!(:payload, payload) |> parse_block(rest) end defp parse_payload(while, [:|, :*, payload, :| | rest]) do while |> Map.replace!(:payload, {:*, payload}) |> parse_continue(rest) end defp parse_payload(while, rest), do: parse_continue(while, rest) defp parse_continue(while, [:COLON, :LPAREN, continue, :RPAREN | rest]) do while |> Map.replace!(:continue, continue) |> parse_block(rest) end defp parse_continue(while, rest), do: parse_block(while, rest) defp parse_block(while, [%Block{} = block | rest]) do while |> Map.replace!(:block, block) |> parse_else(rest) end defp parse_else(while, []), do: while defp parse_else(while, [:else, block]), do: %{while | else: block} defp parse_else(while, [:else, :|, payload, :|, block]) do %{while | else: block, else_payload: payload} end end