Tokay é uma linguagem de programação projetada para análise ad-hoc.
Importante
Tokay está em desenvolvimento e ainda não foi considerado para uso em produção. Faça parte do desenvolvimento contínuo da Tokay e contribua!
Tokay pretende se tornar uma linguagem de programação que pode ser usada para implementar rapidamente soluções para problemas de processamento de texto. Isto pode envolver simples extrações de dados, mas também a análise de estruturas sintáticas ou partes delas e a conversão de informações em árvores de análise estruturadas ou árvores de sintaxe abstratas para processamento posterior.
Portanto, Tokay está se tornando não apenas uma ferramenta prática para one-liners simples, como matchers ou reconhecedores, mas também uma linguagem que pode ser usada para implementar analisadores de código, ferramentas de refatoração, intérpretes, compiladores ou transpiladores. Na verdade, o analisador de linguagem do próprio Tokay é implementado no próprio Tokay.
Tokay é inspirado no awk, tem sabores sintáticos e semânticos de Python e Rust, mas também segue sua própria filosofia, ideias e princípios de design. Assim, o Tokay não é diretamente comparável a outras linguagens ou projetos e é independente. É uma linguagem de programação totalmente nova.
Tokay ainda é um projeto muito jovem e ganha muito potencial. Voluntários são bem-vindos!
Usando o gerenciador de dependências Rusts e a ferramenta de construção cargo
, basta instalar o Tokay com
$ cargo install tokay
Para distros baseadas em Arch Linux, há também um pacote tokay
e tokay-git
no Arch Linux AUR.
A versão de “Hello World” de Tokay é bastante óbvia.
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay também pode cumprimentar qualquer palavra que esteja sendo enviada para ele. O próximo programa imprime "Hello Venus", "Hello Earth" ou "Hello" seguido por qualquer outro nome previamente analisado pelo Word
-token integrado. Qualquer outra entrada que não seja uma palavra é automaticamente omitida.
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
Um programa simples para contar palavras e números e depois imprimir um total pode ser implementado assim:
Word words += 1
Number numbers += 1
end print(words || 0, "words,", numbers || 0, "numbers")
$ tokay 'Word words += 1; Number numbers += 1; end print(words || 0, "words,", numbers || 0, "numbers")' -- "this is just the 1st stage of 42.5 or .1 others" 9 words, 3 numbers
Por design, Tokay constrói árvores de sintaxe automaticamente a partir de informações consumidas.
O próximo programa implementa um analisador e interpretador para expressões matemáticas simples, como 1 + 2 + 3
ou 7 * (8 + 2) / 5
. O resultado de cada expressão é impresso posteriormente.
Processar recursões à esquerda diretas e indiretas sem terminar em loops infinitos é um dos principais recursos do Tokay.
_ : Char< t>+ # redefine whitespace to just tab and space
Factor : @{
Int _ # built-in 64-bit signed integer token
'(' _ Expr ')' _
}
Term : @{
Term '*' _ Factor $1 * $4
Term '/' _ Factor $1 / $4
Factor
}
Expr : @{
Expr '+' _ Term $1 + $4
Expr '-' _ Term $1 - $4
Term
}
Expr _ print("= " + $1) # gives some neat result output
$ tokay examples/expr_from_readme.tok 1 + 2 + 3 = 6 7 * (8 + 2) / 5 = 14 7*(3-9) = -42 ...
Calcule os números de Fibonacci a partir de inteiros analisados:
fibonacci : @n {
if n <= 1 n else fibonacci(n - 1) + fibonacci(n - 2)
}
Int print($1, "=>", fibonacci($1))
$ tokay examples/fibonacci2.tok 0 0 => 0 1 1 => 1 2 2 => 1 3 3 => 2 4 4 => 3 5 5 => 5 6 6 => 8 7 7 => 13 8 8 => 21 9 9 => 34 10 10 => 55
A página inicial do Tokay tokay.dev fornece links para um início rápido e documentação. O código-fonte da documentação é mantido em um repositório separado.
Para depuração, existem dois métodos a serem usados.
log
-crate Para rastreamento padrão do Rust, use os recursos env_logger
. O rastreamento completo é compilado apenas em executáveis de depuração, a versão de lançamento fornece apenas nível de aviso e superior.
$ RUST_LOG=tokay=debug tokay
Alternativamente, o rastreamento pode ser ativado para o programa __main__
configurando TOKAY_LOG
. Isso é usado para iniciar o rastreamento quando o analisador interno já tiver sido compilado e executado e analisado o programa real. TOKAY_LOG
pode ser definido para qualquer formato compatível RUST_LOG
, pois se torna RUST_LOG
logo em seguida.
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
e TOKAY_PARSER_DEBUG
Defina TOKAY_DEBUG
para um nível de depuração entre 1-6. Isso também pode ser alcançado usando tokay -dddd
onde cada d
incrementa o nível de depuração. Além disso, TOKAY_INSPECT
pode ser definido como um ou uma lista de nomes de parselet (-prefixes) que devem ser inspecionados no rastreamento passo a passo da VM ( TOKAY_DEBUG=6
).
Nível | Modo |
---|---|
0 | Sem depuração |
1 | Imprimir construído AST |
2 | Imprimir programa intermediário final |
3 | Imprimir programa VM compilado |
4 | Imprimir rastreamento de execução da VM |
5 | Imprimir o conteúdo da pilha VM |
6 | Depurador de código de operação VM |
Visualize o AST analisado de um programa no nível de depuração 1:
$ cargo run -q -- -d 'x = 42 print("Hello World " + x)' main [start 1:1, end 1:33] sequence [start 1:1, end 1:33] assign_drop [start 1:1, end 1:8] lvalue [start 1:1, end 1:3] identifier [start 1:1, end 1:2] => "x" value_integer [start 1:5, end 1:7] => 42 call [start 1:8, end 1:33] identifier [start 1:8, end 1:13] => "print" callarg [start 1:14, end 1:32] op_binary_add [start 1:14, end 1:32] value_string [start 1:14, end 1:28] => "Hello World " identifier [start 1:31, end 1:32] => "x"
TOKAY_PARSER_DEBUG
define o nível de depuração específico para o analisador, que é implementado no próprio Tokay e faz parte do compilador. Somente níveis > 2 podem ser reconhecidos aqui, já que o AST do analisador está embutido no código.
Aqui está o depurador VM em ação executando o programa simples "Hello World":
`$ TOKAY_INSPECT="__main__" cargo run -q -- 'print("Hello World")'` __main__ --- Code --- __main__ 000 Offset(Offset { offset: 6, row: 1, col: 7 }) __main__ >001 LoadStatic(1) __main__ 002 Offset(Offset { offset: 0, row: 1, col: 1 }) __main__ 003 CallStaticArg((2, 1)) __main__ --- Reader --- __main__ offset=Offset { offset: 0, row: 1, col: 1 } __main__ eof=false __main__ --- Globals --- __main__ --- Stack --- __main__ --- Frames --- __main__ 000 capture: 0, reader: 0, fuse: None __main__ ip = 1 state = Ok(Push([59d29e639f88] "Hello World" (10))) __main__ --- Code --- __main__ 000 Offset(Offset { offset: 6, row: 1, col: 7 }) __main__ 001 LoadStatic(1) __main__ 002 Offset(Offset { offset: 0, row: 1, col: 1 }) __main__ >003 CallStaticArg((2, 1)) __main__ --- Reader --- __main__ offset=Offset { offset: 0, row: 1, col: 1 } __main__ eof=false __main__ --- Globals --- __main__ --- Stack --- __main__ 000 [59d29e639f88] "Hello World" (10) __main__ --- Frames --- __main__ 000 capture: 0, reader: 0, fuse: None Hello World __main__ ip = 3 state = Ok(Push([59d29e498fd8] void (10))) __main__ exit state = Ok(Push([59d29e498fd8] void (10)))
A linguagem de programação Tokay tem o nome da lagartixa Tokay (Gekko gecko) da Ásia, gritando "token" durante a noite.
Felizmente, o logotipo e o ícone da Tokay foram desenhados por Timmytiefkuehl.
Confira também o repositório tokay-artwork para diferentes versões do logotipo.
Copyright © 2024 de Jan Max Meyer, Phorward Software Technologies.
Tokay é um software livre sob licença do MIT.
Consulte o arquivo LICENSE para obter detalhes.