หลังจากเขียนคลาส SourceCodeReader เสร็จไปแล้ว ผมใช้เวลาอีกสองชั่วโมงกว่าดูหนังเรื่อง Iron Man 2 หนังให้ข้อคิดที่สำคัญยิ่งต่อผมหลายข้อ หนึ่งในหลายข้อทำให้ผมเห็นว่า ทุกสิ่งที่มีค่าต่อเราไม่ได้มาอย่างง่ายดาย และหลายสิ่งที่มีค่ายิ่งกว่ามาจากตัวเรา ในเมื่อเวลาของเราทุกคนเท่ากันหมด ฉะไหนเราไม่ใช้สอยให้เกิดคุณประโยชน์อย่างที่สุด
คลาส Lexical
กลับมาที่ไฟล์ Lexical.java เราจะคิดอัลกลริทึมจัดการกับ Source Code ได้อย่างไร ?
(รูปหมายเลข 125)
- บรรทัดที่ 2 ประกาศอินสแตนท์ชื่อ sourceCode มีชนิดเป็น Char Array
- บรรทัดที่ 3 ประกาศตัวแปรชื่อ countOfSourceCode มีค่าเริ่มต้นเป็น 0 เพื่อนับจำนวนอักษรที่จะถูกอ่านจากเมธอด read()
- บรรทัดที่ 4 ประกาศตัวแปรคงชนิด char ชื่อ end ให้ค่าเป็น '$' เพื่อระบุว่าอ่านจนกระทั่งสิ้นสุด sourceCode แล้ว
- บรรทัดที่ 7 เมื่อรับ Source Code มาแล้วให้เปลี่ยนมันเป็น Char Array ด้วยเมธอด toCharArray() เก็บมันไว้กับอินสแตนท์ชื่อ sourceCode (ชื่อแอตทริบิวต์และชื่อพารามิเตอร์เหมือนกัน สำหรับจาวาเราสามารถใช้คำสั่ง this แยกแยะได้ โดย this จะหมายถึงแอตทริบิวต์)
- บรรทัดที่ 10 สร้างเมธอดชื่อ read() ให้ทำหน้าที่อ่าน sourceCode ส่งออกมาทีละตัวอักษร (ทุกครั้งที่เรียก) แล้วเพิ่มค่า countOfSourceCode ขึ้นทีละหนึ่งค่าเสมอ และเมื่ออ่านจนหมด sourceCode จะคืนค่าเป็น end
(รูปหมายเลข 126)
- สร้างเมธอดชื่อ start() ให้ทำหน้าที่เริ่มต้นกระบวนการตัดคำ
- ใช้ while วนรอบจนกว่าจะพบ end เพื่ออ่านอักษรทุกตัวจาก sourceCode โดยเมธอด read()
(รูปหมายเลข 127)
- กระบวนการ Lexical ทำหน้าที่แยก Source Code ออกเป็น Tokens หรือคำ สำหรับงานของเรานี้จะแบ่งประเภทของ Tokens ออกเป็น
Keywords,
Operators,
Separators,
Identifiers,
Integer Literals และ
Floating-point Literals
***หมายเหตุ เพื่อนๆสามารถศึกษาเพิ่มเติมได้จาก
- Java Programming Volume 1 (เริ่มตั้งแต่บทที่ 2 หน้า 51)
- www.roseindia.net
- จากรูป (หมายเลข 127) จึงต้องคิดอัลกอลิทึมเพื่อแยกประเภทของ Tokens โดย
- บรรทัดที่ 20 ถามว่า currentChar ใช่ Separators หรือไม่ ?
- บรรทัดที่ 22 ถามว่า currentChar ใช่ Operators หรือไม่ ?
- บรรทัดที่ 24 ถามว่า currentChar ใช่ตัวอักษร (ในภาษาของเรา) หรือไม่ ?
- บรรทัดที่ 26 ถามว่า currentChar ใช่ตัวเลขหรือไม่ ?
- บรรทัดที่ 29 พ้อง error เพราะ currentChar ไม่ถูกนิยามโดยภาษาของเรา
เหตุที่บรรทัดที่ 24 ถามถึงตัวอักษรก็เพราะ ถ้าใช่ตัวอักษร เราจะนำไปเชื่อมต่อรวมกันเป็นคำ แล้วแยกถามว่าใช่ Keywords หรือ Identifiers หลักการนี้ใช้กับบรรทัดที่ 26 เพื่อหาว่าตัวเลขที่ได้เป็น Integer Literals หรือ Floating-point Literals
แนวคิดต่อจากนี้ไม่ได้ใช้หลักการของ OOP เท่าที่ควรเลย ซึ่งความจริงประเภทของ Tokens ควรแบ่งออกเป็นคลาส เนื่องจากแต่ละประเภทต่างก็มีลักษณะและพฤติกรรมเป็นของตัวเองทั้งสิ้น แต่กระนั้นจะต้องสร้างคลาสขึ้นอีกมากและเพื่อเป็นการประหยัดเวลาของผมเอง ในภายหลังเมื่อเพื่อนๆเห็นควรใช้หลักการ OOP จึงค่อยกลับมาแก้ไข
ยังอยู่ที่ไฟล์ Lexical.java ให้เพื่อนๆโค้ดรายละเอียดของเมธอดที่ได้กล่าวมาแล้ว (จากรูปหมายเลข 127) ซึ่งอ้างจาก Grammar หรือภาษาตัวอย่างของเรา
(รูปหมายเลข 128)
(รูปหมายเลข 129)
(รูปหมายเลข 130)
(รูปหมายเลข 131)
(รูปหมายเลข 132)
(รูปหมายเลข 133)
อ่านเนื้อหาที่เกี่ยวข้อง ก่อนหน้า หรือ ถัดไป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น