ในฐานะที่เป็นชื่อเรื่องว่าผมใช้เวลาสองสามชั่วโมงสุดสัปดาห์สุดท้ายพยายามที่จะตัดขึ้นใจของฉันเกี่ยวกับระดับของภาษาการจับคู่โดยการแสดงออกปกติ Perl ได้ที่ไม่รวมผู้ประกอบการจับคู่ใด ๆ ที่จะช่วยให้การรันโค้ดภายในรูปแบบ
หากคุณไม่ได้รู้ว่าสิ่งที่เป็น PCREs โปรดอ่านนี้และนี้
ปัญหาคือทรัพยากรที่มีอยู่บนอินเทอร์เน็ตหยุดอยู่ที่ภาษาที่ไม่มีบริบทและ PCREs สามารถจับคู่ได้มากกว่านั้น (ดูด้านล่าง) แต่ฉันไม่รู้ว่าจะหาทฤษฏีหรือเอกสารเพิ่มเติมเกี่ยวกับเรื่องแบบนี้ได้ที่ไหน
โดยเฉพาะอย่างยิ่ง: PCRE เป็นชุดภาษาปกติ (เนื่องจากไวยากรณ์ PCRE มีตัวดำเนินการภาษาปกติทั้งหมด)
CFG ใด ๆ สามารถใส่ในรูปแบบปกติของ Greibach ซึ่งจะทำการลบการเรียกซ้ำไปทางซ้าย ฉันคิดว่าสิ่งนี้สามารถใช้โดย(?(DEFINE)...)
กลุ่มเพื่อ "แปล" ไวยากรณ์เป็นรูทีนย่อยที่ตรงกันหลีกเลี่ยงที่จะสำลักในการเรียกซ้ำซ้ายโดยการแปล:
- non-terminal ที่หัวของการผลิตแต่ละครั้งจะกลายเป็นรูทีนย่อย
(?<HEAD>...)
- เนื้อหาของการผลิตแต่ละครั้งจะถูกใส่ไว้ในรูทีนย่อย เทอร์มินัลถูกทิ้งไว้ตามที่เป็นอยู่มินัลจะกลายเป็นการร้องขอขั้นตอน (เช่น
(?&NONTERMINAL)
); - โปรดักชั่นทั้งหมดที่มี nonterminal เช่นเดียวกับหัวเป็น ORed ร่วมกันโดยวิธีการของ
|
ผู้ประกอบการ (รวมทั้งการจัดกลุ่มเพิ่มเติมด้วย(?:...)
ถ้าจำเป็น) - รูปแบบนั้นจะกลายเป็น
(?(DEFINE)...)
กลุ่มที่มีการผลิต "แปล" ทั้งหมดและการร้องขอสำหรับกระบวนการของสัญลักษณ์เริ่มต้นเพื่อให้ตรงกับสตริงทั้งหมดเช่น^(?(DEFINE)...)(?&START)$
สิ่งนี้ควรจัดการกับ CFG ใด ๆ ดังนั้น PCREs ควรจะสามารถจับคู่ CFL ใด ๆ
ยังมีอีก: ลองใช้ภาษาง่าย ๆ คือภาษาของสตริงซ้ำกันสองครั้ง ภาษานี้ไม่ใช่ CFL - การแทรกศัพท์สำหรับ CFLs ล้มเหลว (ให้ความสนใจเป็นพิเศษว่า | v x w | ≤ p ต้องเก็บไว้ดังนั้นคุณจะไม่สามารถปั๊มจุดเริ่มต้นหรือจุดสิ้นสุดของสองสายซ้ำได้)
แต่ภาษานี้จะถูกจับคู่ได้อย่างง่ายดายโดย PCRE ^(.*)\1$
นี้: ดังนั้นเราจึงสูงกว่า CFL อย่างเคร่งครัด
เท่าไหร่ข้างต้น อย่างที่ฉันบอกว่าฉันไม่มีความคิด ฉันไม่สามารถหาแหล่งข้อมูลเกี่ยวกับ CSL หรือคลาสอื่น ๆ ทั้งหมดเพื่อทำการตัดสินใจได้ ผู้เชี่ยวชาญยินดีพูดคุยเรื่องนี้หรือไม่?
ภาคผนวก:ฉันถูกขอให้ระบุว่าชุดย่อยของไวยากรณ์ PCRE จะต้องได้รับอนุญาต ขณะที่ผมเขียนไว้ในตอนต้นของการโพสต์ผมอยากที่จะไม่รวมผู้ประกอบการที่ช่วยให้การดำเนินการภายในโค้ดของรูปแบบใด ๆ ??{}
เช่น
เพื่อประโยชน์ของการโต้แย้งฉันคิดว่าเราสามารถติดกับไวยากรณ์ที่กำหนดโดยpcresyntax (3)หน้าคนซึ่งเป็นส่วนย่อยที่เหมาะสมของสิ่งที่ Perl 5.10-5.12 ข้อเสนอลบ callouts (เพราะพวกเขาไม่ได้อยู่ในรูปแบบ) ฉันไม่แน่ใจว่าการเพิ่มหรือลบคำกริยาควบคุมการย้อนรอยเปลี่ยนภาษาที่เราสามารถจดจำได้ ถ้าเป็นเช่นนั้นมันจะเป็นการดีถ้าได้เรียนรู้ว่าเราจะเข้าร่วมคลาสใดและไม่มีคลาสใด