“ ไม่มีบริบท” หมายถึงอะไรในคำว่า "ไวยากรณ์ที่ไม่มีบริบท"


55

ด้วยจำนวนเนื้อหาที่พยายามอธิบายว่าไวยากรณ์ที่ปราศจากบริบท (CFG) คืออะไรฉันพบว่ามันน่าประหลาดใจที่น้อยมาก (ในตัวอย่างของฉันน้อยกว่า 1 ใน 20) ให้คำอธิบายว่าทำไมไวยากรณ์ดังกล่าวเรียกว่า "บริบท - ฟรี". และในใจของฉันไม่มีใครประสบความสำเร็จในการทำเช่นนั้น

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


4
เงยหน้าขึ้นมอง "Most vexing parse" สำหรับ C ++ ที่จะสอนคุณว่าทำไมบริบท -freeness จึงมีประโยชน์
ratchet freak

6
ฉันคิดว่าฉันรู้ว่าไวยากรณ์ปราศจากบริบทคืออะไรจนกว่าฉันจะอ่านคำจำกัดความของ Googled ตอนนี้ฉันหวังว่าฉันจะได้ภาพแกะสลักและผ้าห่มนุ่ม ๆ ... บางทีฉันอาจจะออกไปข้างนอก ... +1 สำหรับคำถามที่ดี รอคอยที่จะได้คำตอบที่เข้าใจได้!
BrianH

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

1
ดู wikipages ในไวยากรณ์บริบทฟรีและลำดับชั้นของชัม ในทางปฏิบัติการเขียนโปรแกรมภาษาแยก มีบริบทมักจะจัดการ "นอก" ของ "บริบทฟรี" (LR หรือ LL) แยกเช่นโดยตารางสัญลักษณ์บางคุณลักษณะหรือสภาพแวดล้อม
Basile Starynkevitch

1
ที่นี่มีการอ้างอิง xkcd: xkcd.com/1090
CaptainCodeman

คำตอบ:


61

หมายความว่ากฎการผลิตทั้งหมดมีเทอร์มินัลที่ไม่ใช่ด้านซ้ายมือเดียว

ตัวอย่างเช่นไวยากรณ์นี้ซึ่งรู้จักสตริงของวงเล็บที่จับคู่ ("()", "() ()", "(") ()) () ", ... ) ไม่มีบริบท:

S → SS
S → (S)
S → ()

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

ทีนี้ลองพิจารณาหลักไวยากรณ์อื่นที่รับรู้สตริงของรูปแบบ {a ^ nb ^ nc ^ n: n> = 1} (เช่น "abc", "aabbcc", "aaabbbccc"):

S  → abc
S  → aSBc
cB → WB
WB → WX
WX → BX
BX → Bc
bB → bb

ถ้าไม่ใช่เทอร์มินัลBนำหน้าด้วยอักขระเทอร์มินัล / ตัวอักษรcคุณเขียนคำนั้นใหม่เป็นWBแต่ถ้านำหน้าด้วยbคุณขยายไปถึงbbแทน นี่น่าจะเป็นสิ่งที่บริบทไวของไวยากรณ์ไวตามบริบทยิ่งทำให้

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

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

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

(หากคุณกำลังสงสัยว่าเครื่องไฟไนท์รัฐสามารถรับรู้ได้อย่างไรคำตอบนั้นเป็นนิพจน์ปกติ แต่ไม่ใช่ regexes สำหรับสเตียรอยด์ที่มีกลุ่มจับภาพและมองไปข้างหน้า / ดูล่วงหน้าที่คุณเห็นในภาษาโปรแกรมฉันหมายถึงสิ่งที่คุณสร้าง กับผู้ประกอบการเช่น[abc], |, *, +และ?. คุณจะเห็นว่าabbbzตรงกับ regex ab*zเพียงโดยการรักษาตำแหน่งปัจจุบันของคุณในสตริงและ regex ไม่มีสแต็คจำเป็นต้อง.)


14
คำอธิบายที่ดีมาก แม้ว่าเทปของทัวริงไม่จำเป็นต้องไม่มีที่สิ้นสุด แต่ไม่ จำกัด เพียง อาจมีโรงงานผลิตเทปที่ปลายทั้งสองด้านซึ่งเมื่อเครื่องกระแทกเข้าเครื่องก็จะทำให้เทปเพิ่มขึ้น ด้วยวิธีนี้ ณ เวลาใดเวลาหนึ่งก็ จำกัด
Mike Dunlavey

