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
- expected ‘;’ — Quando falta ponto e vírgula
- expected ‘}’ — Quando falta chave de fechamento
- expected block expression — Quando um bloco é esperado
- invalid character in source — Caractere inválido no código