ฉันคิดว่าน่าจะสนุกที่จะพักจากเนื้อหาที่เป็นประโยชน์และเป็นประโยชน์เพื่อแสดงเคล็ดลับปาร์ตี้ Ruby ที่เรียบร้อย
ก่อนที่ Ruby จะรันโปรแกรมของคุณ จะต้องแยกวิเคราะห์ก่อน parser เป็นเครื่องของรัฐชนิดหนึ่ง และมีแฟล็กบรรทัดคำสั่งที่ไม่ค่อยมีใครรู้จักซึ่งคุณสามารถใช้เพื่อทำให้ Ruby บันทึกทุกอย่างที่เครื่องของรัฐทำ
ยกตัวอย่างต่อไปนี้:
a = 1 + 2
ถ้าฉันเรียกใช้โดยใช้ -y
ตั้งค่าสถานะ ฉันได้รับผลลัพธ์ต่อไปนี้:
$ ruby -y sample.rb
Starting parse
Entering state 0
Reducing stack by rule 1 (line 903):
-> $$ = nterm $@1 ()
Stack now 0
Entering state 2
Reading a token: Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 35
Reading a token: Next token is token '=' ()
Reducing stack by rule 509 (line 4417):
$1 = token tIDENTIFIER ()
-> $$ = nterm user_variable ()
Stack now 0 2
Entering state 113
Next token is token '=' ()
Reducing stack by rule 100 (line 1764):
$1 = nterm user_variable ()
-> $$ = nterm lhs ()
Stack now 0 2
...
140 more lines
สิ่งที่เราเห็นที่นี่คือ Ruby parser ที่หมุนเวียนผ่านแต่ละโทเค็นในไฟล์และดำเนินการดังต่อไปนี้:
- เพิ่มโทเค็นลงในสแต็ก
- เปรียบเทียบสแต็กกับรายการกฎ
- หากโทเค็นตรงกับกฎ ให้ทำการเปลี่ยนสถานะ
- หากไม่ตรงกัน ให้เพิ่มโทเค็นอื่นลงในสแต็กแล้วลองอีกครั้ง
สถานะและกฎทั้งหมดถูกกำหนดไว้ในไฟล์ parse.y ที่ประมวลผลโดยตัวสร้าง parser parser เพื่อสร้าง parser จริงซึ่งอยู่ใน C.