Current section

Files

Jump to
zig_parser lib zig.parser var_decl_expr_statement.ex
Raw

lib/zig.parser/var_decl_expr_statement.ex

defmodule Zig.Parser.VarDeclExprStatement do
alias Zig.Parser.Const
alias Zig.Parser.Var
def post_traverse(rest, args, context, _, _) do
{rest, parse(args), context}
end
# NOTE: this duplicates functionality in `AssignExpr`.
# this is due to the organization of `grammar.y`
@assign_operators ~w[*= /= %= += -= <<= >>= &= ^= |= *%= +%= -%= *|= +|= -|= <<|= =]a
defp parse(args) do
case Enum.reverse(args) do
[_, :COMMA | _] = multi_assign ->
parse_multi_assign(multi_assign, [])
[%m{} = const_or_var | rest] when m in [Const, Var] ->
{struct, new_rest} = m.extend(const_or_var, rest)
[struct | new_rest]
[left, operator, right, :SEMICOLON | rest] when operator in @assign_operators ->
[{operator, left, right} | rest]
[left, :"-|", right, :SEMICOLON | rest] ->
[{:"-|=", left, right} | rest]
[content, :SEMICOLON] ->
[content]
end
end
defp parse_multi_assign([assign, :COMMA | rest], so_far) do
parse_multi_assign(rest, [ assign | so_far])
end
defp parse_multi_assign([assign, :=, value, :SEMICOLON | rest], so_far) do
[{:=, Enum.reverse([assign | so_far]), value} | rest]
end
end