Tokay ist eine Programmiersprache für Ad-hoc-Analyse.
Wichtig
Tokay befindet sich in der Entwicklung und ist noch nicht für den Produktionseinsatz vorgesehen. Seien Sie Teil der laufenden Entwicklung von Tokay und tragen Sie dazu bei!
Tokay soll eine Programmiersprache werden, mit der sich schnell Lösungen für Textverarbeitungsprobleme umsetzen lassen. Dabei kann es sich sowohl um einfache Datenextraktionen als auch um das Parsen syntaktischer Strukturen oder Teile davon und die Umwandlung von Informationen in strukturierte Parse-Bäume oder abstrakte Syntaxbäume zur weiteren Verarbeitung handeln.
Daher wird Tokay nicht nur zu einem praktischen Werkzeug für einfache Einzeiler wie Matcher oder Recognizer, sondern auch zu einer Sprache, die zur Implementierung von Codeanalysatoren, Refactoring-Tools, Interpretern, Compilern oder Transpilern verwendet werden kann. Tatsächlich ist Tokays eigener Sprachparser in Tokay selbst implementiert.
Tokay ist von awk inspiriert, hat syntaktische und semantische Anklänge an Python und Rust, folgt aber auch seiner eigenen Philosophie, seinen eigenen Ideen und Designprinzipien. Daher ist Tokay nicht direkt mit anderen Sprachen oder Projekten vergleichbar und steht für sich allein. Es ist eine völlig neue Programmiersprache.
Tokay ist noch ein sehr junges Projekt und hat viel Potenzial. Freiwillige sind herzlich willkommen!
Installieren Sie Tokay einfach mit, indem Sie Rusts Abhängigkeitsmanager und Build-Tool cargo
verwenden
$ cargo install tokay
Für Arch Linux-basierte Distributionen gibt es auch ein tokay
und tokay-git
Paket im Arch Linux AUR.
Tokays Version von „Hello World“ ist ziemlich offensichtlich.
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay kann auch alle ihm zugeführten Wörter begrüßen. Das nächste Programm gibt „Hallo Venus“, „Hallo Erde“ oder „Hallo“ aus, gefolgt von einem beliebigen anderen Namen, der zuvor vom integrierten Word
-Token analysiert wurde. Alle anderen Eingaben als ein Wort werden automatisch weggelassen.
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
Ein einfaches Programm zum Zählen von Wörtern und Zahlen und zum anschließenden Ausdrucken der Summe kann folgendermaßen implementiert werden:
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
Tokay erstellt automatisch Syntaxbäume aus verbrauchten Informationen.
Das nächste Programm implementiert einen Parser und Interpreter für einfache mathematische Ausdrücke, wie 1 + 2 + 3
oder 7 * (8 + 2) / 5
. Das Ergebnis jedes Ausdrucks wird anschließend gedruckt.
Die Verarbeitung direkter und indirekter Linksrekursionen, ohne in Endlosschleifen zu enden, ist eine der Kernfunktionen von 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 ...
Berechnen Sie die Fibonacci-Zahlen aus analysierten ganzen Zahlen:
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
Die Tokay-Homepage tokay.dev bietet Links zu einem Schnellstart und einer Dokumentation. Der Quellcode der Dokumentation wird in einem separaten Repository verwaltet.
Zum Debuggen stehen zwei Methoden zur Verfügung.
log
-crate Verwenden Sie für den Rust-Standard-Trace die env_logger
Funktionen. Der vollständige Trace wird nur in ausführbare Debugdateien kompiliert, die Release-Version bietet nur die Warnstufe und höher.
$ RUST_LOG=tokay=debug tokay
Alternativ kann das Tracing für das __main__
-Programm durch Setzen von TOKAY_LOG
aktiviert werden. Dies wird verwendet, um die Ablaufverfolgung zu starten, wenn der interne Parser bereits kompiliert und ausgeführt wurde und das eigentliche Programm analysiert hat. TOKAY_LOG
kann auf jedes RUST_LOG
-kompatible Format eingestellt werden, da es direkt danach zu RUST_LOG
wird.
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
und TOKAY_PARSER_DEBUG
Setzen Sie TOKAY_DEBUG
auf einen Debug-Level zwischen 1 und 6. Dies kann auch mit tokay -dddd
erreicht werden, wobei jedes d
die Debug-Ebene erhöht. Darüber hinaus kann TOKAY_INSPECT
auf einen oder eine Liste von Parselet-Namen (-Präfixen) festgelegt werden, die im VM-Schritt-für-Schritt-Trace überprüft werden sollen ( TOKAY_DEBUG=6
).
Ebene | Modus |
---|---|
0 | Kein Debug |
1 | Druck konstruierter AST |
2 | Endgültiges Zwischenprogramm ausdrucken |
3 | Kompiliertes VM-Programm drucken |
4 | VM-Ausführungs-Trace drucken |
5 | VM-Stack-Inhalte drucken |
6 | VM-Opcode-Debugger |
Sehen Sie sich den geparsten AST eines Programms in Debug-Level 1 an:
$ 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
legt den spezifischen Debug-Level für den Parser fest, der in Tokay selbst implementiert ist und Teil des Compilers ist. Hier sind nur Level > 2 zu erkennen, da der AST des Parsers im Code eingebaut ist.
Hier ist der VM-Debugger in Aktion, der das einfache „Hello World“-Programm ausführt:
`$ 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)))
Die Tokay-Programmiersprache ist nach dem Tokay-Gecko (Gekko-Gecko) aus Asien benannt, der nachts „Token“ ruft.
Das Tokay-Logo und -Symbol wurde dankenswerterweise von Timmytiefkuehl entworfen.
Schauen Sie sich auch das Tokay-Artwork-Repository für verschiedene Versionen des Logos an.
Copyright © 2024 Jan Max Meyer, Phorward Software Technologies.
Tokay ist freie Software unter der MIT-Lizenz.
Weitere Informationen finden Sie in der LIZENZ-Datei.