(รูปหมายเลข 159)
- แดรกเลือกชื่อ ขณะนี้คือ end แล้วคลิกขวาเลือก Refactor ตามด้วยเลือก Rename...
(รูปหมายเลข 160)
(รูปหมายเลข 161)
- บรรทัดที่ 96 และ 97 ประกาศแอตทริบิวต์คลาส SymbolTable และ TokenStream ตามลำดับ
- บรรทัดที่ 99 สร้างเมธอดชื่อ addNewToken โดยมี tokenName และ tokenTypeIndex เป็น Parameters กระบวนการคือเพิ่ม tokenName และ tokenTypeIndex ให้กับ symbolTable
- บรรทัดที่ 101 ขอ tokenNameIndex ผ่านเมธอด getTokenNameIndex ของ symbolTable เพื่อนำไปเพิ่มยัง tokenStream พร้อมกับ tokenTypeIndex
(รูปหมายเลข 162)
(รูปหมายเลข 163)
(รูปหมายเลข 164)
- เช่นเดียวกัน ภายใต้ประโยค isOperators... ของประโยค else if เรียกเมธอด addNewToken เพื่อกำหนดให้ currentChar มีประเภทเป็น Operators
(รูปหมายเลข 165)
- เมื่อได้หนึ่งคำ (หรือ word) จึงนำไปถามต่อว่า คำนี้ใช่ประเภท Keywords หรือไม่ ถ้าใช่ก็เรียกเมธอด addNewToken แล้วกำหนดให้เป็นประเภท Keywords ถ้าไม่ใช่จึงให้เป็นประเภท Identifiers
- สุดท้ายถามว่า currentChar ไม่ใช่ END (คือยังไม่จบ Source Code) ใช่ไหม หากผลลัพธ์เป็น true ให้ลดค่า countOfSourceCode ลงเสียหนึ่ง เพื่อนป้องกันการอ่านข้าม currentChar ตัวปัจจุบันที่หลุดออกจาก while ลูปในอัลกอริทึมครับ
(รูปหมายเลข 166)
- การทำงานก็คล้ายกับการตัด Keywords และ Identifiers ที่เพื่อนๆพึ่งสังเกตผ่านมาครับ เพียงแต่ผมใช้ boolean ที่ชื่อ isFloatingPointLiterals ช่วยชี้ว่าควรเป็นจำนวนเต็ม (Integer Literals) หรือทศนิยม (Floating-point Literals) หากพบว่าตัวแปร currentChar มีค่าเป็น '.' (dot) ก็จะเข้าสู่ส่วนที่เป็นทศนิยมทันทีครับ (กรอบสีน้ำตาลเข้ม)
- ภายหลังจึงถามว่าตัวแปร isFloatingPointLiterals มีค่าเป็น ture ให้เป็นจำนวนทศนิยม เมื่อเป็น false ให้เป็นจำนวนเต็ม
- สุดท้ายถามว่า currentChar ไม่ใช่ END (คือยังไม่จบ Source Code) ใช่ไหม หากผลลัพธ์เป็น true ให้ลดค่า countOfSourceCode ลงเสียหนึ่ง เพื่อนป้องกันการอ่านข้าม currentChar ตัวปัจจุบันที่หลุดออกจาก while ลูปในอัลกอริทึมครับ
(รูปหมายเลข 167)
- ส่วนการทำงานภายในขณะนี้ยังไม่มีครับ ^^ (ก็ยังไม่ได้ใช้ประโยชน์)
(รูปหมายเลข 168)
เป็นอันว่าคลาส Lexical ของเราพร้อมตัดคำแล้ว บทความต่อไปเรามาทดสอบกันครับ
อ่านเนื้อหาที่เกี่ยวข้อง ก่อนหน้า หรือ ถัดไป
ไม่มีความคิดเห็น:
แสดงความคิดเห็น