expected expression — Como Resolver em Zig

expected expression — Como Resolver em Zig

O Que Este Erro Significa

O erro expected expression ocorre quando o compilador Zig está analisando o código e encontra um token (palavra, símbolo ou caractere) onde deveria haver uma expressão válida. Uma expressão em Zig é qualquer trecho de código que produz um valor — como um literal (42), uma variável (x), uma chamada de função (foo()), ou uma operação (a + b).

Quando o compilador encontra algo que não pode ser interpretado como expressão no contexto atual, ele emite este erro.

Causas Comuns

1. Vírgula Extra ou Faltante

const std = @import("std");

pub fn main() void {
    std.debug.print("{} {}\n", .{1, 2,}); // Geralmente OK com trailing comma
    std.debug.print("{}\n", .{,}); // ERRO: expected expression, encontrou ','
}

2. Parêntese ou Chave no Lugar Errado

pub fn main() void {
    const x = (+ 5); // ERRO: expected expression após '('
}

3. Operador Sem Operando

pub fn main() void {
    const x = 5 + ; // ERRO: expected expression após '+'
    _ = x;
}

4. Usar Palavras-Chave Como Expressão

pub fn main() void {
    const x = if; // ERRO: 'if' precisa de condição e corpo
    _ = x;
}

5. Bloco Vazio Onde Expressão é Esperada

pub fn main() void {
    const x = {}; // ERRO ou tipo void inesperado
    _ = x;
}

6. Sintaxe de Struct Literal Incorreta

const Ponto = struct { x: f64, y: f64 };

pub fn main() void {
    const p = Ponto{ x = 1.0, y = 2.0 }; // ERRO: use '.' antes do nome do campo
    _ = p;
}

7. Switch Sem Expressão nos Braços

fn classificar(n: i32) []const u8 {
    return switch (n) {
        0 => , // ERRO: expected expression após '=>'
        else => "outro",
    };
}

8. Array Literal com Sintaxe Incorreta

pub fn main() void {
    const arr = [3]u32{1, 2}; // ERRO: tamanho incompatível ou sintaxe incorreta
    _ = arr;
}

Como Corrigir

Solução 1: Corrigir Operadores Incompletos

Certifique-se de que cada operador tem seus operandos:

pub fn main() void {
    const x = 5 + 3; // Correto: operador '+' com dois operandos
    _ = x;
}

Solução 2: Usar Sintaxe Correta de Struct Literal

Use ponto (.) antes do nome de cada campo:

const Ponto = struct { x: f64, y: f64 };

pub fn main() void {
    const p = Ponto{ .x = 1.0, .y = 2.0 }; // Correto: '.x' e '.y'
    _ = p;
}

Solução 3: Completar Expressões em Switch

Cada braço do switch precisa de uma expressão válida:

fn classificar(n: i32) []const u8 {
    return switch (n) {
        0 => "zero",      // Correto
        1 => "um",        // Correto
        else => "outro",  // Correto
    };
}

Solução 4: Usar if Como Expressão Corretamente

Em Zig, if pode ser usado como expressão, mas precisa da sintaxe completa:

pub fn main() void {
    const valor: i32 = 10;
    const x = if (valor > 5) @as(i32, 1) else @as(i32, 0);
    _ = x;
}

Solução 5: Corrigir Array Literals

pub fn main() void {
    const arr = [_]u32{ 1, 2, 3 }; // Correto: use [_] para inferir tamanho
    _ = arr;
}

Solução 6: Verificar Chamadas de Função

Certifique-se de que os argumentos são expressões válidas:

const std = @import("std");

pub fn main() void {
    const valor: u32 = 42;
    std.debug.print("valor: {}\n", .{valor}); // Cada argumento é uma expressão válida
}

Dicas de Diagnóstico

O compilador Zig geralmente indica a posição exata onde a expressão era esperada. Preste atenção na coluna indicada pelo ^ na mensagem de erro:

src/main.zig:5:20: error: expected expression
    const x = 5 + ;
                   ^

O ^ aponta exatamente onde o compilador esperava encontrar a expressão.

Padrões Corretos de Expressão em Zig

Para referência, aqui estão os tipos válidos de expressão:

  • Literais: 42, 3.14, "texto", 'a', true, null
  • Variáveis: x, nome, std
  • Chamadas de função: foo(), std.debug.print(...)
  • Operações: a + b, !flag, -x
  • Blocos com valor: blk: { break :blk valor; }
  • If expressão: if (cond) a else b
  • Switch expressão: switch (x) { ... }
  • Struct/Array literal: .{ .campo = valor }, [_]u32{ 1, 2 }

Erros Relacionados

Continue aprendendo Zig

Explore mais tutoriais e artigos em português para dominar a linguagem Zig.