คำถามติดแท็ก context-free-grammar

20
C ++ ไม่มีบริบทหรือคำนึงถึงบริบทหรือไม่
ฉันมักจะได้ยินคำกล่าวอ้างว่า C ++ เป็นภาษาที่คำนึงถึงบริบท นำตัวอย่างต่อไปนี้: a b(c); นี่เป็นคำนิยามตัวแปรหรือการประกาศฟังก์ชันหรือไม่ cที่ขึ้นอยู่กับความหมายของสัญลักษณ์ ถ้าcเป็นตัวแปรแล้วa b(c);กำหนดชื่อตัวแปรประเภทb มันจะเริ่มต้นได้โดยตรงกับa cแต่ถ้าcเป็นประเภทแล้วa b(c);ประกาศฟังก์ชั่นที่มีชื่อbที่ใช้และส่งกลับca หากคุณค้นหาคำจำกัดความของภาษาที่ไม่มีบริบทมันจะบอกคุณโดยทั่วไปว่ากฎไวยากรณ์ทั้งหมดต้องมีด้านซ้ายมือที่ประกอบด้วยสัญลักษณ์ที่ไม่ใช่เทอร์มินัล ในทางกลับกันไวต่อไวยากรณ์อนุญาตให้ใช้สตริงของเทอร์มินัลและสัญลักษณ์ที่ไม่ใช่เทอร์มินัลโดยพลการด้านซ้ายมือ การเรียกดูผ่านภาคผนวก A ของ "ภาษาการเขียนโปรแกรม C ++" ฉันไม่สามารถหากฎไวยากรณ์เดียวที่มีสิ่งอื่นนอกเหนือจากสัญลักษณ์ที่ไม่ใช่เทอร์มินัลเดียวที่ด้านซ้ายมือ นั่นหมายความว่า C ++ นั้นไม่มีบริบท (แน่นอนว่าภาษาที่ไม่มีบริบททุกภาษานั้นมีความอ่อนไหวตามบริบทด้วยในแง่ที่ว่าภาษาที่ไม่ใช้บริบทนั้นเป็นส่วนย่อยของภาษาที่คำนึงถึงบริบท แต่นั่นไม่ใช่ประเด็น) ดังนั้น C ++ ไม่มีบริบทหรือตามบริบทหรือไม่

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

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

2
ทำไมไวยากรณ์ BNF ของ C อนุญาตการประกาศด้วยชุดคำสั่ง init ที่ว่างเปล่า
เมื่อมองผ่าน BNF ไวยากรณ์ของ C ฉันคิดว่ามันแปลกที่กฎการผลิตสำหรับการประกาศมีลักษณะเช่นนี้ (ตามhttps://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of% 20C% 20in% 20Backus-Naur% 20form.htm ): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; ใช้ทำไม*ปริมาณ (หมายถึงศูนย์หรือมากกว่าเกิดขึ้น) สำหรับinit-declarator? สิ่งนี้อนุญาตให้ใช้ข้อความเช่นint;หรือvoid;เพื่อให้มีความถูกต้องทางไวยากรณ์แม้ว่าจะไม่ถูกต้องทางอรรถศาสตร์ พวกเขาไม่สามารถใช้ตัว+นับจำนวน (อย่างน้อยหนึ่งเหตุการณ์) แทน*กฎการผลิตได้หรือไม่ ฉันพยายามคอมไพล์โปรแกรมอย่างง่ายเพื่อดูว่าคอมไพเลอร์เอาท์พุทอะไรและมันทำอะไรเป็นคำเตือน การป้อนข้อมูล: int main(void) { int; } เอาท์พุท: test.c: In function ‘main’: test.c:2:5: warning: useless type name in empty declaration int; ^~~
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.