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의 핵심 기능 중 하나입니다.
_ : 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
또는 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
)에서 검사해야 하는 구문 분석 이름(-prefixes) 중 하나 또는 목록으로 설정할 수 있습니다.
수준 | 방법 |
---|---|
0 | 디버그 없음 |
1 | 구성된 AST 인쇄 |
2 | 최종 중간 프로그램 인쇄 |
3 | 컴파일된 VM 프로그램 인쇄 |
4 | VM 실행 추적 인쇄 |
5 | VM 스택 내용 인쇄 |
6 | VM opcode 디버거 |
디버그 수준 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)))
Tokay 프로그래밍 언어는 밤에 "토큰"을 외치는 아시아 출신의 Tokay gecko(Gekko gecko)의 이름을 따서 명명되었습니다.
Tokay 로고와 아이콘은 감사하게도 Timmytiefkuehl이 디자인했습니다.
다양한 버전의 로고를 보려면 tokay-artwork 저장소를 확인하세요.
저작권 © 2024년 Jan Max Meyer, Phorward Software Technologies.
Tokay는 MIT 라이센스를 따르는 무료 소프트웨어입니다.
자세한 내용은 LICENSE 파일을 참조하세요.