// DOCS NAVIGATION
Gramática Informal_
SOURCE: content/docs/reference/06-referencia-rapida.md — 06 Referência Rápida / 11. Gramática Informal / Informal Grammar
programa = declaracao_modulo? import* declaracao* ;
declaracao_modulo = "module" IDENT ;
import = "import" caminho_modulo
| "import" caminho_modulo "as" IDENT
| "from" caminho_modulo "import" IDENT ("," IDENT)*
| "public" "from" caminho_modulo "import" IDENT ("," IDENT)* ;
declaracao = decl_fn | decl_struct | decl_enum | decl_impl | decl_trait | decl_trait_impl ;
decl_fn = visib? "func" IDENT genericos? "(" params? ")" ("returns" tipo)? bloco ;
decl_struct = visib? "record" IDENT genericos? "{" campo* "}" ;
decl_enum = visib? "enum" IDENT genericos? "{" variante* "}" ;
variante = IDENT (* unit *)
| IDENT "(" tipo ("," tipo)* ")" (* tupla *)
| IDENT "{" campo* "}" (* record *)
;
decl_impl = "impl" genericos? IDENT ("{" metodo* "}")? ;
decl_trait = visib? "trait" IDENT (":" IDENT)? "{" assinatura* "}" ;
bloco = "{" stmt* expr? "}" ;
stmt = decl_let | atribuicao | retorno | expr | laço | condicional | match_stmt ;
match_stmt = "match" expr "{" braço* "}" ";"? ;
decl_let = "let" "mut"? IDENT (":" tipo)? "=" expr ;
expr = literal | IDENT | binario | unario | chamada | met_call | f_string
| "if" expr bloco ("else" "if" expr bloco)* ("else" bloco)?
| "if" "not" expr bloco ("else" bloco)?
| "match" expr "{" braço* "}"
| "|" params? "|" (expr | bloco)
| "[" (expr ("," expr)*)? "]"
| "(" expr ("," expr)+ ")"
;
tipo = "int" | "float" | "bool" | "string" | "char"
| IDENT (* tipo nomeado *)
| IDENT "<" tipo ("," tipo)* ">" (* genérico *)
| "[" tipo "]" (* array *)
| "(" tipo ("," tipo)* ")" (* tupla *)
;
visib = "public" | "internal" ;
genericos = "<" IDENT (":" IDENT ("+" IDENT)*)? ("," ...)* ">" ;