Tokay — это язык программирования, предназначенный для специального анализа.
Важный
Tokay находится в стадии разработки и пока не рассматривается для промышленного использования. Станьте частью постоянного развития Токая и внесите свой вклад!
Tokay призван стать языком программирования, который можно будет использовать для быстрой реализации решений проблем обработки текста. Это может включать как простое извлечение данных, так и анализ синтаксических структур или их частей и преобразование информации в структурированные деревья синтаксического анализа или абстрактные синтаксические деревья для дальнейшей обработки.
Таким образом, Tokay становится не только практическим инструментом для простых однострочных программ, таких как средства сопоставления или распознавания, но и языком, который можно использовать для реализации анализаторов кода, инструментов рефакторинга, интерпретаторов, компиляторов или транспиляторов. На самом деле собственный анализатор языка Tokay реализован в самом Tokay.
Tokay вдохновлен awk, имеет синтаксические и семантические особенности Python и Rust, но также следует своей собственной философии, идеям и принципам проектирования. Таким образом, Tokay нельзя напрямую сравнивать с другими языками или проектами, и он стоит сам по себе. Это совершенно новый язык программирования.
Токай все еще очень молодой проект и имеет большой потенциал. Добровольцы приветствуются!
Используя менеджер зависимостей Rusts и инструмент сборки cargo
, просто установите Tokay с помощью
$ cargo install tokay
Для дистрибутивов на базе Arch Linux в Arch Linux AUR также есть пакеты tokay
и tokay-git
.
Версия Токая «Hello World» вполне очевидна.
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Токай также может приветствовать любые слова, которые ему вводят. Следующая программа печатает «Привет, Венера», «Привет, Земля» или «Привет», за которым следует любое другое имя, предварительно проанализированное встроенным токеном 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.
_ : 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 представлены ссылки на краткое руководство и документацию. Исходный код документации хранится в отдельном репозитории.
Для отладки можно использовать два метода.
log
-crate Для стандартной трассировки Rust используйте возможности env_logger
. Полная трассировка компилируется только в исполняемые файлы отладки, версия выпуска обеспечивает только уровень предупреждения и выше.
$ RUST_LOG=tokay=debug tokay
Альтернативно, трассировку можно активировать для __main__
-программы, установив TOKAY_LOG
. Это используется для начала отслеживания, когда внутренний синтаксический анализатор уже скомпилирован и выполнен, и проанализировал реальную программу. TOKAY_LOG
может быть установлен в любом формате, совместимом с RUST_LOG
, поскольку сразу после этого он становится RUST_LOG
.
$ TOKAY_LOG=debug tokay
TOKAY_DEBUG
и TOKAY_PARSER_DEBUG
Установите для TOKAY_DEBUG
уровень отладки от 1 до 6. Этого также можно добиться с помощью tokay -dddd
, где каждый d
увеличивает уровень отладки. Кроме того, для TOKAY_INSPECT
можно задать одно или список имен парселетов (-префиксов), которые следует проверять в пошаговой трассировке виртуальной машины ( TOKAY_DEBUG=6
).
Уровень | Режим |
---|---|
0 | Нет отладки |
1 | Распечатать построенный AST |
2 | Распечатать окончательную промежуточную программу |
3 | Распечатать скомпилированную программу виртуальной машины |
4 | Распечатать трассировку выполнения виртуальной машины |
5 | Распечатать содержимое стека виртуальной машины |
6 | Отладчик кода операции виртуальной машины |
Просмотрите разобранный AST программы на уровне отладки 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
устанавливает конкретный уровень отладки для парсера, который реализован в самом Tokay и является частью компилятора. Здесь можно распознать только уровни > 2, так как AST парсера встроен в код.
Вот отладчик виртуальной машины в действии, запускающий простую программу «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)))
Язык программирования токай назван в честь токайского геккона (Gekko gecko) из Азии, выкрикивающего по ночам «токен».
К счастью, логотип и значок Tokay были разработаны Тиммитифкуэлем.
Также посетите репозиторий tokay-artwork, чтобы найти различные версии логотипа.
Авторские права © 2024, Ян Макс Мейер, Phorward Software Technologies.
Tokay — бесплатное программное обеспечение под лицензией MIT.
Подробности смотрите в файле ЛИЦЕНЗИИ.