วันอังคารที่ 26 ตุลาคม พ.ศ. 2553

Compiler : คลาส SymbolTable (ภาษา Java)

เสร็จจากคลาส Token คราวนี้กลับมาจัดการคลาส SymbolTable ต่อ (มึนหรือยังครับ ^^)
(รูปหมายเลข 148)
- บรรทัดที่ 2 สร้างคลาสชื่อ EToken โดยให้สืบทอดมาจากคลาส Token อีกที เราเรียกคลาส EToken ว่าคลาสภายในคลาส (SymbolTable)
- บรรทัดที่ 3 คลาส EToken เพิ่มแอตทริบิวต์ชื่อ name มีชนิดเป็น String และเราจะใช้แอตทริบิวต์นี้เก็บชื่อ Token หรือคำที่เพิ่มเข้ามาครับ
- บรรทัดที่ 6 ภายหลังสร้าง Constructor ของคลาส EToken ที่รับเอา name, nameIndex, typeIndex มาแล้ว เราเรียกไปยัง Constructor ของคลาสที่สืบทอดมา (คลาสแม่) ซึ่งคือคลาส Token โดยคำสั่ง supper เพื่อส่ง nameIndex และ typeIndex ไปเก็บไว้ที่นั่น (ส่วน name เก็บไว้ยังแอตทริบิวต์ชื่อ name ของคลาส EToken เอง)
- บรรทัดที่ 10 เป็นต้นไปสร้าง Getter และ Setter ตามวิธีการที่ได้เสนอมาแล้วจากบทความก่อนหน้านี้ครับ

(รูปหมายเลข 148_1)
- เพิ่มเมธอด toString() ให้กับคลาส EToken
- กรอบสี่เหลี่ยมในรูป เราเรียกไปยัง toString() ของคลาสที่สืบทอดมา (Token) หรือกล่าวว่า นำสตริงของคลาสลูกต่อกับสตริงของคลาสแม่นั่นเองครับ

(รูปหมายเลข 149)
- บรรทัดที่ 22 ออกจากขอบเขตคลาส EToken (ในรูปหมายเลขบรรทัดอาจไม่สอดคล้องกับความจริง เนื่องจากผมได้ปรับปรุงคลาสนี้อีกหลายครั้ง หลังจากบทความนี้ถูก upload ไปแล้ว) สร้างแอตทริบิวต์ชื่อ symbolTable มีชนิดเป็นโครงสร้างข้อมูลชื่อ LinkedList โดยบังคับให้สามารถจัดการกับคลาส EToken หรือเรียกว่าเป็นการระบุ Generics คลาส

(รูปหมายเลข 150)
- เพื่อนๆต้องบอกตัวแปลภาษาจาวาด้วยว่า จะหา LinkedList ได้จากคำสั่ง
import java.util.LinkedList;
แต่หากเพื่อนๆใช้วิธีการกด Ctrl + Space bar แล้วค่อยๆพิมพ์ LinkedL... ณ บรรทัดที่ 22 ดังกล่าว แล้วกด Enter, NetBeans IDE จะช่วยจัดการเรื่อง import ให้อัตโนมัติ

(รูปหมายเลข 151)
- บรรทัดที่ 24 สร้างเมธอดชื่อ add โดยคืนค่าเป็นชนิด boolean
- เมธอดนี้รับ tokenName มีชนิดเป็น String และ tokenTypeIndex มีชนิดเป็น int
- สำหรับ tokenName คือชื่อ Token หรือคำที่ตัดได้จากกระบวนการ Lexical (ขณะนี้ยังโค้ดไม่เสร็จ) ที่ถูกส่งเข้ามาเพิ่มตรวจสอบว่าซ้ำกับชื่อ Token หรือคำที่ถูกบรรจุไว้ก่อนหรือไม่ ?
- บรรทัดที่ 25 เขียนอัลกอริทึมตรวสอบคำที่รับเข้ามา (tokenName) หากซ้ำกับชื่อคำที่มีอยู่ก่อน ก็จะคืนค่า false แล้วออกจากเมธอดทันที
- บรรทัดที่ 30 เมื่อคำไม่ซ้ำ สร้างออบเจ็กค์จากคลาส EToken โดยอ้างอิงกับอินสแตนท์ชื่อ newToken ผ่าน Constructor ส่ง tokenName, อันดับ (รหัส) ที่ได้รับ (ไม่ซ้ำ) และ tokenTypeIndex
- บรรทัดที่ 31 เพิ่มออบเจ็กค์ newToken ให้กับ LinkedList ชื่อ symbolTable ที่ได้สร้างไว้ก่อนแล้ว กล่าวคือเพิ่มคำใหม่ลงใน Symbol Table นั่นเอง
- สุดท้ายคืนค่า true ครับ

***หมายเหตุ อันดับ (รหัส) ที่ได้รับ (ไม่ซ้ำ) ในที่นี้ผมใช้จำนวนของคำที่อยู่ใน Symbol Table ครับ โดยเขียนเป็น symbolTable.size()

(รูปหมายเลข 152)
- สร้างเมธอด size() เพื่อคืนค่าจำนวนของคำที่มีอยู่ใน Symbol Table

(รูปหมายเลข 153)
- สร้างเมธอดชื่อ getTokenNameIndex() เพื่อขอหมายเลขรหัสของคำ โดยส่งชื่อคำเข้าไป (เอาชื่อไป เอารหัสมา)
- สร้างเมธอดชื่อ getTokenName() คราวนี้ส่งหมายเลขรหัสของคำเข้าไป ให้ออกมาเป็นชื่อของคำแทน (เอารหัสไป เอาชื่อมา)

(รูปหมายเลข 154)
- สร้างเมธอดชื่อ display() เพื่อแสดงรายการ Token ทั้งหมดที่อยู่ใน Symbol Table จากรูปเราเรียกไปยัง toString() ของคลาส EToken ในแต่ละรอบครับ

สิ้นสุดคลาส SymbolTable เท่านี้ โอกาสต่อไปเป็นทีของคลาส TokenType ครับ

อ่านเนื้อหาที่เกี่ยวข้อง ก่อนหน้า หรือ ถัดไป

1 ความคิดเห็น:

  1. What i don't realize is in fact how you are no longer really much more smartly-preferred than you might be now. You are very intelligent. You know thus significantly in relation to this subject, made me individually believe it from so many various angles. Its like women and men aren't fascinated until it is something to do with Lady
    gaga! Your personal stuffs great. All the time deal with it up!


    Also visit my web site: cellulite treatment reviews

    ตอบลบ