ไวยากรณ์“ [0 … 255] =” ใน C คืออะไร


108

อ้างถึงjs0n.c

ไวยากรณ์ของรหัสมีดังต่อไปนี้:

    static void *gostruct[] =
    {
        [0 ... 255] = &&l_bad,
        ['\t'] = &&l_loop, [' '] = &&l_loop, ['\r'] = &&l_loop, ['\n'] = &&l_loop,
        ['"'] = &&l_qup,
        [':'] = &&l_loop, [','] = &&l_loop,
        ['['] = &&l_up, [']'] = &&l_down, // tracking [] and {} individually would allow fuller validation but is really messy
        ['{'] = &&l_up, ['}'] = &&l_down,
        ['-'] = &&l_bare, [48 ... 57] = &&l_bare, // 0-9
        [65 ... 90] = &&l_bare, // A-Z
        [97 ... 122] = &&l_bare // a-z
    };

........
.......

l_bad:
    *vlen = cur - json; // where error'd
    return 0;

........
........

ใครช่วยอธิบายว่ากำลังทำอะไรอยู่ที่นี่? ไวยากรณ์คืออะไร[0 ... 255]และ &&l_badทำอะไรที่นี่?

คำตอบ:


109

... เป็นส่วนขยายที่จัดทำโดย GCC

https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html#Designated-Inits

[first ... last] = valueในการเริ่มต้นช่วงขององค์ประกอบกับค่าเดียวกันเขียน นี่คือส่วนขยาย GNU ตัวอย่างเช่น,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };

&& เป็นส่วนขยายอื่น

https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html#Labels-as-Values

คุณสามารถรับที่อยู่ของป้ายกำกับที่กำหนดไว้ในฟังก์ชันปัจจุบัน (หรือฟังก์ชันที่มี) ด้วยตัวดำเนินการยูนารี &&กับผู้ประกอบการเอก void *ค่าที่มีประเภท ค่านี้เป็นค่าคงที่และสามารถใช้ได้ทุกที่ที่ค่าคงที่ของชนิดนั้นถูกต้อง ตัวอย่างเช่น:

 void *ptr;
 /* ... */
 ptr = &&foo;

22
รวมทั้งหมดเข้าด้วยกันว่าโค้ดกำลังสร้างตารางการกระโดดที่ใช้ค่า ascii สำหรับดัชนีซึ่งน่าจะเป็นสำหรับตัวแยกวิเคราะห์
วงล้อประหลาด

1
โดยเฉพาะโปรแกรมแยกวิเคราะห์ JSON เท่าที่ฉันสามารถบอกได้
Kevin

1
@KevinM ที่เข้าท่า. เมื่อใดที่เกิดข้อผิดพลาดทางไวยากรณ์ในการนำ address-of operator (&) ไปใช้กับ rvalue ฉันคาดเดาใน C99 หรือไม่? ครั้งสุดท้ายที่ฉันใช้ Visual C ++ เป็นประจำคือประมาณปี 1998 ซึ่งน่าจะเป็นมาตรฐาน ANSI ก่อน C99 และคอมไพเลอร์ก็อนุญาตแล้ว (ฉันรู้เพราะฉันจำคำผิดของการเพิ่ม&รหัสการผลิตเป็นสองเท่า!)
dodgethesteamroller

3
@dodgethesteamroller &&เป็นโทเค็นแยกจาก&เพื่อให้มีวิธีการที่ C ไวยากรณ์มาตรฐานอาจตีความไม่&&xเป็น "ที่อยู่ที่อยู่ของ X" &xโดยไม่คำนึงถึงคุณค่าของหมวดหมู่
Tavian Barnes

4
@dodgethesteamroller: --มักจะแยกวิเคราะห์เป็น--และ&&มักจะแยกวิเคราะห์เป็น&&ไฟล์. C99 §6.4¶4: โทเค็นก่อนการประมวลผลถัดไปเป็นลำดับอักขระที่ยาวที่สุดที่สามารถประกอบเป็นโทเค็นก่อนการประมวลผลได้
ninjalj
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.