คุณจะได้อะไรถ้าคุณเพิ่มพารามิเตอร์ลงในไวยากรณ์ฟรีตามบริบท


13

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

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

คำถามของฉัน: ไวยากรณ์ประเภทนี้ (CFG พร้อมพารามิเตอร์) มีชื่อหรือไม่

ดูเหมือนว่ามันจะไม่ยากที่จะเขียนตัวแยกวิเคราะห์โคตรซ้ำสำหรับไวยากรณ์นี้ (พารามิเตอร์ควรเป็นตัวแยกวิเคราะห์โดยทั่วไป) อะไรคือปัญหาของวิธีนี้?

การเพิ่มพารามิเตอร์เพิ่มระดับภาษาที่รองรับด้านบนโดยไม่มีบริบทหรือไม่


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

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


@HendrikJan แอตทริบิวต์ grammars เป็นวิธีการใส่คำอธิบายประกอบไวยากรณ์ด้วยการกระทำ semantic ซึ่งไม่ได้ควบคุมการแยกวิเคราะห์
AProgrammer

1
หากเป้าหมายคือการจัดการการเยื้องนั่นเหมาะสำหรับ tokenizer มากกว่าตัวแยกวิเคราะห์ ให้ tokenizer ปล่อย INDENT เสมือนและโทเค็น UNINDENT เมื่อระดับการเยื้องเปลี่ยนไป จากนั้นไม่จำเป็นต้องเพิ่มไวยากรณ์ภาษาด้วยข้อมูลเกี่ยวกับการเยื้อง
John Kugelman

คำตอบ:


14

ไวยากรณ์ไวยากรณ์แบบไม่มีเงื่อนไขของ Affix ได้รับการศึกษาอย่างกว้างขวางจากนักวิทยาศาสตร์คอมพิวเตอร์ชาวดัตช์ชื่อCornelis HA Kosterโดยเริ่มต้นจากกระดาษ 2505 "ภาษาอังกฤษขั้นพื้นฐาน ในปี 1970 เขาได้ผลิตแนวคิดที่เป็นทางการขึ้นมา ภาพรวมที่มีประโยชน์สามารถใช้ได้ในปี 1971 กระดาษของเขา "ติดไวยากรณ์สำหรับการเขียนโปรแกรมภาษา" รุ่นที่ฉันพบบนCiteseer

ในบทความนั้น Koster เปรียบเทียบพิธีการของเขา (และอีกอันหนึ่งที่คล้ายกัน) กับไวยากรณ์สองระดับของ Van Wijngaardenและพบว่าพวกเขามีความคล้ายคลึงกันมาก

บรรณานุกรมประกอบคำอธิบายประกอบอย่างย่อของ Dick Grune ของเทคนิคการวิเคราะห์คำรวมถึงการอ้างอิงที่มีประโยชน์อื่น ๆ จำนวนมากสำหรับไวยากรณ์ที่ติดอยู่และพิธีการที่ไม่ใช่ Chomskyian (ดูส่วนที่ 18.2.6 ของบรรณานุกรมแม้ว่าจะมีเอกสารที่เป็นประโยชน์ในส่วนอื่น ๆ ) Grune ครอบคลุม grammars ที่ติดอยู่ในเวลาสั้น ๆ ใน§ 15.3.2 ของเทคนิคการแยกวิเคราะห์รุ่นที่สอง: คู่มือปฏิบัติ (และสั้นกว่าในฉบับพิมพ์ครั้งแรก) มีออนไลน์) พูดถึงข้อเท็จจริงที่ว่ามันง่ายที่จะปรับเทคนิคการแยกวิเคราะห์จากบนลงล่าง (และอื่น ๆ )

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

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


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

@reierierpost: แน่นอนคุณมีสิทธิ์ใช้คำศัพท์ของคุณเอง สิทธิพิเศษนี้ไม่ได้ จำกัด อยู่ที่ไข่มนุษย์เท่านั้น อย่างไรก็ตามคู่มือ CDL เองอ้างว่า "CDL3 เป็นภาษาที่ใช้งานตามไวยากรณ์ที่ติดอยู่" ซึ่งฉันคิดว่าควรนำมาพิจารณา (สามารถดูคู่มือได้ที่ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdf ) นั่นคือสิ่งที่ฉันอ้างในคำตอบของฉัน: CDL นั้นมาจากผลงานของ Koster เกี่ยวกับไวยากรณ์ที่ติดอยู่ เมื่อ Grune ชี้ให้เห็นความแตกต่างระหว่าง affix และ Grammars คุณลักษณะนั้นเล็กน้อย ความแตกต่างของเขาคือว่าจะใช้ affixes ในการตัดสินใจความถูกต้องของวากยสัมพันธ์
rici

(ใบเสนอราคามาจากหน้าแรกของคู่มือ)
rici

ฉันรู้ ... และคุณพูดถูก ความคิดเห็นของฉันไม่ได้หมายความว่าจะขัดแย้งกับคุณ
reinierpost

6

รับบทแทรกสำหรับ CFG :

ใช้ไวยากรณ์

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

สิ่งนี้อธิบายถึงสามเหลี่ยมดาว:

*
**
***
**
*

ไม่มีวิธีที่จะแยกสามเหลี่ยมดาวออกเป็น 5 ส่วน เช่นเป็นรูปสามเหลี่ยมดาว (ด้วยไม่เว้นว่าง){ U v n W x n Y | n > 0 } v xuvwxy{uvnwxny|n>0}vx

ซึ่งหมายความว่าสามเหลี่ยมรูปดาวไม่ใช่ภาษาที่ไม่มีบริบท

หรือตัวอย่างที่ง่ายกว่า:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

สิ่งนี้อธิบายถึงภาษาซึ่งไม่ใช่บริบท{bnabnabn|n0}


3

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



Koster และกลุ่มของเขาศึกษา grammars ที่ติดอยู่สองแบบเท่าที่ฉันทราบ: 1) รูปแบบที่ จำกัด ของ Grammars Van Wijngaarden ซึ่งหมายถึงการจดจำที่ง่ายขึ้น; 2) ภาษา CDL ภาษาคำอธิบายคอมไพเลอร์ที่ใช้งานได้จริงโดยไม่มีการจัดการค่า affix อย่างชัดเจน แต่มีตัวเลือกในการกำหนดกฎในภาษาเป้าหมาย (เช่นแอสเซมเบลอร์) เพื่อทำให้ทัวริงสมบูรณ์
reinierpost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.