นี่คือตัวแยกวิเคราะห์ PHP ระยะเริ่มต้นที่ออกแบบมาสำหรับสถานการณ์การใช้งาน IDE ตั้งแต่เริ่มต้น (ดูเป้าหมายการออกแบบสำหรับรายละเอียดเพิ่มเติม) ยังมีงานอีกมากที่ต้องทำ ดังนั้น ณ จุดนี้ repo นี้ส่วนใหญ่ทำหน้าที่เป็นการทดลองและเป็นจุดเริ่มต้นของการสนทนา
นี่คือสาขา v0.1 ซึ่งเปลี่ยนโครงสร้างข้อมูลเพื่อรองรับไวยากรณ์ที่เพิ่มหลังจากบรรทัดการเปิดตัว 0.0.x เริ่มต้น
หลังจากที่คุณกำหนดค่าเครื่องของคุณแล้ว คุณสามารถใช้ parser เพื่อสร้างและทำงานกับ Abstract Syntax Tree (AST) ผ่าน API ที่เป็นมิตร
<?php// คลาสที่จำเป็นในการโหลดอัตโนมัติ __DIR__ "/vendor/autoload.php";use MicrosoftPhpParser{DiagnosticsProvider, Node, Parser, PositionUtilities};// สร้างอินสแตนซ์ parser ใหม่ $parser = new Parser();// Return และพิมพ์ AST จากเนื้อหาสตริง$astNode = $parser ->parseSourceFile('<?php /* comment */ echo "สวัสดี!"');var_dump($astNode);// รับและพิมพ์ข้อผิดพลาดจาก AST Node parser จัดการข้อผิดพลาดได้อย่างงดงาม// ดังนั้นจึงสามารถใช้ในสถานการณ์การใช้งาน IDE (ซึ่งโค้ดมักจะไม่สมบูรณ์).$errors = DiagnosticsProvider::getDiagnostics($astNode);var_dump($errors);// สำรวจโหนดที่สืบทอดมาจาก $astNodeforeach ($astNode->getDescendantNodes() เป็น $descendant) {if ($อินสแตนซ์สืบทอดของ NodeStringLiteral) {// พิมพ์ข้อความ Node (โดยไม่มีช่องว่างหรือความคิดเห็น)var_dump($descendant->getText());// Node ทั้งหมดลิงก์กลับไปยังพาเรนต์ ดังนั้นจึงง่ายต่อการนำทางใน tree.$grandParent = $descendant->getParent ()->getParent();var_dump($grandParent->getNodeKindName());// AST เป็นตัวแทนอย่างสมบูรณ์และสามารถปัดเศษไปที่ แหล่งที่มาดั้งเดิม// ช่วยให้ผู้บริโภคสามารถสร้างการจัดรูปแบบที่เชื่อถือได้และการปรับโครงสร้างใหม่ tools.var_dump($grandParent->getLeadingCommentAndWhitespaceText()); }// นอกเหนือจากการเรียกข้อมูลรายการย่อยหรือรายการสืบทอดของโหนดทั้งหมดแล้ว // โหนดยังเปิดเผยคุณสมบัติเฉพาะของประเภทโหนด if ($descendant instance of NodeExpressionEchoExpression) {$echoKeywordStartPosition = $descendant->echoKeyword->getStartPosition();// เพื่อลดการใช้หน่วยความจำ ตำแหน่งจะแสดงเป็นจำนวนเต็มเดี่ยว// ดัชนีในเอกสาร แต่ตำแหน่งบรรทัดและอักขระนั้นทำได้ง่าย ดึงข้อมูล.$lineCharacterPosition = PositionUtilities::getLineCharacterPositionFromPosition($echoKeywordStartPosition,$descendant->getFileContents() );echo "บรรทัด: $lineCharacterPosition->บรรทัด, ตัวละคร: $lineCharacterPosition->ตัวละคร"; - -
หมายเหตุ: API ยังไม่เสร็จสมบูรณ์ ดังนั้นโปรดแจ้งปัญหาให้เราทราบว่าคุณต้องการเปิดเผยฟังก์ชันการทำงานใดบ้าง แล้วเราจะดูว่าเราทำอะไรได้บ้าง! นอกจากนี้โปรดแจ้งข้อบกพร่องใด ๆ ที่มีพฤติกรรมที่ไม่คาดคิดในแผนผังการแยกวิเคราะห์ เรายังอยู่ในช่วงเริ่มต้น และข้อเสนอแนะใดๆ ที่คุณได้รับจะได้รับการชื่นชมอย่างมาก
การออกแบบที่ทนต่อข้อผิดพลาด - ในสถานการณ์ IDE โค้ดไม่สมบูรณ์ตามคำจำกัดความ ในกรณีที่ป้อนรหัสไม่ถูกต้อง parser ควรยังสามารถกู้คืนและสร้างแผนผังที่ถูกต้อง + สมบูรณ์ได้ เช่นเดียวกับการวินิจฉัยที่เกี่ยวข้อง
รวดเร็วและมีน้ำหนักเบา (ควรสามารถแยกวิเคราะห์ซอร์สโค้ดได้หลาย MB ต่อวินาที เพื่อให้มีที่ว่างสำหรับฟีเจอร์อื่นๆ)
โครงสร้างข้อมูลที่มีประสิทธิภาพหน่วยความจำ
อนุญาตให้แยกวิเคราะห์ส่วนเพิ่มในอนาคต
เป็นไปตามข้อกำหนดภาษา PHP รองรับทั้งไวยากรณ์ PHP5 และ PHP7
AST ที่สร้างขึ้นจะให้คุณสมบัติ (ตัวแทนโดยสมบูรณ์ ฯลฯ) ที่จำเป็นสำหรับการดำเนินการทางความหมายและการเปลี่ยนแปลง ซึ่งจำเป็นต้องมีประสิทธิภาพเช่นกัน
เป็นตัวแทนอย่างสมบูรณ์และสามารถย้อนกลับไปยังข้อความที่แยกวิเคราะห์ได้ (ช่องว่างและความคิดเห็น "เรื่องไม่สำคัญ" ทั้งหมดรวมอยู่ในแผนผังการแยกวิเคราะห์)
สามารถสำรวจต้นไม้ผ่านโหนดหลัก/รองได้อย่างง่ายดาย
เวลาตอบสนอง UI < 100 ms ดังนั้นแต่ละการทำงานของเซิร์ฟเวอร์ภาษาควร < 50 ms เพื่อให้มีที่ว่างสำหรับสิ่งอื่น ๆ ทั้งหมดที่เกิดขึ้นพร้อมกัน
เรียบง่ายและบำรุงรักษาได้เมื่อเวลาผ่านไป - parsers มีแนวโน้มที่จะเกิดความสับสน รวดเร็ว มาก ดังนั้นความสามารถในการอ่านและการแก้ไขข้อบกพร่องจึงมีความสำคัญสูง
ทดสอบได้ - โปรแกรมแยกวิเคราะห์ควรสร้างต้นไม้แยกวิเคราะห์ที่ถูกต้องและพิสูจน์ได้ เราบรรลุเป้าหมายนี้โดยการกำหนดและทดสอบชุดค่าคงที่เกี่ยวกับต้นไม้อย่างต่อเนื่อง
API ที่เป็นมิตรและสื่อความหมายเพื่อให้ผู้อื่นต่อยอดได้ง่าย
เขียนด้วย PHP - ทำให้ชุมชน PHP ใช้งานและมีส่วนร่วมได้ง่ายที่สุดเท่าที่จะเป็นไปได้
เพื่อให้มั่นใจว่ามีระดับความถูกต้องเพียงพอในทุกขั้นตอน parser จึงได้รับการพัฒนาโดยใช้แนวทางส่วนเพิ่มต่อไปนี้:
ขั้นตอนที่ 1: เขียน lexer ที่ไม่รองรับไวยากรณ์ PHP แต่รองรับ EOF และโทเค็นที่ไม่รู้จัก เขียนการทดสอบสำหรับค่าคงที่ทั้งหมด
ระยะที่ 2: รองรับไวยากรณ์คำศัพท์ PHP และการทดสอบมากมาย
ขั้นตอนที่ 3: เขียน parser ที่ไม่รองรับไวยากรณ์ PHP แต่สร้างแผนผังของ Error Nodes เขียนการทดสอบสำหรับค่าคงที่ทั้งหมด
ระยะที่ 4: รองรับไวยากรณ์ไวยากรณ์ PHP และการทดสอบมากมาย
ระยะที่ 5 (อยู่ระหว่างดำเนินการ): การตรวจสอบและการเพิ่มประสิทธิภาพในโลกแห่งความเป็นจริง
ความถูกต้อง: ตรวจสอบว่าไม่มีข้อผิดพลาดเกิดขึ้นกับโค้ดเบสตัวอย่าง การวัดประสิทธิภาพเทียบกับพาร์เซอร์อื่นๆ (ตรวจสอบกรณีที่ไม่เห็นด้วย) การทดสอบแบบคลุมเครือ
ประสิทธิภาพ: โปรไฟล์, การวัดประสิทธิภาพเทียบกับแอปพลิเคชัน PHP ขนาดใหญ่
ขั้นตอนที่ 6: จัดทำ API ให้เสร็จสิ้นเพื่อให้ผู้คนใช้งานได้ง่ายที่สุด
โครงสร้างทางไวยากรณ์ของ PHP บางส่วน (ได้แก่ นิพจน์ผลผลิต และสตริงเทมเพลต) ยังไม่ได้รับการสนับสนุน และยังมีข้อบกพร่องเบ็ดเตล็ดอื่นๆ ด้วย อย่างไรก็ตาม เนื่องจาก parser ทนทานต่อข้อผิดพลาด ข้อผิดพลาดเหล่านี้ได้รับการจัดการอย่างสวยงาม และแผนผังผลลัพธ์จะเสร็จสมบูรณ์ เพื่อให้เข้าใจถึงจุดที่เราอยู่แบบองค์รวมมากขึ้น คุณสามารถเรียกใช้ชุดการทดสอบ "การตรวจสอบความถูกต้อง" ได้ (ดูแนวทางการสนับสนุนสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการรันการทดสอบ) หรือเพียงแค่ดูผลการทดสอบการตรวจสอบในปัจจุบัน
แม้ว่าเราจะยังไม่ได้เริ่มขั้นตอนการเพิ่มประสิทธิภาพ แต่เราได้เห็นผลลัพธ์ที่น่าหวังและยังมีพื้นที่อีกมากมายสำหรับการปรับปรุง ดูวิธีการทำงานเพื่อดูรายละเอียดเกี่ยวกับวิธีการปัจจุบันของเรา และทำการทดสอบประสิทธิภาพบนเครื่องของคุณเองเพื่อดูด้วยตัวคุณเอง
เป้าหมายการออกแบบ - เรียนรู้เกี่ยวกับเป้าหมายการออกแบบของโครงการ (คุณลักษณะ ตัวชี้วัดประสิทธิภาพ และอื่นๆ)
เอกสารประกอบ - เรียนรู้วิธีอ้างอิง Parser จากโปรเจ็กต์ของคุณ และวิธีการดำเนินการบน AST เพื่อตอบคำถามเกี่ยวกับโค้ดของคุณ
Syntax Visualizer Tool - สัมผัสความรู้สึกที่จับต้องได้มากขึ้นสำหรับ AST สร้างสรรค์ - ดูสิว่าคุณจะทำลายมันได้หรือไม่!
สถานะและแนวทางปัจจุบัน - รองรับไวยากรณ์จำนวนเท่าใด ผลงาน? หน่วยความจำ? ความเสถียรของ API?
วิธีการทำงาน - เรียนรู้เกี่ยวกับสถาปัตยกรรม การตัดสินใจในการออกแบบ และข้อดีข้อเสีย
เล็กเซอร์และพาร์เซอร์
กลยุทธ์การยอมรับข้อผิดพลาด
การแยกวิเคราะห์ที่เพิ่มขึ้น
เปิดคำถาม
กลยุทธ์การตรวจสอบ
มีส่วนช่วย! - เรียนรู้วิธีการมีส่วนร่วม ดูคำแนะนำบางประการเกี่ยวกับความมุ่งมั่นด้านการศึกษาที่จะช่วยให้คุณก้าวขึ้นไปบน Codebase (แม้ว่าคุณจะไม่เคยทำงานกับ Parser มาก่อนก็ตาม) และขั้นตอนการทำงานที่แนะนำซึ่งทำให้ง่ายต่อการทำซ้ำ
โครงการนี้ได้นำหลักจรรยาบรรณของ Microsoft Open Source มาใช้ สำหรับข้อมูลเพิ่มเติม โปรดดูคำถามที่พบบ่อยเกี่ยวกับจรรยาบรรณหรือติดต่อ [email protected] หากมีคำถามหรือความคิดเห็นเพิ่มเติม