EBNF ประกอบด้วยสองลักษณะสองประการใหญ่ๆ คือ Non-terminal และ Terminal มักเขียนครอบด้วยเครื่องหมาย < > สำหรับ Non-terminal และเครื่องหมาย " " สำหรับ Terminal ครับ เช่น
<start> -> <type> <name> ";"
<type> -> "int" | "float"
<name> -> ตัดจาก Lexical
จาก Grammar ตัวอย่างข้างต้น เราเรียก <start> ว่าตัวเริ่มต้น หรือ Start Symbol เรียกเครื่องหมาย -> ว่าการผลิต ดังนั้น <start> ซึ่งเป็น Non-terminal จึงผลิตได้ <type> <name> ";" ส่วน <type> ผลิตได้ "int" หรือ "float" โดยเครื่องหมาย | นี้หมายถึง หรือ (เลือกเอาอย่างใดอย่างหนึ่ง) และสุดท้าย <name> ผลิตได้ ชื่อใดๆที่ถูกตั้งและตัดได้จากกระบวนการ Lexical นั่นเองครับ
สรุปได้ว่า Non-terminal สามารถผลิตได้ Non-terminal หรือ Terminal อีกเท่าใดก็ได้ ส่วน Terminal นั้นไม่สามารถผลิตต่อไปได้อีก
จากนี้คือ Grammar ที่ผมประดิษฐ์ขึ้นเลียนแบบการประกาศตัวแปรของภาษา C โดย Grammar นี้จะนำมาใช้เป็นตัวอย่างตลอดทั้งเนื้อหาที่เกี่ยวกับหัวข้อ "โปรแกรม Compiler" ซึ่งมีหน้าที่ประกาศตัวแปร แบ่งออกเป็นตัวแปร Global และ Local พร้อมกับบังคับให้สร้างฟังก์ชัน Main อย่างง่ายหนึ่งฟังก์ชันครับ
<start> -> <variableDeclaration> <mainFunction>
<variableDeclaration> -> <type> <name> <assignment> <variableDeclaration2> ";" <variableDeclaration> | empty
<variableDeclaration2> -> "," <name> <assignment> <variableDeclaration2> | empty
<type> -> "int" | "float"
<assignment> -> "=" <expression> | empty
<assignment> -> "=" <expression> | empty
<expression> -> <addSubExpression>
<addSubExpression> -> <mulDivExpression> <addSubExpression2>
<addSubExpression2> -> <addSubSymbol> <mulDivExpression> <addSubExpression2> | empty
<addSubSymbol> -> "+" | "-"
<mulDivExpression> -> <primary> <mulDivExpression2>
<mulDivExpression2> -> <mulDivSymbol> <primary> <mulDivExpression2> | empty
<mulDivSymbol> -> "*" | "/" | "%"
<primary> -> <name> | <literal> | "(" <expression> ")"
<name> -> ตัดจาก Lexical เช่น a, b, c
<literal> -> ตัดจาก Lexical เช่น 10, 10.0
<mainFunction> -> "void" "main" "(" ")" "{" <variableDeclaration> "}"
***หมายเหตุ
ศัพท์ empty นี้หมายถึงไม่เกิดการผลิตสำหรับ Non-terminal นั้นต่อไป
หลังจากเพื่อนๆได้ทำความเข้าใจกับ Grammar ข้างต้น (สงสัยให้แสดงความเห็นไว้นะครับ) เราจะใช้เครื่องมือที่เรียกว่า Net Beans IDE เป็นตัวช่วยเขียนภาษาจาวาสำหรับการสร้างโปรแกรม Compiler นี้ต่อไป
ออกแบบแกรมม่ามันมีขั้นมากกว่านี้ ขอแตกรายละเอียดหน่อยสิค่ะ เช่น while_loop ,if_else ฯลฯ
ตอบลบขอเป็นวิธีการออกแบบ grammar ฉบับผมก็แล้วกันนะครับเพื่อน (ฉบับมาตรฐานผมลืมเกือบหมดแล้ว) เดี๋ยวจัดให้ครับ ขอบคุณครับที่กรุณาอ่านบทความ ขอบคุณๆ
ตอบลบ