นิพจน์ปกติที่เข้ากันได้กับ Perl รองรับภาษาใดบ้าง


23

ในฐานะที่เป็นชื่อเรื่องว่าผมใช้เวลาสองสามชั่วโมงสุดสัปดาห์สุดท้ายพยายามที่จะตัดขึ้นใจของฉันเกี่ยวกับระดับของภาษาการจับคู่โดยการแสดงออกปกติ 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 ต้องเก็บไว้ดังนั้นคุณจะไม่สามารถปั๊มจุดเริ่มต้นหรือจุดสิ้นสุดของสองสายซ้ำได้)

L={WW|WΛ* * * *}
|โวลต์xW|พี

แต่ภาษานี้จะถูกจับคู่ได้อย่างง่ายดายโดย PCRE ^(.*)\1$นี้: ดังนั้นเราจึงสูงกว่า CFL อย่างเคร่งครัด

เท่าไหร่ข้างต้น อย่างที่ฉันบอกว่าฉันไม่มีความคิด ฉันไม่สามารถหาแหล่งข้อมูลเกี่ยวกับ CSL หรือคลาสอื่น ๆ ทั้งหมดเพื่อทำการตัดสินใจได้ ผู้เชี่ยวชาญยินดีพูดคุยเรื่องนี้หรือไม่?

ภาคผนวก:ฉันถูกขอให้ระบุว่าชุดย่อยของไวยากรณ์ PCRE จะต้องได้รับอนุญาต ขณะที่ผมเขียนไว้ในตอนต้นของการโพสต์ผมอยากที่จะไม่รวมผู้ประกอบการที่ช่วยให้การดำเนินการภายในโค้ดของรูปแบบใด ๆ ??{}เช่น

เพื่อประโยชน์ของการโต้แย้งฉันคิดว่าเราสามารถติดกับไวยากรณ์ที่กำหนดโดยpcresyntax (3)หน้าคนซึ่งเป็นส่วนย่อยที่เหมาะสมของสิ่งที่ Perl 5.10-5.12 ข้อเสนอลบ callouts (เพราะพวกเขาไม่ได้อยู่ในรูปแบบ) ฉันไม่แน่ใจว่าการเพิ่มหรือลบคำกริยาควบคุมการย้อนรอยเปลี่ยนภาษาที่เราสามารถจดจำได้ ถ้าเป็นเช่นนั้นมันจะเป็นการดีถ้าได้เรียนรู้ว่าเราจะเข้าร่วมคลาสใดและไม่มีคลาสใด


2
โปรดระบุคำจำกัดความของ PCRE ที่คุณเลือกไว้ในคำถามเนื่องจากมีการเปลี่ยนแปลงระหว่างเวอร์ชัน Perl จริง regexes สามารถมีรหัส Perl โดยพลการทำให้ทัวริงสมบูรณ์
Gilles 'หยุดความชั่วร้าย'

ฉันเพิ่มบันทึกย่อท้ายหวังว่าจะทำให้ประเด็นนี้ชัดเจนยิ่งขึ้น
peppe

คำตอบ:


7

ฉันยังพบการโพสต์บล็อกนี้น่าสนใจอย่างมากhttp://nikic.github.io/2012/06/15/The-true-power-of-regular-expressions.html มันให้การพิสูจน์เดียวกันกับที่ฉันให้ไว้ก่อนหน้าเกี่ยวกับความจริงที่ว่า regexps รู้จัก CFLs (โดยการเขียนไวยากรณ์ใหม่ผ่านDEFINEบล็อก) และแม้แต่ CSL บางตัว (เช่นภาษาของสตริงซ้ำ) มันสร้างมันขึ้นมาและทำต่อไปโดยให้หลักฐานว่า regexps ที่มี backreferences นั้นเป็น NP-hard (โดยลด 3-SAT เป็น regexp)


2
เมื่อผู้เขียนบอกว่า "NP-complete" พวกเขาควรจะพูดว่า "NP-hard" ไม่มีการพิสูจน์ว่าคลาสของภาษา PCRE มีอยู่ใน NP
András Salamon

จริงมันก็ถูกบันทึกไว้ในความคิดเห็น
peppe

5

พวกเขาตัดสินใจใช้ภาษาที่คำนึงถึงบริบทเป็นส่วนใหญ่ (ซึ่งในขณะที่คุณชี้ให้เห็นว่าเป็นภาษาที่ไม่ใช้บริบท) ดูนี้ Perl พระสงฆ์โพสต์

ข้อมูลเชิงลึกเบื้องต้นคือ "หน่วยความจำ" ของเครื่องคือจำนวนของกลุ่มการจับภาพซึ่งมีขอบเขตแบบเป็นเส้นตรง


5
อาร์กิวเมนต์ที่คุณให้ในวรรคที่สองอธิบายว่าทำไม PCRE ไม่สามารถยอมรับมากขึ้นกว่าซี แต่ไม่ได้ว่าทำไมการรวมนี้เป็นที่แน่นอน (ซึ่งคุณแนะนำในวรรคแรกของคุณ) ดูเหมือนว่าบทความที่เชื่อมโยงจะให้การพิสูจน์ว่าเป็นเช่นนั้น
กราฟิลส์

คุณไม่สามารถจัดกลุ่มมากกว่าสิ่งที่อยู่ในสายป้อนเข้าและจำนวนกลุ่มได้รับการแก้ไขในรูปแบบที่กำหนดดังนั้นคุณจึงมีข้อ จำกัด ด้านบน (เส้นตรง) สำหรับหน่วยความจำที่รูปแบบใช้ ถึงกระนั้นฉันก็พลาดการพิสูจน์อย่างเป็นทางการของ PCRE -> การแปลงออโตเม
ติก

ใช่คุณสองคนพูดถูก ฉันได้แก้ไขคำตอบแล้ว
Xodarap

ดูperlmonks.org/?node_id=406253สำหรับการสนทนาก่อนหน้านี้
András Salamon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.