2
@ MikeDunlavey ขอบคุณสำหรับการชี้แจงแก้ไขมัน
Doval

10
แต่โรงงานผลิตเทปต้องใช้วัสดุการผลิตเทปที่ไม่มีที่สิ้นสุดหรือวัสดุการผลิตเทปที่ไม่มีที่สิ้นสุดหรือ ... [ล้นสแต็ค]
flamingpenguin

8
@ Mehrdad: คุณสามารถจำลองจำนวนสแต็คใด ๆ โดยใช้สองกอง: เก็บสแต็คทั้งหมดไว้ด้านบนของสแต็คหนึ่งและเมื่อคุณจำเป็นต้องเข้าถึงสแต็กต่อไปลงป๊อปสแต็คด้านบนแล้วดันลงสแต็คที่สอง สิ่งนี้พิสูจน์ให้เห็นว่าสแต็ค n> 2 ไม่ทรงพลังกว่า 2 สแต็ค ทีนี้ไม่ว่าสแต็ค 2 อันจะทรงพลังมากกว่า 1 กองหรือเปล่า สัญชาตญาณของฉันบอกว่าไม่ แต่อาจขึ้นอยู่กับว่าสแต็คดั้งเดิมคืออะไร
Jörg W Mittag

10
@ JörgWMittag: สองกองก็ดีพอ ๆ กับเทป Hand-wavily: ใช้หนึ่ง stack เป็นด้านซ้ายของเทปและ stack อื่น ๆ เป็นด้านขวาโดยสัมพันธ์กับตำแหน่งปัจจุบันของคุณ ดังนั้น 2-PDA เป็นเครื่องทัวริง สำหรับพื้นฐานคุณเพียงแค่ต้องสามารถป๊อปอัพค่าจากสแต็กหนึ่งและผลักดันมันในอื่น ๆ ซึ่งเป็นวิธีที่คุณย้ายไปตามเทปของคุณ
Steve Jessop

20

คำตอบอื่น ๆ ค่อนข้างยาวแม้ว่าจะถูกต้องและถูกต้อง นี่เป็นเวอร์ชั่นย่อ

หากคุณมีสตริงของอักขระ (เทอร์มินัลและ nonterminals) และคุณต้องการแทนที่ nonterminal ในสตริงไวยากรณ์ที่ไม่มีบริบทช่วยให้คุณทำเช่นนั้นได้

พิจารณากฎต่อไปนี้ (ตัวพิมพ์เล็กเป็นเทอร์มินัลตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก):

A -> a
AB -> a

ในกฎข้อแรกคุณสามารถแทนที่A สิ่งที่ปรากฏอยู่รอบ ๆ (บริบท) ในกฎข้อที่สองคุณไม่สามารถแทนที่นอกจากจะตามมาด้วยA Bในขณะที่ nonterminals ทั้งสองจะถูกแทนที่ในกรณีที่จุดสำคัญคือว่า nonterminals รอบAเรื่อง อย่างใดอย่างหนึ่งไม่สามารถแทนที่BAด้วยaหรือBด้วยa: เท่านั้นAตามด้วยBเนื่องจากการสั่งซื้อบริบทของ nonterminals มีความสำคัญ นี่หมายถึงบริบทของเรื่องที่ไม่เกี่ยวกับกฎในกฎข้อที่สองทำให้มีความอ่อนไหวต่อบริบทในขณะที่กฎข้อแรกไม่มีบริบท


นี่เป็นคำอธิบายที่ดีจริง ๆ แม้ว่าฉันจะไม่ได้รับการรับรองความถูกต้องหรือความสมบูรณ์ก็ตาม มันคือทั้งหมดที่มีไปหรือไม่
rick

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

@Snowman: crisp.It มากจะดีกว่าถ้าคุณบอกว่า "คุณไม่สามารถได้รับมาไปaจากABเว้นแต่Aจะตามด้วยBแทนที่จะพูดว่า 'คุณไม่สามารถแทนที่A' ซึ่งอาจจะเป็นไปไม่ได้เพราะจริง ๆ แล้วคุณจะเปลี่ยนABไม่ได้ มันได้หรือไม่
justin

@ เพียงถูกต้อง ฉันอัปเดตคำตอบเพื่อให้ชัดเจนยิ่งขึ้น

