คำตอบข้างต้นให้คำนิยามที่ชัดเจนว่ามันคืออะไร ลองดูว่าฉันสามารถใส่มันในคำพูดของฉันเองเพื่อที่คุณจะได้ 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