Tokay est un langage de programmation conçu pour l'analyse ad hoc.
Important
Tokay est en cours de développement et n'est pas encore envisagé pour une utilisation en production. Faites partie du développement continu de Tokay et contribuez !
Tokay est destiné à devenir un langage de programmation pouvant être utilisé pour mettre en œuvre rapidement des solutions aux problèmes de traitement de texte. Cela peut impliquer soit de simples extractions de données, mais également l'analyse de structures syntaxiques ou de parties de celles-ci et la conversion d'informations en arbres d'analyse structurés ou en arbres de syntaxe abstraits pour un traitement ultérieur.
Par conséquent, Tokay devient non seulement un outil pratique pour de simples one-liners comme les matchers ou les reconnaisseurs, mais aussi un langage qui peut être utilisé pour implémenter des analyseurs de code, des outils de refactoring, des interprètes, des compilateurs ou des transpilateurs. En fait, le propre analyseur de langage de Tokay est implémenté dans Tokay lui-même.
Tokay s'inspire d'awk, a des saveurs syntaxiques et sémantiques de Python et Rust, mais suit également sa propre philosophie, ses idées et ses principes de conception. Ainsi, Tokay n'est pas directement comparable à d'autres langages ou projets et est autonome. C'est un tout nouveau langage de programmation.
Tokay est encore un très jeune projet et a beaucoup de potentiel. Les bénévoles sont les bienvenus !
En utilisant le gestionnaire de dépendances Rusts et build-tool cargo
, installez simplement Tokay avec
$ cargo install tokay
Pour les distributions basées sur Arch Linux, il existe également un package tokay
et tokay-git
dans l'AUR Arch Linux.
La version de "Hello World" de Tokay est assez évidente.
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay peut également saluer tous les mondes qui lui sont transmis. Le programme suivant imprime "Bonjour Vénus", "Bonjour Terre" ou "Bonjour" suivi de tout autre nom préalablement analysé par le jeton Word
intégré. Toute autre saisie qu'un mot est automatiquement omise.
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
Un programme simple pour compter les mots et les nombres et imprimer ensuite un total peut être implémenté comme ceci :
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
De par sa conception, Tokay construit automatiquement des arbres de syntaxe à partir des informations consommées.
Le programme suivant implémente un analyseur et un interpréteur pour des expressions mathématiques simples, comme 1 + 2 + 3
ou 7 * (8 + 2) / 5
. Le résultat de chaque expression est imprimé ensuite.
Le traitement des récursions gauches directes et indirectes sans se terminer par des boucles infinies est l'une des fonctionnalités 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 ...
Calculez les nombres de Fibonacci à partir d'entiers analysés :
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 page d'accueil de Tokay, tokay.dev, fournit des liens vers un démarrage rapide et de la documentation. Le code source de la documentation est conservé dans un référentiel distinct.
Pour le débogage, vous pouvez utiliser deux méthodes.
log
-crate Pour la trace standard Rust, utilisez les fonctionnalités env_logger
. La trace complète est uniquement compilée dans les exécutables de débogage, la version finale ne fournit que le niveau d'avertissement et les niveaux supérieurs.
$ RUST_LOG=tokay=debug tokay
Alternativement, le traçage peut être activé pour le programme __main__
en définissant TOKAY_LOG
. Ceci est utilisé pour démarrer le traçage lorsque l'analyseur interne a déjà été compilé et exécuté, et analysé le programme réel. TOKAY_LOG
peut être défini dans n'importe quel format compatible RUST_LOG
, car il devient RUST_LOG
juste après.
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
et TOKAY_PARSER_DEBUG
Définissez TOKAY_DEBUG
sur un niveau de débogage compris entre 1 et 6. Ceci peut également être réalisé en utilisant tokay -dddd
où chaque d
incrémente le niveau de débogage. De plus, TOKAY_INSPECT
peut être défini sur un ou une liste de noms de parselets (-préfixes) qui doivent être inspectés dans la trace étape par étape de la VM ( TOKAY_DEBUG=6
).
Niveau | Mode |
---|---|
0 | Pas de débogage |
1 | Imprimer l'AST construit |
2 | Imprimer le programme intermédiaire final |
3 | Imprimer le programme VM compilé |
4 | Imprimer la trace d'exécution de la VM |
5 | Imprimer le contenu de la pile de VM |
6 | Débogueur d'opcode de VM |
Afficher l'AST analysé d'un programme au niveau de débogage 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
définit le niveau de débogage spécifique pour l'analyseur, qui est implémenté dans Tokay lui-même et fait partie du compilateur. Seuls les niveaux > 2 peuvent être reconnus ici, car l'AST de l'analyseur est intégré au code.
Voici le débogueur de VM en action exécutant le simple programme "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)))
Le langage de programmation Tokay doit son nom au gecko Tokay (Gekko gecko) d'Asie, criant « jeton » dans la nuit.
Le logo et l'icône Tokay ont été heureusement conçus par Timmytiefkuehl.
Consultez également le référentiel tokay-artwork pour différentes versions du logo.
Copyright © 2024 par Jan Max Meyer, Phorward Software Technologies.
Tokay est un logiciel libre sous licence MIT.
Veuillez consulter le fichier LICENSE pour plus de détails.