@Snowman: คุณหมายถึงการแทนที่AหรือABในกฎข้อที่สอง (คำนึงถึงบริบท) หรือไม่ฉันคิดว่าคุณยังคงพยายามที่จะแทนที่Aดังกล่าวจากคำตอบของคุณ
justin

7

เพื่อให้เข้าใจถึงความแตกต่างและคำศัพท์ที่ดีกว่ามันเป็นความคิดที่ดีเพื่อความคมชัดเป็นภาษาบริบทฟรีเหมือนnnกับหนึ่งในบริบทเช่นnnคn (สัญลักษณ์: a, b, และ c เป็นตัวอักษรที่นี่และเลขชี้กำลังnหมายถึงการทำซ้ำตัวอักษรnครั้ง, n > 0, พูด) ตัวอย่างเช่นaabbcหรือaabbbccไม่ได้อยู่ในภาษาหลังในขณะที่aabbccเป็น

ผู้ยอมรับภาษาที่ปราศจากบริบท a n b nสามารถทำสัญญาหนึ่งคู่aและbไม่ว่าอะไรจะเกิดขึ้นรอบตัว (เช่นไม่คำนึงถึงบริบทที่ปรากฏใน ab) และมันจะทำงานได้อย่างถูกต้องยอมรับเฉพาะสตริงในภาษาและปฏิเสธสิ่งอื่นใด S -> aSb | abเช่นไวยากรณ์คือ ทราบว่ามีขั้วไม่มีทางด้านซ้ายของการผลิต (s) (มีกฎการผลิตอยู่สองข้อ แต่เราเพียงแค่เขียนให้กะทัดรัด) ผู้ยอมรับสามารถตัดสินใจในพื้นที่โดยไม่มีบริบท

ในทางตรงกันข้ามคุณไม่สามารถทำอะไรเช่นนั้นสำหรับภาษาที่มีความอ่อนไหวตามบริบท a n b n c nเพราะสำหรับหลังคุณต้องจำบริบทที่คุณอยู่อย่างใดนั่นคือคุณหด AB จำนวนเท่าใดเพื่อจับคู่กับการหดตัว ของ bc ไวยากรณ์สำหรับภาษาหลังคือ

S -> abc | aBSc
Ba -> aB
Bb -> bb

โปรดทราบว่าคุณมีทั้งเทอร์มินัลและไม่ใช่เทอร์มินัลด้านซ้ายในกฎสองข้อสุดท้าย เทอร์มินัลทางด้านซ้ายเป็นบริบทที่สามารถขยายเทอร์มินัลที่ไม่ใช่


Bootnote เกี่ยวกับคำศัพท์ "สัญญา" และ "ขยาย" ฯลฯ : แม้ว่าไวยากรณ์ที่เป็นทางการคือ [อย่างเป็นทางการ, ฮะ] กำเนิด, วิธีที่พวกเขานำมาใช้จริงใน parsers เป็นจริง reductionist เช่นคุณติดต่อทุกอย่างเพื่อที่ไม่ใช่ขั้วโดยทั่วไป การใช้กฎ "ในสิ่งที่ตรงกันข้าม" ซึ่งเป็นสาเหตุที่แม้แต่ไวยากรณ์แรกที่ให้ไว้ข้างต้นไม่สามารถนำไปใช้ในโปรแกรมได้ (มันจะทำให้คุณมีความขัดแย้งกะ - ลดความโด่งดังเพราะคุณไม่สามารถตัดสินใจได้ว่าจะใช้กฎใด) แต่ทั้งสองข้อ ไวยากรณ์เพียงพอต่อการแสดงความแตกต่างระหว่างบริบทและบริบท ปัญหาของความคลุมเครือในไวยากรณ์ที่ไม่มีบริบทนั้นค่อนข้างซับซ้อนและไม่ใช่หัวข้อของคำถามนี้ดังนั้นฉันจะไม่พูดเพิ่มเติมที่นี่โดยเฉพาะอย่างยิ่งเนื่องจากปรากฏว่า Wikipedia มีบทความที่เหมาะสม. ในทางกลับกันบทความเกี่ยวกับบริบทที่ไม่มีบริบทและโดยเฉพาะอย่างยิ่งภาษาที่มีความอ่อนไหวตามบริบทคือ! @ # $ @! # $ โดยเฉพาะอย่างยิ่งถ้าคุณยังใหม่กับหัวข้อ ... ฉันคิดว่านั่นเป็นสิ่งที่อยู่ในรายการสิ่งที่ต้องทำของฉัน


