วันพฤหัสบดีที่ 28 ตุลาคม พ.ศ. 2553

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

กระบวนการ Parser
ทั่วไปแล้วกระบวนการนี้แบ่งออกเป็นสองขั้นตอน ได้แก่ Syntax และ Semantic ซึ่งอาจเขียนแยกหรือรวมกันไว้ในกระบวนการ Parser ก็ได้ แต่ตามความเห็นส่วนตัว ผมแนะนำให้เขียนแบบรวมกันครับ (น่าจะง่ายกว่าหรือเปล่า ?)

เตรียมคลาส Parser
(รูปหมายเลข 174)
- ประกาศแอตทริบิวต์ชื่อ symbolTable มีชนิดเป็นคลาส SymbolTable และชื่อ tokenStream มีชนิดเป็นคลาส TokenStream
- สร้าง Constructor รับอาร์กิวเมนต์ symbolTable กำหนดให้แอตทริบิวต์ symbolTable และอาร์กิวเมนต์ tokenStream กำหนดให้แอตทริบิวต์ tokenStream ซึ่งแยกจากกันด้วย this

(รูปหมายเลข 175)
- บรรทัดที่ 10 ประกาศแอตทริบิวต์ชื่อ currentToken พร้อมกำหนดค่าออบเจ็กต์ให้ เราจะใช้ currentToken เพื่อเก็บ Token ปัจจุบันเอาไว้ทุกครั้งที่เรียกเมธอด read
- บรรทัดที่ 11 ประกาศแอตทริบิวต์ชื่อ end พร้อมกำหนดค่าออบเจ็กต์ให้ เราจะใช้ end แสดงถึงการอ่านกระทั่งสิ้นสุดสาย tokenStream
- บรรทัดที่ 12 ประกาศตัวแปรชื่อ countOfTokenStream เพื่อนับจำนวน Token ที่ถูกอ่านโดยเมธอด read
- บรรทัดที่ 14 สร้างเมธอดชื่อ read เพื่อทำหน้าที่อ่าน Token จากออบเจ็กต์ tokenStream ทีละ Token ทุกครั้งที่เรียกเมธอดนี้ การทำงานที่สำคัญคือ copy by value จากอินสแตนท์ token ให้กับ currentToken (กรอบสีส้ม) กระทั่งอ่านจนสิ้นสาย tokenStream (ค่า countOfTokenStream เท่ากับ tokenStream.size()) currentToken จะมีค่าเป็น end

(รูปหมายเลข 176)
- สร้างเมธอดชื่อ isMatchSymbol เพื่อถามว่าสตริงที่กำหนดให้นี้ เป็นเช่นเดียวกับ (equals) สตริงชื่อของ currentToken หรือไม่
- กลไกที่จะทำให้ชื่อรหัส (tokenNameIndex) เปลี่ยนเป็นชื่อ Token ได้ (tokenName) จะต้องส่งชื่อรหัสดังกล่าวให้กับบริการ getTokenName ของออบเจ็คก์ symbolTable

(รูปหมายเลข 177)
- สร้างเมธอดชื่อ isMathType เพื่อถามว่าค่าคงที่ (int) ที่กำหนดให้นี้ เหมือนกันกับ (==) ประเภทรหัส (tokenTypeIndex) หรือไม่ เช่นส่ง TokenType.KEYWORDS เหมือนกันกับ tokenTypeIndex คืนค่า true หรือไม่คืนค่า false

(รูปหมายเลข 178)
- สร้างเมธอดชื่อ error เพื่อแจ้งความผิดพลาด และยุติการทำงานของ Parser จากคำสั่ง System.exit(0);

(รูปหมายเลข 179)
- บรรทัดที่ 50 สร้างเมธอดชื่อ isName เพื่อถามว่า currentToken ปัจุบันมีประเภทเป็น IDENTIFIERS คืนค่า true หรือไม่คืนค่า false
- บรรทัดที่ 57 สร้างเมธอดชื่อ isType เพื่อถามว่า currentToken ปัจจุบันมีชื่อเป็น int หรือ float คืนค่า true หรือไม่คืนค่า false
- บรรทัดที่ 64 สร้างเมธอดชื่อ isLiteral เพื่อถามว่า currentToken ปัจจุบันมีประเภทเป็น INTEGER_LITERALS หรือ FLOATING_POINT_LITERALS คืนค่า true หรือไม่คืนค่า false

(รูปหมายเลข 180)
- สร้างเมธอดชื่อ isAddSubSymbol เพื่อถามว่า currentToken ปัจจุบันใช่เครื่องหมาย "+" หรือ "-" หรือไม่
- สร้างเมธอดชื่อ isMulDivSymbol เพื่อถามว่า currentToken ปัจจุบันใช่เครื่องหมาย "*" หรือ "/" หรือ "%" หรือไม่

บทความถัดไปคือการโค้ดขั้นตอนตรวจสอบ Syntax ภาษาโปรแกรมครับ

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

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

  1. Today, I went to the beach with my kids.
    I found a sea shell and gave it to my 4 year old daughter and said "You can hear the ocean if you put this to your ear." She put the shell to her ear and screamed.

    There was a hermit crab inside and it pinched her ear.
    She never wants to go back! LoL I know this is completely off
    topic but I had to tell someone!

    Also visit my webpage :: cellulite treatment

    ตอบลบ