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
| Categoria | Palavras |
|---|---|
| Declarações | fn, let, const, var, mut, type |
| Fluxo | if, else, elif, while, for, in, loop, match, switch, case, default, break, continue, return |
| Tipos | struct, enum, interface, trait, impl |
| Módulos | mod, use, import, export, pub, priv |
| Assíncrono/erros | async, await, try, catch, throw |
| Literais | true, false, null, void |
| Outras | as, 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.