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


12

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

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

คำตอบ:


22

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

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

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

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

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

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

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

  1. ε
  2. aaΣ
  3. AB
    • AB
    • AB
    • A

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

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

(N,Σ,P,SN)NΣSPΣP

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

BCaε

  1. Ba
  2. BaC
  3. Bε

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

BCa

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

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

S

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


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

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

NSR

NRRP

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