Tokay เป็นภาษาโปรแกรมที่ออกแบบมาสำหรับการแยกวิเคราะห์เฉพาะกิจ
สำคัญ
Tokay อยู่ระหว่างการพัฒนาและยังไม่ได้รับการพิจารณาให้ใช้ในการผลิต ร่วมเป็นส่วนหนึ่งของการพัฒนาอย่างต่อเนื่องของ Tokay และมีส่วนร่วม!
Tokay มีวัตถุประสงค์เพื่อให้เป็นภาษาโปรแกรมที่สามารถใช้เพื่อแก้ไขปัญหาการประมวลผลข้อความได้อย่างรวดเร็ว ซึ่งอาจเกี่ยวข้องกับการแยกข้อมูลอย่างง่าย แต่ยังรวมถึงการแยกวิเคราะห์โครงสร้างวากยสัมพันธ์หรือส่วนต่างๆ และการแปลงข้อมูลเป็นแผนผังการแยกวิเคราะห์ที่มีโครงสร้างหรือแผนผังไวยากรณ์นามธรรมเพื่อการประมวลผลต่อไป
ดังนั้น Tokay จึงไม่เพียงแต่กลายเป็นเครื่องมือที่ใช้งานได้จริงสำหรับ one-liner ธรรมดาๆ เช่น Matchers หรือ Recognizer เท่านั้น แต่ยังเป็นภาษาที่สามารถใช้เพื่อนำเครื่องวิเคราะห์โค้ด เครื่องมือการปรับโครงสร้างองค์กร ล่าม คอมไพเลอร์ หรือ Transpilers ไปใช้อีกด้วย ที่จริงแล้วโปรแกรมแยกวิเคราะห์ภาษาของ Tokay นั้นถูกนำไปใช้ใน Tokay เอง
Tokay ได้รับแรงบันดาลใจจาก awk มีรูปแบบทางวากยสัมพันธ์และความหมายจาก Python และ Rust แต่ยังเป็นไปตามปรัชญา แนวคิด และหลักการออกแบบของตัวเองอีกด้วย ดังนั้น Tokay จึงไม่สามารถเปรียบเทียบได้โดยตรงกับภาษาหรือโครงการอื่นๆ และมีความโดดเด่นในตัวเอง มันเป็นภาษาโปรแกรมใหม่ทั้งหมด
Tokay ยังเป็นโครงการใหม่และมีศักยภาพมาก อาสาสมัครยินดีต้อนรับ!
ด้วยการใช้ตัวจัดการการพึ่งพาของ Rusts และ build-tool cargo
เพียงติดตั้ง Tokay ด้วย
$ cargo install tokay
สำหรับดิสโทรที่ใช้ Arch Linux ยังมีแพ็คเกจ tokay
และ tokay-git
ใน Arch Linux AUR
"Hello World" เวอร์ชันของ Tokay ค่อนข้างชัดเจน
print("Hello World")
$ tokay 'print("Hello World")' Hello World
Tokay ยังสามารถทักทาย w(l)ds ใดๆ ก็ตามที่ถูกป้อนเข้าไปได้ โปรแกรมถัดไปจะพิมพ์ "Hello Venus", "Hello Earth" หรือ "Hello" ตามด้วยชื่ออื่นใดที่แยกวิเคราะห์ก่อนหน้านี้โดย Word
-token ในตัว ข้อมูลอื่นๆ นอกเหนือจากคำจะถูกละเว้นโดยอัตโนมัติ
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
ยังสามารถตั้งค่าเป็นหนึ่งหรือรายการชื่อพาร์สเล็ต (-คำนำหน้า) ซึ่งควรตรวจสอบในการติดตามทีละขั้นตอนของ VM ( TOKAY_DEBUG=6
)
ระดับ | โหมด |
---|---|
0 | ไม่มีการดีบัก |
1 | พิมพ์สร้าง AST |
2 | พิมพ์โปรแกรมระดับกลางขั้นสุดท้าย |
3 | พิมพ์โปรแกรม VM ที่คอมไพล์แล้ว |
4 | พิมพ์การติดตามการดำเนินการ VM |
5 | พิมพ์เนื้อหาสแต็ก VM |
6 | ดีบักเกอร์ VM opcode |
ดู 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
ตั้งค่าระดับการดีบักเฉพาะสำหรับ parser ซึ่งนำไปใช้ใน Tokay เองและเป็นส่วนหนึ่งของคอมไพเลอร์ ที่นี่สามารถจดจำได้เฉพาะระดับ > 2 เท่านั้น เนื่องจาก AST ของ parser ถูกสร้างขึ้นในโค้ด
นี่คือการทำงานของดีบักเกอร์ VM ที่รันโปรแกรม "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)))
ภาษาโปรแกรม Tokay ตั้งชื่อตามตุ๊กแก Tokay (ตุ๊กแกตุ๊กแก) จากเอเชีย โดยตะโกนคำว่า "โทเค็น" ในตอนกลางคืน
โลโก้และไอคอน Tokay ได้รับการออกแบบโดย Timmytiefkuehl
ตรวจสอบพื้นที่เก็บข้อมูล tokay-artwork เพื่อดูโลโก้เวอร์ชันต่างๆ เช่นกัน
ลิขสิทธิ์ © 2024 โดย Jan Max Meyer, Phorward Software Technologies
Tokay เป็นซอฟต์แวร์ฟรีภายใต้ใบอนุญาต MIT
โปรดดูไฟล์ใบอนุญาตสำหรับรายละเอียด