เมื่อมองผ่าน 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;
^~~
int
เป็นประเภทส่งคืนmain
และไม่ใช้()
เป็นรายการประเภทพารามิเตอร์ในฟังก์ชั่น แต่(void)
ใช้แทน