playground de linguagem mínima
tokens, árvore sintática, diagnósticos e um interpretador limitado
Pergunta
O que uma linguagem faz com algumas linhas de código antes de executá-las? Edite um programa pequeno e veja seus tokens, sua árvore sintática, erros legíveis e uma execução limitada, uma etapa por vez. A sintaxe é um pequeno subconjunto lido das notas de design do yanawa; o yanawa ainda não tem compilador, e este não é ele.
Bancada
Variáveis, uma anotação de tipo, strings e interpolação.
Apenas espaços, 4 por nível nos exemplos. Os blocos terminam onde a indentação diminui. Comentários começam com //.
Escolha um exemplo ou edite o código. As etapas se atualizam enquanto você digita.
O lexer corta o código em tokens e transforma a indentação em tokens de indent e dedent.
Saída
Rastro
O que observar
- tokens
- Antes de entender qualquer coisa, o texto é cortado em tokens: palavras, números, strings, operadores. A indentação vira tokens de indent e dedent, que é como uma linguagem sem chaves marca seus blocos.
- árvore sintática
- O parser transforma a lista plana de tokens numa árvore que mostra a estrutura: `1 + 2 * 3` põe o `*` abaixo do `+` porque ele liga mais forte. A precedência está na árvore, não no texto.
- diagnósticos
- Uma boa mensagem diz o que era esperado, o que foi encontrado e onde. Depois de um erro, o parser pula a linha quebrada e continua, então um engano não esconde o próximo.
- avaliação
- O interpretador percorre a árvore. Nada é compilado e nada é avaliado como JavaScript: os nomes vivem nos escopos do próprio programa, então `process` ou `constructor` são apenas nomes indefinidos.
- limites
- Cada etapa tem um limite: tamanho do código, profundidade de aninhamento, passos de avaliação, profundidade de chamadas, saída e tamanho de string. Um laço infinito termina com uma mensagem em vez de travar a aba.
Limites
- Este não é o compilador do yanawa. O yanawa está na fase de design da linguagem e ainda não tem um compilador verificado. A sintaxe aqui é um pequeno subconjunto lido de suas notas de design (revisão 7fd082e), e as regras que as notas deixam em aberto foram decididas nesta página.
- Incluído: let, const, fn com parâmetros tipados, if/elif/else, while, for sobre um intervalo, and/or/not, inteiros, strings com interpolação, booleanos, comentários //, print e len.
- Não incluído: structs, enums, traits, tipos anuláveis, arrays, switch, floats, imports, erros como valores. As anotações de tipo (int, str, bool) são verificadas quando o programa roda; a verificação estática de tipos do yanawa não está implementada.
- Um intervalo como 1..6 exclui o fim, e a divisão de inteiros trunca; as notas não fixam nenhum dos dois, então são escolhas feitas aqui.
- O código é limitado a 4.000 caracteres e 200 linhas. Nada é guardado nem enviado a lugar nenhum.
Fidelidade
Baseado nas notas de sintaxe e de arquitetura do compilador da revisão 7fd082e do yanawa. As notas deixam várias regras em aberto (fim do intervalo, divisão de inteiros, largura da indentação) e esta página fez suas próprias escolhas. Nada é compilado nem avaliado como JavaScript, e o código nunca é guardado nem enviado.