SPECTRALANG_

// DOCS NAVIGATION

Gramática Informal_

SOURCE: content/docs/reference/06-referencia-rapida.md06 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)*)? ("," ...)* ">" ;