วันพุธที่ 22 ตุลาคม พ.ศ. 2557

สอนเขียนโปรแกรม Compiler เพื่อแสดงผล Animation ด้วยภาษา JAVA เบื้องต้น (Part 3 SyntaxTree)

จาก Part 2 เราได้ส่วนของ Parserไปแล้วเช่นกัน ต่อไปจะมาถึงส่วนสุดท้าย คือ การสร้าง SyntaxTree  เพื่อนำไปประมวลผลเพื่อแสดงเป็น animation โดย SyntaxTree นั้นก็คือโครงแบบสร้างต้นไม้ที่มี node แต่ละ node นั้นจะเก็บข้อมูล output ที่ได้จากการทำ SLR Parser ในส่วนที่ 2 เอาไว้ แล้วทำการเรียงลำดับใหม่ในรูปแบบของโครงสร้างต้นไม้เพื่อลำดับการทำงานในการแสดงผล animation โดยการท่องไปในต้นไม้ SyntaxTree นั้นจะใช้วิธีการ Depth First Search 

รายละเอียดส่วนที่ 3 SyntaxTree https://www.cs.duke.edu/courses/spring12/cps140/assign/proj3.pdf

Part 3 SyntaxTree


Part 3-1 สร้าง SyntaxTree


1. สร้างคลาส Node ซึ่งก็คือ Node ของโครงสร้างข้อมูลแบบของต้นไม้ โดยเก็บข้อมูลคำสั่งการทำงาน และ Node ลูก 2 Node คือ Nodeซ้าย และ Node ขวา

Untitled

2. สร้างคลาส Player ซึ่งก็คือ ผู้เล่นที่เป็นประเภทหนูหรือแมว

Untitled

3.สร้างคลาส Cat และคลาส Mouse ให้สืบทอดมาจากคลาส Player

UntitledUntitled

4.สร้างคลาสชื่อว่า commandTree ซึ่งคลาสนี้จะเป็นคลาสหลักในการสร้าง Syntax Tree และแสดงผล Animation โดยมี attribute และ constructor ดังรูป

Untitled

Untitled

5. สร้างเมธอดชื่อว่า genCommandTree โดยเมธอดนี้จะเป็นการสร้าง SyntaxTree ของตัวภาาษาโปรแกรม MoustCat

Untitled

ทดสอบว่าเราสร้าง SyntaxTree ถูกหรือไม่ โดยเราต้องใช้วิธีท่องไปในต้นไม้ SyxtaxTree โดยใช้วิธี Depth First Search  ตามที่กล่าวมาข้างต้น โดยให้ Node ด้านขวาต้องถูกอ่านให้หมดก่อน Node ด้านซ้าย

Untitled

ทดสอบ Input output SyntaxTree


Untitled

เมื่อใช้ Depth First Search ใน SyntaxTree เพื่อพิมพ์ข้อมูลภายใน Node ออกมาในแต่ละบรรทัดจะได้เป็น

Untitled

วาดรูปจำลองโครงสร้างข้อมูลแบบต้นไม้

Untitled

Part 3-2 สร้าง Animataion จาก SyntaxTree


วิธีสร้าง Animation จาก SyntaxTree นั้น ให้เปลี่ยนจากการ System.out เพื่อแสดงผล output เป็นการประมวลผลคำสั่งนั้นๆ แทน โดยในตัวอย่างนี้จะใช้เมธอดชื่อว่า showAnimation และมีอีกเมธอดนึงคือเมธอด travelRepeat ไว้สำหรับการทำงานแบบทำซ้ำ (loop)

Untitled

***กรณีถ้าเป็นคำสั่ง repeat (เช็คจากคำในช่องแรก ซึ่งก็คือ index ที่ 0 ) ให้ส่ง Node เริ่มต้นที่ต้องทำซ้ำ และจำนวนรอบที่ทำซ้ำไปที่เมธอด trabelRepeat (จำนวนรอบได้จากการแยกคำสั่งด้วยช่องว่าง โดยตัวเลขจำนวนรอบจะอยู่ index ที่ 1)

Untitled

ไม่มีความคิดเห็น:

แสดงความคิดเห็น