5

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

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

Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun

ฯลฯ ...

จากนั้นคุณสามารถเขียนโปรแกรมและส่งประโยคใดก็ได้และโปรแกรมสามารถใช้ไวยากรณ์เพื่อกำหนดว่าส่วนใดของประโยคแต่ละคำคือและความสัมพันธ์ที่พวกเขามีต่อกัน

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

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

Sentence -> SubjectPart PredicatePart
SubjectPart -> Adjective Noun
PredicatePart -> VerbPhrase ObjectNounPhrase
VerbPhrase ObjectNounPhrase -> VerbPhrase Adjective Noun

คุณสามารถสร้างคำนาม "คำคุณศัพท์" ให้เป็น ObjectNounPhrase ได้หากว่ามันเกิดขึ้นหลังจาก VerbPhrase

โดยทั่วไปหากคุณมีงานผลิตและคุณสามารถนำไปใช้งานได้ทุกเวลาที่ต้องการไม่ว่าจะอยู่รอบ ๆ มันจะไม่มีบริบท

คุณสามารถบอกได้เสมอว่าไวยากรณ์นั้นปราศจากบริบทหรือไม่ ตรวจสอบว่ามีสัญลักษณ์มากกว่าหนึ่งสัญลักษณ์ที่ด้านซ้ายของลูกศรหรือไม่

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

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

สิ่งที่ดียิ่งกว่าคือมีโปรแกรมที่คุณสามารถให้คำอธิบายของไวยากรณ์และรายการคำสั่งเกี่ยวกับสิ่งที่ต้องทำในแต่ละส่วน (ในแง่ที่แนบ "ความหมาย" กับการผลิตแต่ละครั้ง) และโปรแกรมจะเขียนโปรแกรมแยกวิเคราะห์ สำหรับคุณ. โปรแกรมจะแยกประโยคหาโครงสร้างและเรียกใช้คำแนะนำของคุณในแต่ละส่วนของโครงสร้าง โปรแกรมประเภทนี้เรียกว่า parser-generator หรือ compiler-compiler

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

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

โดยทั่วไปเราไม่ใช้ไวยากรณ์ที่ไวต่อบริบทเพราะมันได้รับการสนับสนุนที่ไม่ดีกว่า ฉันไม่ทราบว่ามีตัวเปรียบเทียบกับตัวแยกวิเคราะห์ LR (k) สำหรับภาษาที่คำนึงถึงบริบทหรือไม่ ใช่เครื่องทัวริง (หรือเครื่องเชื่อมโยงเชิงเส้น) สามารถแยกวิเคราะห์ได้ แต่ฉันไม่รู้ว่ามีอัลกอริทึมทั่วไปสำหรับการเปลี่ยนไวยากรณ์ไวตามบริบทเป็นโปรแกรมสำหรับเครื่องทัวริงในแง่ที่ LR (1) ) เครื่องกำเนิดไฟฟ้าทำตารางแยกวิเคราะห์สำหรับเครื่องกดลง ฉันเดาว่าตารางที่รองรับ parser จะใหญ่กว่าแบบทวีคูณ ไม่ว่าในกรณีใดนักเรียน CS (เช่นตัวฉันเองในสมัยก่อน) มักจะสอนไวยากรณ์ที่ไม่มีบริบทและเครื่องกำเนิดไฟฟ้าตัวแยกวิเคราะห์ LR (1) เช่น YACC


-1

ไวยากรณ์ที่ไม่มีบริบทไม่พิจารณาบริบทใด ๆ สำหรับกฎการผลิต บริบทเป็นเทอร์มินัลหรือไม่ใช่เทอร์มินัล

ดังนั้น: ไวยากรณ์ที่ไม่มีบริบทจะมีเพียงเทอร์มินัลเดียวทางด้านซ้ายของกฎการผลิต


3
สิ่งนี้จะเพิ่มคำตอบที่มีอยู่? นอกจากนี้กฎการผลิตที่มีเทอร์มินัลอย่างน้อยสองรายการขึ้นไปทางด้านซ้ายมือก็ไม่ได้รับบริบทเช่นกัน

ฉันคิดว่าคำตอบที่ได้รับนั้นยาวเกินไป หากมีใครจะเพิ่ม TL; DR ฉันจะลบอันนี้
Martin Thoma

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