Tokay es un lenguaje de programación diseñado para análisis ad-hoc.
Importante
Tokay está en desarrollo y aún no se considera para uso en producción. ¡Sé parte del desarrollo continuo de Tokay y contribuye!
Tokay pretende convertirse en un lenguaje de programación que pueda utilizarse para implementar rápidamente soluciones a problemas de procesamiento de texto. Esto puede implicar extracciones de datos simples, pero también el análisis de estructuras sintácticas o partes de ellas y la conversión de información en árboles de análisis estructurados o árboles de sintaxis abstracta para su posterior procesamiento.
Por lo tanto, Tokay se está convirtiendo no sólo en una herramienta práctica para frases simples como comparadores o reconocedores, sino también en un lenguaje que puede usarse para implementar analizadores de código, herramientas de refactorización, intérpretes, compiladores o transpiladores. En realidad, el analizador de lenguaje propio de Tokay está implementado en el propio Tokay.
Tokay está inspirado en awk, tiene sabores sintácticos y semánticos de Python y Rust, pero también sigue su propia filosofía, ideas y principios de diseño. Por lo tanto, Tokay no es directamente comparable con otros lenguajes o proyectos y se sostiene por sí solo. Es un lenguaje de programación completamente nuevo.
Tokay es todavía un proyecto muy joven y gana mucho potencial. ¡Los voluntarios son bienvenidos!
Al utilizar el administrador de dependencias de Rusts y la herramienta de compilación cargo
, simplemente instale Tokay con
$ cargo install tokay
Para las distribuciones basadas en Arch Linux, también hay un paquete tokay
y tokay-git
en Arch Linux AUR.
La versión de Tokay de "Hello World" es bastante obvia.
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay también puede saludar cualquier palabra que se le esté transmitiendo. El siguiente programa imprime "Hola Venus", "Hola Tierra" o "Hola" seguido de cualquier otro nombre previamente analizado por el token incorporado Word
. Cualquier otra entrada que no sea una palabra se omite automáticamente.
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
Un programa simple para contar palabras y números e imprimir luego un total se puede implementar así:
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 diseño, Tokay construye automáticamente árboles de sintaxis a partir de la información consumida.
El siguiente programa implementa un analizador e intérprete para expresiones matemáticas simples, como 1 + 2 + 3
o 7 * (8 + 2) / 5
. El resultado de cada expresión se imprime posteriormente.
El procesamiento de recursiones izquierdas directas e indirectas sin terminar en bucles infinitos es una de las características principales de 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 los números de Fibonacci a partir de números enteros analizados:
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
La página de inicio de Tokay, tokay.dev, proporciona enlaces a un inicio rápido y a documentación. El código fuente de la documentación se mantiene en un repositorio separado.
Para la depuración, hay dos métodos a utilizar.
log
-crate Para el seguimiento estándar de Rust, utilice las funciones env_logger
. El seguimiento completo solo se compila en ejecutables de depuración, la versión de lanzamiento solo proporciona un nivel de advertencia y superiores.
$ RUST_LOG=tokay=debug tokay
Alternativamente, se puede activar el seguimiento para el programa __main__
configurando TOKAY_LOG
. Esto se utiliza para iniciar el seguimiento cuando el analizador interno ya se ha compilado y ejecutado, y ha analizado el programa real. TOKAY_LOG
se puede configurar en cualquier formato compatible RUST_LOG
, ya que se convierte en RUST_LOG
inmediatamente después.
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
y TOKAY_PARSER_DEBUG
Establezca TOKAY_DEBUG
en un nivel de depuración entre 1 y 6. Esto también se puede lograr usando tokay -dddd
donde cada d
incrementa el nivel de depuración. Además, TOKAY_INSPECT
se puede configurar en uno o una lista de nombres de parselet (prefijos) que deben inspeccionarse en el seguimiento paso a paso de la VM ( TOKAY_DEBUG=6
).
Nivel | Modo |
---|---|
0 | Sin depuración |
1 | Impresión construida AST |
2 | Imprimir programa intermedio final |
3 | Imprimir programa VM compilado |
4 | Imprimir seguimiento de ejecución de VM |
5 | Imprimir el contenido de la pila de VM |
6 | Depurador de código de operación de VM |
Vea el AST analizado de un programa en el nivel de depuración 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
establece el nivel de depuración específico para el analizador, que se implementa en el propio Tokay y es parte del compilador. Aquí solo se pueden reconocer niveles > 2, ya que el AST del analizador está integrado en el código.
Aquí está el depurador de VM en acción ejecutando el sencillo programa "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)))
El lenguaje de programación Tokay lleva el nombre del gecko Tokay (Gekko gecko) de Asia, que grita "token" en la noche.
Afortunadamente, el logotipo y el ícono de Tokay fueron diseñados por Timmytiefkuehl.
Consulte también el repositorio de tokay-artwork para ver diferentes versiones del logotipo.
Copyright © 2024 de Jan Max Meyer, Phorward Software Technologies.
Tokay es un software gratuito bajo licencia MIT.
Consulte el archivo de LICENCIA para obtener más detalles.