NovaLang0.2 alpha

Estrutura léxica

Arquivos são UTF-8. Identificadores seguem XID_Start no primeiro caractere e XID_Continue nos demais. Maiúsculas e minúsculas são distintas.

identifier = xid_start, { xid_continue } ;

Espaço, tabulação e CR são trivia. LF produz um token de nova linha. Ponto e vírgula é opcional onde o parser consome um terminador.

// comentário de linha
/* comentário /* aninhado */ de bloco */

Palavras reservadas

CategoriaPalavras
Declaraçõesfn, let, const, var, mut, type
Fluxoif, else, elif, while, for, in, loop, match, switch, case, default, break, continue, return
Tiposstruct, enum, interface, trait, impl
Módulosmod, use, import, export, pub, priv
Assíncrono/errosasync, await, try, catch, throw
Literaistrue, false, null, void
Outrasas, is, ref, self, super, where, new, and, or, not, defer, yield, macro, unsafe, extern

use, priv, where, new, macro e unsafe estão reservadas sem produção sintática atual.

Literais

Inteiros aceitam decimal, 0x hexadecimal, 0b binário, 0o octal e _ como separador. O valor léxico é i128; sufixos/larguras ainda não são preservados pelo sistema de tipos. Floats aceitam decimal, expoente e .5.

Strings usam "...", caracteres usam 'x'. São implementados \n, \r, \t, \0, \\, \", \', \xNN e \u{...}. Strings não atravessam linhas e aceitam interpolação balanceada:

let who = "Nova"
let message = "Olá, {who}!"

Operadores e pontuação

+ - * / % **   += -= *= /= %= **=
== != < <= > >=
&& || ! ?       and or not
& | ^ ~ << >>   &= |= ^= <<= >>=
= -> => :: @ #
( ) { } [ ] , ; : . .. ...

O lexer usa correspondência mais longa.