Tokay は、アドホック解析用に設計されたプログラミング言語です。
重要
Tokay は開発中であり、本番での使用はまだ考慮されていません。 Tokay の進行中の開発に参加し、貢献してください。
Tokay は、テキスト処理の問題に対する解決策を迅速に実装するために使用できるプログラミング言語になることを目的としています。これには、単純なデータ抽出だけでなく、構文構造またはその一部の解析、およびさらなる処理のための構造化解析ツリーまたは抽象構文ツリーへの情報の変換も含まれます。
したがって、Tokay は、マッチャーやレコグナイザーなどの単純なワンライナーのための実用的なツールになるだけでなく、コード アナライザー、リファクタリング ツール、インタープリター、コンパイラー、トランスパイラーの実装に使用できる言語にもなりつつあります。実際には、Tokay 独自の言語パーサーが Tokay 自体に実装されています。
Tokay は awk からインスピレーションを受けており、Python と Rust の構文的および意味論的な特徴を持っていますが、独自の哲学、アイデア、設計原則にも準拠しています。したがって、Tokay は他の言語やプロジェクトと直接比較することはできず、独立して存在します。まったく新しいプログラミング言語です。
Tokay はまだ非常に若いプロジェクトであり、多くの可能性を秘めています。ボランティアの方も大歓迎です!
Rusts 依存関係マネージャーとビルドツールcargo
を使用して、単に Tokay をインストールします。
$ cargo install tokay
Arch Linux ベースのディストリビューションの場合、Arch Linux AUR にはtokay
およびtokay-git
パッケージもあります。
Tokay 版の「Hello World」は非常に明白です。
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay は、それに供給されているあらゆる単語に挨拶することもできます。次のプログラムは、「Hello Venus」、「Hello Earth」、または「Hello」の後に、組み込みのWord
トークンによって以前に解析された他の名前を出力します。単語以外の入力は自動的に省略されます。
print("Hello", Word)
$ tokay 'print("Hello", Word)' -- "World 1337 Venus Mars 42 Max" Hello World Hello Venus Hello Mars Hello Max
単語と数値を数え、後で合計を出力する簡単なプログラムは次のように実装できます。
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 は消費された情報から構文ツリーを自動的に構築します。
次のプログラムは、 1 + 2 + 3
や7 * (8 + 2) / 5
などの単純な数式のパーサーとインタープリターを実装します。各式の結果は後で出力されます。
無限ループに陥ることなく直接的および間接的な左再帰を処理することは、Tokay の中核機能の 1 つです。
_ : 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 ...
解析された整数からフィボナッチ数を計算します。
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
Tokay のホームページ tokay.dev には、クイック スタートとドキュメントへのリンクが提供されています。ドキュメントのソース コードは別のリポジトリに保持されます。
デバッグには 2 つの方法があります。
log
-crate を使用したトレースRustの標準トレースの場合は、 env_logger
機能を使用します。完全なトレースはデバッグ実行可能ファイルにのみコンパイルされ、リリース バージョンでは警告レベル以上のみが提供されます。
$ RUST_LOG=tokay=debug tokay
あるいは、 TOKAY_LOG
を設定することで、 __main__
プログラムのトレースをアクティブ化することもできます。これは、内部パーサーがすでにコンパイルおよび実行され、実際のプログラムが解析されたときにトレースを開始するために使用されます。 TOKAY_LOG
、直後にRUST_LOG
になるため、任意のRUST_LOG
準拠形式に設定できます。
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
およびTOKAY_PARSER_DEBUG
を使用した組み込みの AST および VM デバッガーTOKAY_DEBUG
1 ~ 6 のデバッグ レベルに設定します。これはd
ごとにデバッグ レベルが増加するtokay -dddd
を使用して実現することもできます。さらに、 TOKAY_INSPECT
、VM ステップバイステップ トレース ( TOKAY_DEBUG=6
) で検査する必要がある 1 つまたはパースレット名 (-prefixes) のリストに設定できます。
レベル | モード |
---|---|
0 | デバッグなし |
1 | 印刷構築AST |
2 | 最終中間プログラムを印刷する |
3 | コンパイルされた VM プログラムを印刷する |
4 | VM 実行トレースを印刷する |
5 | VM スタックの内容を出力する |
6 | VM オペコード デバッガー |
デバッグレベル 1 でプログラムの解析された AST を表示します。
$ 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
Tokay 自体に実装され、コンパイラの一部であるパーサーの特定のデバッグ レベルを設定します。パーサーの AST がコードに組み込まれているため、ここではレベル > 2 のみが認識されます。
ここでは、単純な「Hello World」プログラムを実行している VM デバッガーが動作しています。
`$ 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)))
トッケイ プログラミング言語は、夜に「トークン」と叫ぶアジアのトッケイヤモリ (Gekko ヤモリ) にちなんで名付けられました。
Tokay のロゴとアイコンは、ありがたいことに Timmytiefkuehl によってデザインされました。
tokay-artwork リポジトリで、ロゴのさまざまなバージョンも確認してください。
著作権 © 2024 by Jan Max Meyer、Phorward Software Technologies。
Tokay は MIT ライセンスに基づくフリー ソフトウェアです。
詳細については、LICENSE ファイルを参照してください。