def parse_assignment(flag_foreach_stmt=false)
left_expr = parse_expression()
if _assign_op?(tkn = token)
scan()
right_expr = parse_expression()
unless left_expr.token == :variable
msg = nil
flag = flag_foreach_stmt
case left_expr.token
when '[]', '{}', '[:]'
if @toppings[:inhibit_array_assign]
msg = "cannot use array/hash as loop var." if flag_foreach_stmt
msg = "cannot assign value into array/hash." unless flag_foreach_stmt
end
when '.'
if @toppings[:inhibit_property_assign]
msg = "cannot use property as loop var." if flag_foreach_stmt
msg = "cannot assign value into property." unless flag_foreach_stmt
end
when :true, :false, :null
msg = "cannot use true/false/null as loop var." if flag_foreach_stmt
msg = "cannot assign value into true/false/null." unless flag_foreach_stmt
else
msg = "cannot use expression as loop var." if flag_foreach_stmt
msg = "cannot assign value into expression." unless flag_foreach_stmt
end
raise SemanticError.new(msg) if msg
end
expr = ExprNode.new(tkn, left_expr, right_expr)
else
expr = left_expr
end
return expr
end