ความแตกต่างระหว่างนิพจน์ทั่วไปและไวยากรณ์ในออโตมาตะ


12

ฉันยังใหม่กับออโตมาตะและฉันได้รับการแนะนำสั้น ๆ เกี่ยวกับการแสดงออกปกติเมื่อวานนี้เท่านั้น ฉันได้อ่านกฎต่าง ๆ เพื่อกำหนดนิพจน์ทั่วไป แต่ฉันไม่สามารถแยกความแตกต่างระหว่างการแสดงออกปกติและไวยากรณ์ของภาษา (ฉันไม่ได้รับการสอนไวยากรณ์สำหรับการแสดงออกปกติ)

ฉันเข้าใจว่าไวยากรณ์ช่วยให้เราสามารถสร้างสตริงที่ถูกต้องในภาษา แต่นี่คือสิ่งที่กฎสำหรับการกำหนดสถานะการแสดงออกปกติ แล้วความแตกต่างอยู่ตรงไหน? ฉันถามอาจารย์ของฉันและเขาบอกว่า regex เป็นสตริงพื้นฐานที่สุดในภาษาและไวยากรณ์คือชุดของกฎสำหรับภาษาใด ๆ ซึ่งมีลำดับสูงกว่า regex บางคนสามารถให้ข้อมูลเชิงลึกเพิ่มเติมได้หรือไม่

คำตอบ:


22

นิพจน์ปกติไวยากรณ์ปกติและออโตไฟไนต์ จำกัด เป็นเพียงสามรูปแบบที่แตกต่างกันสำหรับสิ่งเดียวกัน มีอัลกอริทึมในการแปลงจากสิ่งใด ๆ เป็นอื่น

เหตุผลพื้นฐานที่เรามีทั้งสามอย่างก็คือพวกมันถูกสร้างขึ้นอย่างอิสระด้วยชุดแรกของการเทียบเคียง (มีพิธีการอื่น ๆ อีกหลายอย่างเช่นกัน) ที่พิสูจน์แล้วโดย Kleene (ผลลัพธ์นี้หรือบางส่วนเรียกว่าทฤษฎีบทของ Kleene)

ดังนั้นในบริบทนั้นขึ้นอยู่กับว่าคุณต้องการเรียกใช้แบบจำลองแบบไหนพวกเขาทั้งหมดรู้จักหรือสร้างสตริงของภาษาปกติและในทางคณิตศาสตร์ในแง่นั้นก็ไม่มีความแตกต่าง

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

เพื่อเปรียบเทียบทั้งสองลองนิยามมันกัน

นิพจน์ทั่วไป

ดังนั้นการแสดงออกปกติมีการกำหนดซ้ำดังนี้:

  1. ∅
  2. ε
  3. aa∈Σ
  4. AB
    • A⋅B
    • A∣B
    • A∗

พร้อมกับความหมายบางอย่าง (เช่นวิธีที่เราตีความผู้ประกอบการเพื่อรับสาย) เราได้รับวิธีการสร้างสตริงจากภาษาปกติ

ไวยากรณ์ปกติ

(N,Σ,P,S∈N)NΣSPΣ∗P

ไวยากรณ์เชิงเส้นขวา

BCaε

  1. B→a
  2. B→aC
  3. B→ε

Grammars เชิงเส้นซ้าย

B→Ca

สิ่งที่ต้องไตร่ตรอง

ดังนั้นเมื่อดูคำจำกัดความเหล่านี้และเล่นกับพวกเราเราจะเห็นว่านิพจน์ทั่วไปดูเหมือนกฎการจับคู่หรือวิธีจัดการกับสตริงในแต่ละครั้ง

S

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


ฉันให้ความสำคัญกับความจริงที่ว่าไวยากรณ์สร้างสตริงในภาษาในขณะที่นิพจน์ทั่วไป (ตามที่คุณพูด) เป็นรูปแบบการจับคู่ที่ตรงกับ (หรือ "ทดสอบ") ทุกสตริงในภาษา
— Ran G.

@ RanG. ซึ่งเป็นวิธีปกติในการคิด แต่คุณสามารถพลิกทั้งสอง การแยกวิเคราะห์จากล่างขึ้นบนทดสอบสตริงกับไวยากรณ์และคุณสามารถใช้นิพจน์ทั่วไปเป็นคำอธิบายแบบย่อของภาษาได้
— ลุคแมททีสัน

NSR

NRRP

@simpleBob อ่าใช่นั่นเป็นคำที่สะกดผิด ขอบคุณ!
— Luke Mathieson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.