ไลบรารีไวยากรณ์การแยกวิเคราะห์การแยกวิเคราะห์ (PEGTL) เป็นไลบรารี combinator ตัวแยกวิเคราะห์ส่วนหัวแบบไม่มีการพึ่งพาอาศัยกันเป็นศูนย์สำหรับการสร้างตัวแยกวิเคราะห์ตามไวยากรณ์การแสดงออกของการแยกวิเคราะห์ (PEG)
ในระหว่างการพัฒนาเวอร์ชันหลักใหม่สาขาหลักสามารถผ่านการเปลี่ยนแปลงที่เข้ากันไม่ได้ สำหรับประสบการณ์ที่มั่นคงโปรดดาวน์โหลดรุ่นล่าสุดแทนที่จะใช้สาขาหลัก
สำหรับคำถามและข้อเสนอแนะเกี่ยวกับ Pegtl เรื่องราวความสำเร็จหรือความล้มเหลวและข้อเสนอแนะประเภทอื่น ๆ โปรดอย่าลังเลที่จะเปิดการสนทนาปัญหาหรือคำขอดึงหรือติดต่อผู้เขียนที่ taocpp(at)icemx.net
ไวยากรณ์ถูกเขียนเป็นรหัส C ++ ปกติที่สร้างขึ้นด้วยการเขียนโปรแกรมเทมเพลต (ไม่ใช่การเขียนโปรแกรมเมตาเทมเพลต) เช่นการสร้างอินสแตนซ์เทมเพลตที่ซ้อนกันซึ่งสอดคล้องกับคำจำกัดความอุปนัยของหมุด (และวิธีการแยกวิเคราะห์อื่น ๆ )
ชุดของกฎตัวแยกวิเคราะห์ที่ครอบคลุมซึ่งสามารถรวมและขยายโดยผู้ใช้ได้รวมอยู่เช่นเดียวกับกลไกสำหรับการดีบักไวยากรณ์และสำหรับการแนบการกระทำที่ผู้ใช้กำหนดไว้กับกฎไวยากรณ์ นี่คือตัวอย่างของวิธีการใช้กฎไวยากรณ์การแสดงออกของการแยกวิเคราะห์เป็นคลาส C ++ กับ PEGTL
// PEG rule for integers consisting of a non-empty
// sequence of digits with an optional sign:
// sign ::= '+' / '-'
// integer ::= sign? digit+
// The same parsing rule implemented with the PEGTL:
using namespace tao ::pegtl ;
struct sign : one< ' + ' , ' - ' > {};
struct integer : seq< opt< sign >, plus< digit > > {};หมุดมีความคล้ายคลึงกับไวยากรณ์ที่ปราศจากบริบท (CFGs) อย่างไรก็ตามธรรมชาติของหมุดที่กำหนดขึ้นจะก่อให้เกิดความแตกต่างที่สำคัญมาก การวิเคราะห์ไวยากรณ์ที่รวมอยู่พบข้อผิดพลาดทั่วไปหลายประการในหมุดรวมถึงการเรียกซ้ำซ้าย
Pegtl ได้รับการออกแบบให้เป็น "Lean and Mean" ห้องสมุดหลักประกอบด้วยรหัสประมาณ 6,000 บรรทัด การเน้นคือความเรียบง่ายและประสิทธิภาพเลือกวิธีการง่าย ๆ ที่ได้รับการปรับแต่งอย่างดีมากกว่าการปรับให้เหมาะสมที่ซับซ้อน
Pegtl ส่วนใหญ่เกี่ยวข้องกับการแยกวิเคราะห์และกฎไวยากรณ์และให้ผู้ใช้ของไลบรารี (ความเป็นไปได้) ควบคุมอย่างเต็มที่ในด้านอื่น ๆ ทั้งหมดของการแยกวิเคราะห์ ไม่ว่าจะมีการกระทำใดและโครงสร้างข้อมูลใดที่ถูกสร้างขึ้นระหว่างการแยกวิเคราะห์หรือไม่นั้นขึ้นอยู่กับผู้ใช้ทั้งหมด
รวมเป็นตัวอย่างบางส่วนสำหรับสถานการณ์ทั่วไปเช่นการแยกลำดับการหลบหนีในสตริงการสร้างโครงสร้างข้อมูล JSON ทั่วไปและการประเมินผลการแสดงออกทางคณิตศาสตร์แบบทันที
ผ่านการใช้การเขียนโปรแกรมเทมเพลตและความเชี่ยวชาญของเทมเพลตมันเป็นไปได้ที่จะเขียนไวยากรณ์หนึ่งครั้งและใช้ในหลายวิธีด้วยการกระทำที่แตกต่างกัน (ความหมาย) ในการแยกวิเคราะห์การแยกวิเคราะห์ (หรือเดียวกัน) ที่แตกต่างกัน
ด้วยการจัดระเบียบ PEG การแยกออกเป็น lexer และ parser stages มักจะลดลง - ทุกอย่างทำในไวยากรณ์เดียว กฎจะแสดงใน C ++ เป็นอินสแตนซ์ของเทมเพลตและเป็นงานของคอมไพเลอร์ในการเพิ่มประสิทธิภาพไวยากรณ์ PEGTL
การกระทำแต่ละครั้งจะได้รับการทดสอบโดยอัตโนมัติด้วยสถาปัตยกรรมหลายระบบระบบปฏิบัติการคอมไพเลอร์และเวอร์ชันของมัน
การกระทำแต่ละครั้งจะถูกตรวจสอบด้วย gcc และ clang sanitizers, เครื่องวิเคราะห์แบบคงที่ของ Clang และ clang-tidy นอกจากนี้เราใช้ CodeQL เพื่อสแกนปัญหา (ความปลอดภัย)
การครอบคลุมรหัสถูกวัดโดยอัตโนมัติและการทดสอบหน่วยครอบคลุม 100% ของรหัสห้องสมุดหลัก (สำหรับการเผยแพร่)
การเปิดตัวจะทำตามเวอร์ชันความหมาย การเปลี่ยนแปลง API ที่เข้ากันไม่ได้นั้นได้รับอนุญาตให้เกิดขึ้นระหว่างรุ่นหลัก เท่านั้น
ในการชื่นชมการมีส่วนร่วมทั้งหมดที่นี่คือคนที่มีส่วนร่วมโดยตรงกับ PEGTL และ/หรือการพัฒนา
Pegtl เป็นส่วนหนึ่งของศิลปะของ C ++
ลิขสิทธิ์ (c) 2550-2566 Daniel Frey และ Dr. Colin Hirsch
PEGTL ได้รับการรับรองซอฟต์แวร์โอเพ่นซอร์ส ได้รับใบอนุญาตภายใต้ข้อกำหนดของใบอนุญาตซอฟต์แวร์ Boost เวอร์ชัน 1.0 ทำซ้ำที่นี่
Boost Software License - เวอร์ชัน 1.0 - 17 สิงหาคม 2546
ได้รับอนุญาตโดยไม่เสียค่าใช้จ่ายสำหรับบุคคลหรือองค์กรใด ๆ ที่ได้รับสำเนาของซอฟต์แวร์และเอกสารประกอบที่ครอบคลุมโดยใบอนุญาตนี้ ("ซอฟต์แวร์") ที่จะใช้ทำซ้ำแสดงผลแจกจ่ายดำเนินการและส่งซอฟต์แวร์และเตรียมงานอนุพันธ์ของซอฟต์แวร์
ประกาศลิขสิทธิ์ในซอฟต์แวร์และคำแถลงทั้งหมดนี้รวมถึงการให้สิทธิ์การใช้งานข้างต้นข้อ จำกัด นี้และข้อจำกัดความรับผิดชอบต่อไปนี้จะต้องรวมอยู่ในสำเนาทั้งหมดของซอฟต์แวร์ทั้งหมดหรือบางส่วนและงานอนุพันธ์ทั้งหมดของซอฟต์แวร์เว้นแต่สำเนาหรืองานอนุพันธ์ดังกล่าว
ซอฟต์แวร์มีให้ "ตามสภาพ" โดยไม่มีการรับประกันใด ๆ ไม่ว่าโดยชัดแจ้งหรือโดยนัยรวมถึง แต่ไม่ จำกัด เฉพาะการรับประกันความสามารถในการค้าการออกกำลังกายเพื่อวัตถุประสงค์เฉพาะชื่อและการไม่ละเมิด ไม่ว่าในกรณีใดผู้ถือลิขสิทธิ์หรือใครก็ตามที่แจกจ่ายซอฟต์แวร์จะต้องรับผิดชอบต่อความเสียหายหรือความรับผิดอื่น ๆ ไม่ว่าจะเป็นในสัญญาการละเมิดหรืออื่น ๆ เกิดขึ้นจากหรือเกี่ยวข้องกับซอฟต์แวร์หรือการใช้งานหรือการติดต่ออื่น ๆ ในซอฟต์แวร์