parser.yy (35828B)
1 %{ 2 // Copyright 2019 The CC Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 // Based on [0], 6.5-6.10. 7 8 package cc // import "modernc.org/cc/v3" 9 10 %} 11 12 %union { 13 Token Token 14 node Node 15 } 16 17 %token 18 /*yy:token "%c" */ IDENTIFIER 19 /*yy:token "%c_e" */ ENUMCONST 20 /*yy:token "%c_t" */ TYPEDEFNAME 21 /*yy:token "%d" */ INTCONST 22 /*yy:token "'%c'" */ CHARCONST 23 /*yy:token "1.%d" */ FLOATCONST 24 /*yy:token "L'%c'" */ LONGCHARCONST 25 /*yy:token "L\"%c\"" */ LONGSTRINGLITERAL 26 /*yy:token "\"%c\"" */ STRINGLITERAL 27 28 ACCUM "_Accum" 29 ADDASSIGN "+=" 30 ALIGNAS "_Alignas" 31 ALIGNOF "_Alignof" 32 ANDAND "&&" 33 ANDASSIGN "&=" 34 ARROW "->" 35 ASM "__asm__" 36 ATOMIC "_Atomic" 37 ATTRIBUTE "__attribute__" 38 AUTO "auto" 39 BOOL "_Bool" 40 BREAK "break" 41 BUILTINCHOOSEXPR "__builtin_choose_expr" 42 BUILTINTYPESCOMPATIBLE "__builtin_types_compatible_p" 43 CASE "case" 44 CHAR "char" 45 COMPLEX "_Complex" 46 CONST "const" 47 CONTINUE "continue" 48 DDD "..." 49 DEC "--" 50 DECIMAL128 "_Decimal128" 51 DECIMAL32 "_Decimal32" 52 DECIMAL64 "_Decimal64" 53 DEFAULT "default" 54 DIVASSIGN "/=" 55 DO "do" 56 DOUBLE "double" 57 ELSE "else" 58 ENUM "enum" 59 EQ "==" 60 EXTERN "extern" 61 FLOAT "float" 62 FLOAT128 "_Float128" 63 FLOAT16 "__fp16" 64 FLOAT32 "_Float32" 65 FLOAT32X "_Float32x" 66 FLOAT64 "_Float64" 67 FLOAT64x "_Float64x" 68 FLOAT80 "__float80" 69 FOR "for" 70 FRACT "_Fract" 71 GEQ ">=" 72 GOTO "goto" 73 IF "if" 74 IMAG "__imag__" 75 INC "++" 76 INLINE "inline" 77 INT "int" 78 INT8 "__int8" 79 INT16 "__int16" 80 INT32 "__int32" 81 INT64 "__int64" 82 INT128 "__int128" 83 LABEL "__label__" 84 LEQ "<=" 85 LONG "long" 86 LSH "<<" 87 LSHASSIGN "<<=" 88 MODASSIGN "%=" 89 MULASSIGN "*=" 90 NEQ "!=" 91 NORETURN "_Noreturn" 92 ORASSIGN "|=" 93 OROR "||" 94 PPNUMBER "preprocessing number" 95 PPPASTE "##" 96 PRAGMASTDC "__pragma_stdc" 97 REAL "__real__" 98 REGISTER "register" 99 RESTRICT "restrict" 100 RETURN "return" 101 RSH ">>" 102 RSHASSIGN ">>=" 103 SAT "_Sat" 104 SHORT "short" 105 SIGNED "signed" 106 SIZEOF "sizeof" 107 STATIC "static" 108 STRUCT "struct" 109 SUBASSIGN "-=" 110 SWITCH "switch" 111 THREADLOCAL "_Thread_local" 112 TYPEDEF "typedef" 113 TYPEOF "typeof" 114 UNION "union" 115 UNSIGNED "unsigned" 116 VOID "void" 117 VOLATILE "volatile" 118 WHILE "while" 119 XORASSIGN "^=" 120 121 %precedence BELOW_ELSE 122 %precedence ELSE 123 124 %precedence BELOW_ATTRIBUTE 125 %precedence ATTRIBUTE 126 127 %start TranslationUnit 128 129 %% 130 131 /* [0], 6.5.1 Primary expressions */ 132 /*yy:field Operand Operand */ 133 /*yy:field lexicalScope Scope */ 134 /*yy:field resolvedIn Scope */ 135 /*yy:field resolvedTo Node */ 136 /*yy:field IsSideEffectsFree bool */ 137 /*yy:example int i = x; */ 138 /*yy:case Ident */ 139 PrimaryExpression: 140 IDENTIFIER 141 /*yy:example int i = 42; */ 142 /*yy:case Int */ | INTCONST 143 /*yy:example int i = 3.14; */ 144 /*yy:case Float */ | FLOATCONST 145 /*yy:example enum e {a}; int i = a; */ 146 /*yy:case Enum */ | ENUMCONST 147 /*yy:example int i = 'x'; */ 148 /*yy:case Char */ | CHARCONST 149 /*yy:example int i = L'x'; */ 150 /*yy:case LChar */ | LONGCHARCONST 151 /*yy:example char *c = "x"; */ 152 /*yy:case String */ | STRINGLITERAL 153 /*yy:example char *c = L"x"; */ 154 /*yy:case LString */ | LONGSTRINGLITERAL 155 /*yy:example int i = (x+y); */ 156 /*yy:case Expr */ | '(' Expression ')' 157 /*yy:example int i = ({x();}); */ 158 /*yy:case Stmt */ | '(' CompoundStatement ')' 159 160 /* [0], 6.5.2 Postfix operators */ 161 /*yy:field Operand Operand */ 162 /*yy:field Field Field // Case Select, PSelect */ 163 /*yy:field IsSideEffectsFree bool */ 164 /*yy:example int i = x; */ 165 /*yy:case Primary */ PostfixExpression: 166 PrimaryExpression 167 /*yy:example int i = x[y]; */ 168 /*yy:case Index */ | PostfixExpression '[' Expression ']' 169 /*yy:example int i = x(y); */ 170 /*yy:case Call */ | PostfixExpression '(' ArgumentExpressionList ')' 171 /*yy:example int i = x.y; */ 172 /*yy:case Select */ | PostfixExpression '.' IDENTIFIER 173 /*yy:example int i = x->y; */ 174 /*yy:case PSelect */ | PostfixExpression "->" IDENTIFIER 175 /*yy:example int i = x++; */ 176 /*yy:case Inc */ | PostfixExpression "++" 177 /*yy:example int i = x--; */ 178 /*yy:case Dec */ | PostfixExpression "--" 179 /*yy:example int i = (int[]){y}; */ 180 /*yy:case Complit */ | '(' TypeName ')' '{' InitializerList ',' '}' 181 /*yy:example int i = __builtin_types_compatible_p(int, double); */ 182 /*yy:case TypeCmp */ | "__builtin_types_compatible_p" '(' TypeName ',' TypeName ')' 183 /*yy:example int i = __builtin_choose_expr(1, 2, "foo"); */ 184 /*yy:case ChooseExpr*/ | "__builtin_choose_expr" '(' AssignmentExpression ',' AssignmentExpression ',' AssignmentExpression ')' 185 186 /*yy:example int i = f(x); */ 187 ArgumentExpressionList: 188 AssignmentExpression 189 /*yy:example int i = f(x, y); */ 190 | ArgumentExpressionList ',' AssignmentExpression 191 192 /* [0], 6.5.3 Unary operators */ 193 /*yy:field Operand Operand */ 194 /*yy:field lexicalScope Scope */ 195 /*yy:field IsSideEffectsFree bool */ 196 /*yy:example int i = x; */ 197 /*yy:case Postfix */ UnaryExpression: 198 PostfixExpression 199 /*yy:example int i = ++x; */ 200 /*yy:case Inc */ | "++" UnaryExpression 201 /*yy:example int i = --x; */ 202 /*yy:case Dec */ | "--" UnaryExpression 203 /*yy:example int *i = &x; */ 204 /*yy:case Addrof */ | '&' CastExpression 205 /*yy:example int i = *x; */ 206 /*yy:case Deref */ | '*' CastExpression 207 /*yy:example int i = +x; */ 208 /*yy:case Plus */ | '+' CastExpression 209 /*yy:example int i = -x; */ 210 /*yy:case Minus */ | '-' CastExpression 211 /*yy:example int i = ~x; */ 212 /*yy:case Cpl */ | '~' CastExpression 213 /*yy:example int i = !x; */ 214 /*yy:case Not */ | '!' CastExpression 215 /*yy:example int i = sizeof x; */ 216 /*yy:case SizeofExpr */ | "sizeof" UnaryExpression 217 /*yy:example int i = sizeof(int); */ 218 /*yy:case SizeofType */ | "sizeof" '(' TypeName ')' 219 /*yy:example int f() { L: &&L; }*/ 220 /*yy:case LabelAddr */ | "&&" IDENTIFIER 221 /*yy:example int i = _Alignof(x); */ 222 /*yy:case AlignofExpr*/ | "_Alignof" UnaryExpression 223 /*yy:example int i = _Alignof(int); */ 224 /*yy:case AlignofType*/ | "_Alignof" '(' TypeName ')' 225 /*yy:example double i = __imag__ x; */ 226 /*yy:case Imag */ | "__imag__" UnaryExpression 227 /*yy:example double i = __real__ x; */ 228 /*yy:case Real */ | "__real__" UnaryExpression 229 230 /* [0], 6.5.4 Cast operators */ 231 /*yy:field Operand Operand */ 232 /*yy:field IsSideEffectsFree bool */ 233 /*yy:example int i = 42; */ 234 /*yy:case Unary */ CastExpression: 235 UnaryExpression 236 /*yy:example int i = (int)3.14; */ 237 /*yy:case Cast */ | '(' TypeName ')' CastExpression 238 239 /* [0], 6.5.5 Multiplicative operators */ 240 /*yy:field Operand Operand */ 241 /*yy:field promote Type */ 242 /*yy:field IsSideEffectsFree bool */ 243 /*yy:example int i = x;*/ 244 /*yy:case Cast */ MultiplicativeExpression: 245 CastExpression 246 /*yy:example int i = x * y;*/ 247 /*yy:case Mul */ | MultiplicativeExpression '*' CastExpression 248 /*yy:example int i = x / y;*/ 249 /*yy:case Div */ | MultiplicativeExpression '/' CastExpression 250 /*yy:example int i = x % y;*/ 251 /*yy:case Mod */ | MultiplicativeExpression '%' CastExpression 252 253 /* [0], 6.5.6 Additive operators */ 254 /*yy:field lexicalScope Scope */ 255 /*yy:field Operand Operand */ 256 /*yy:field promote Type */ 257 /*yy:field IsSideEffectsFree bool */ 258 /*yy:example int i = x; */ 259 /*yy:case Mul */ AdditiveExpression: 260 MultiplicativeExpression 261 /*yy:example int i = x+y; */ 262 /*yy:case Add */ | AdditiveExpression '+' MultiplicativeExpression 263 /*yy:example int i = x-y; */ 264 /*yy:case Sub */ | AdditiveExpression '-' MultiplicativeExpression 265 266 /* [0], 6.5.7 Bitwise shift operators */ 267 /*yy:field Operand Operand */ 268 /*yy:field promote Type // shift count promoted type */ 269 /*yy:field IsSideEffectsFree bool */ 270 /*yy:example int i = x; */ 271 /*yy:case Add */ ShiftExpression: 272 AdditiveExpression 273 /*yy:example int i = x << y; */ 274 /*yy:case Lsh */ | ShiftExpression "<<" AdditiveExpression 275 /*yy:example int i = x >> y; */ 276 /*yy:case Rsh */ | ShiftExpression ">>" AdditiveExpression 277 278 /* [0], 6.5.8 Relational operators */ 279 /*yy:field Operand Operand */ 280 /*yy:field promote Type */ 281 /*yy:field IsSideEffectsFree bool */ 282 /*yy:example int i = x; */ 283 /*yy:case Shift */ RelationalExpression: 284 ShiftExpression 285 /*yy:example int i = x < y; */ 286 /*yy:case Lt */ | RelationalExpression '<' ShiftExpression 287 /*yy:example int i = x > y; */ 288 /*yy:case Gt */ | RelationalExpression '>' ShiftExpression 289 /*yy:example int i = x <= y; */ 290 /*yy:case Leq */ | RelationalExpression "<=" ShiftExpression 291 /*yy:example int i = x >= y; */ 292 /*yy:case Geq */ | RelationalExpression ">=" ShiftExpression 293 294 /* [0], 6.5.9 Equality operators */ 295 /*yy:field Operand Operand */ 296 /*yy:field promote Type */ 297 /*yy:field IsSideEffectsFree bool */ 298 /*yy:example int i = x; */ 299 /*yy:case Rel */ EqualityExpression: 300 RelationalExpression 301 /*yy:example int i = x == y; */ 302 /*yy:case Eq */ | EqualityExpression "==" RelationalExpression 303 /*yy:example int i = x != y; */ 304 /*yy:case Neq */ | EqualityExpression "!=" RelationalExpression 305 306 /* [0], 6.5.10 Bitwise AND operator */ 307 /*yy:field Operand Operand */ 308 /*yy:field promote Type */ 309 /*yy:field IsSideEffectsFree bool */ 310 /*yy:example int i = x; */ 311 /*yy:case Eq */ AndExpression: 312 EqualityExpression 313 /*yy:example int i = x & y; */ 314 /*yy:case And */ | AndExpression '&' EqualityExpression 315 316 /* [0], 6.5.11 Bitwise exclusive OR operator */ 317 /*yy:field Operand Operand */ 318 /*yy:field promote Type */ 319 /*yy:field IsSideEffectsFree bool */ 320 /*yy:example int i = x; */ 321 /*yy:case And */ ExclusiveOrExpression: 322 AndExpression 323 /*yy:example int i = x^y; */ 324 /*yy:case Xor */ | ExclusiveOrExpression '^' AndExpression 325 326 /* [0], 6.5.12 Bitwise inclusive OR operator */ 327 /*yy:field Operand Operand */ 328 /*yy:field promote Type */ 329 /*yy:field IsSideEffectsFree bool */ 330 /*yy:example int i = x; */ 331 /*yy:case Xor */ InclusiveOrExpression: 332 ExclusiveOrExpression 333 /*yy:example int i = x|y; */ 334 /*yy:case Or */ | InclusiveOrExpression '|' ExclusiveOrExpression 335 336 /* [0], 6.5.13 Logical AND operator */ 337 /*yy:field Operand Operand */ 338 /*yy:field IsSideEffectsFree bool */ 339 /*yy:example int i = x;*/ 340 /*yy:case Or */ LogicalAndExpression: 341 InclusiveOrExpression 342 /*yy:example int i = x && y;*/ 343 /*yy:case LAnd */ | LogicalAndExpression "&&" InclusiveOrExpression 344 345 /* [0], 6.5.14 Logical OR operator */ 346 /*yy:field Operand Operand */ 347 /*yy:field IsSideEffectsFree bool */ 348 /*yy:example int i = x;*/ 349 /*yy:case LAnd */ LogicalOrExpression: 350 LogicalAndExpression 351 /*yy:example int i = x || y;*/ 352 /*yy:case LOr */ | LogicalOrExpression "||" LogicalAndExpression 353 354 /* [0], 6.5.15 Conditional operator */ 355 /*yy:field Operand Operand */ 356 /*yy:field IsSideEffectsFree bool */ 357 /*yy:example int i = x; */ 358 /*yy:case LOr */ ConditionalExpression: 359 LogicalOrExpression 360 /*yy:example int i = x ? y : z; */ 361 /*yy:case Cond */ | LogicalOrExpression '?' Expression ':' ConditionalExpression 362 363 /* [0], 6.5.16 Assignment operators */ 364 /*yy:field Operand Operand */ 365 /*yy:field InitializerOperand Operand // When the expression is used in an initializer */ 366 /*yy:field lexicalScope Scope */ 367 /*yy:field promote Type */ 368 /*yy:field IsSideEffectsFree bool */ 369 /*yy:example int i = x; } */ 370 /*yy:case Cond */ AssignmentExpression: 371 ConditionalExpression 372 /*yy:example int f() { x = y; } */ 373 /*yy:case Assign */ | UnaryExpression '=' AssignmentExpression 374 /*yy:example int f() { x *= y; } */ 375 /*yy:case Mul */ | UnaryExpression "*=" AssignmentExpression 376 /*yy:example int f() { x /= y; } */ 377 /*yy:case Div */ | UnaryExpression "/=" AssignmentExpression 378 /*yy:example int f() { x %= y; } */ 379 /*yy:case Mod */ | UnaryExpression "%=" AssignmentExpression 380 /*yy:example int f() { x += y; } */ 381 /*yy:case Add */ | UnaryExpression "+=" AssignmentExpression 382 /*yy:example int f() { x -= y; } */ 383 /*yy:case Sub */ | UnaryExpression "-=" AssignmentExpression 384 /*yy:example int f() { x <<= y; } */ 385 /*yy:case Lsh */ | UnaryExpression "<<=" AssignmentExpression 386 /*yy:example int f() { x >>= y; } */ 387 /*yy:case Rsh */ | UnaryExpression ">>=" AssignmentExpression 388 /*yy:example int f() { x &= y; } */ 389 /*yy:case And */ | UnaryExpression "&=" AssignmentExpression 390 /*yy:example int f() { x ^= y; } */ 391 /*yy:case Xor */ | UnaryExpression "^=" AssignmentExpression 392 /*yy:example int f() { x |= y; } */ 393 /*yy:case Or */ | UnaryExpression "|=" AssignmentExpression 394 395 /* [0], 6.5.17 Comma operator */ 396 /*yy:field Operand Operand */ 397 /*yy:field IsSideEffectsFree bool */ 398 /*yy:example int f() { i = x; }; */ 399 /*yy:case Assign */ Expression: 400 AssignmentExpression 401 /*yy:example int f() { x, y; }; */ 402 /*yy:case Comma */ | Expression ',' AssignmentExpression 403 404 /* [0], 6.6 Constant expressions */ 405 /*yy:field Operand Operand */ 406 /*yy:example struct { int i:3; }; */ 407 ConstantExpression: 408 ConditionalExpression 409 410 /* [0], 6.7 Declarations */ 411 /*yy:example int i, j; */ 412 Declaration: 413 DeclarationSpecifiers InitDeclaratorList ';' 414 415 /*yy:field class storageClass */ 416 /*yy:example static int i; */ 417 /*yy:case Storage */ DeclarationSpecifiers: 418 StorageClassSpecifier DeclarationSpecifiers 419 /*yy:example int i; */ 420 /*yy:case TypeSpec */ | TypeSpecifier DeclarationSpecifiers 421 /*yy:example volatile int i; */ 422 /*yy:case TypeQual */ | TypeQualifier DeclarationSpecifiers 423 /*yy:example inline int f() {} */ 424 /*yy:case Func */ | FunctionSpecifier DeclarationSpecifiers 425 /*yy:example _Alignas(double) int i; */ 426 /*yy:case AlignSpec */ | AlignmentSpecifier DeclarationSpecifiers 427 /*yy:example int __attribute__((a)) i; */ 428 /*yy:case Attribute */ | AttributeSpecifier DeclarationSpecifiers 429 430 /*yy:example int i; */ 431 InitDeclaratorList: 432 InitDeclarator 433 /*yy:example int i, j; */ 434 | InitDeclaratorList ',' AttributeSpecifierList InitDeclarator 435 436 /*yy:field initializer *InitializerValue */ 437 /*yy:example int i; */ 438 /*yy:case Decl */ InitDeclarator: 439 Declarator AttributeSpecifierList 440 /*yy:example int i = x; */ 441 /*yy:case Init */ | Declarator AttributeSpecifierList '=' Initializer 442 443 /* [0], 6.7.1 Storage-class specifiers */ 444 /*yy:example typedef int int_t;*/ 445 /*yy:case Typedef */ StorageClassSpecifier: 446 "typedef" 447 /*yy:example extern int i;*/ 448 /*yy:case Extern */ | "extern" 449 /*yy:example static int i;*/ 450 /*yy:case Static */ | "static" 451 /*yy:example auto int i;*/ 452 /*yy:case Auto */ | "auto" 453 /*yy:example register int i;*/ 454 /*yy:case Register */ | "register" 455 /*yy:example _Thread_local int i;*/ 456 /*yy:case ThreadLocal*/ | "_Thread_local" 457 458 /* [0], 6.7.2 Type specifiers */ 459 /*yy:field resolvedIn Scope // Case TypedefName */ 460 /*yy:field typ Type */ 461 /*yy:example void i(); */ 462 /*yy:case Void */ TypeSpecifier: 463 "void" 464 /*yy:example char i; */ 465 /*yy:case Char */ | "char" 466 /*yy:example short i; */ 467 /*yy:case Short */ | "short" 468 /*yy:example int i; */ 469 /*yy:case Int */ | "int" 470 /*yy:example __int8 i; */ 471 /*yy:case Int8 */ | "__int8" 472 /*yy:example __int16 i; */ 473 /*yy:case Int16 */ | "__int16" 474 /*yy:example __int32 i; */ 475 /*yy:case Int32 */ | "__int32" 476 /*yy:example __int64 i; */ 477 /*yy:case Int64 */ | "__int64" 478 /*yy:example __int128 i; */ 479 /*yy:case Int128 */ | "__int128" 480 /*yy:example long i; */ 481 /*yy:case Long */ | "long" 482 /*yy:example float i; */ 483 /*yy:case Float */ | "float" 484 /*yy:example __fp16 i; */ 485 /*yy:case Float16 */ | "__fp16" 486 /*yy:example _Decimal32 i; */ 487 /*yy:case Decimal32 */ | "_Decimal32" 488 /*yy:example _Decimal64 i; */ 489 /*yy:case Decimal64 */ | "_Decimal64" 490 /*yy:example _Decimal128 i; */ 491 /*yy:case Decimal128 */ | "_Decimal128" 492 /*yy:example _Float128 i; */ 493 /*yy:case Float128 */ | "_Float128" 494 /*yy:example __float80 i; */ 495 /*yy:case Float80 */ | "__float80" 496 /*yy:example double i; */ 497 /*yy:case Double */ | "double" 498 /*yy:example signed i; */ 499 /*yy:case Signed */ | "signed" 500 /*yy:example unsigned i; */ 501 /*yy:case Unsigned */ | "unsigned" 502 /*yy:example _Bool i; */ 503 /*yy:case Bool */ | "_Bool" 504 /*yy:example _Complex i; */ 505 /*yy:case Complex */ | "_Complex" 506 /*yy:example struct s i; */ 507 /*yy:case StructOrUnion */ 508 | StructOrUnionSpecifier 509 /*yy:example enum e i; */ 510 /*yy:case Enum */ | EnumSpecifier 511 /*yy:example typedef const T; T i; */ 512 /*yy:case TypedefName*/ | TYPEDEFNAME 513 /*yy:example typeof(42) i; */ 514 /*yy:case TypeofExpr */ | "typeof" '(' Expression ')' 515 /*yy:example typedef const T; typeof(T) i; */ 516 /*yy:case TypeofType */ | "typeof" '(' TypeName ')' 517 /*yy:example _Atomic(int) i; */ 518 /*yy:case Atomic */ | AtomicTypeSpecifier 519 /*yy:example _Fract i; */ 520 /*yy:case Fract */ | "_Fract" 521 /*yy:example _Sat i; */ 522 /*yy:case Sat */ | "_Sat" 523 /*yy:example _Accum i; */ 524 /*yy:case Accum */ | "_Accum" 525 /*yy:example _Float32 i; */ 526 /*yy:case Float32 */ | "_Float32" 527 /*yy:example _Float64 i; */ 528 /*yy:case Float64 */ | "_Float64" 529 /*yy:example _Float32x i; */ 530 /*yy:case Float32x */ | "_Float32x" 531 /*yy:example _Float64x i; */ 532 /*yy:case Float64x */ | "_Float64x" 533 534 /* [0], 6.7.2.1 Structure and union specifiers */ 535 /*yy:field lexicalScope Scope */ 536 /*yy:field maxAlign int */ 537 /*yy:field typ Type */ 538 /*yy:example struct s { int i; }; */ 539 /*yy:case Def */ StructOrUnionSpecifier: 540 StructOrUnion AttributeSpecifierList IDENTIFIER '{' StructDeclarationList '}' 541 /*yy:example struct s v; */ 542 /*yy:case Tag */ | StructOrUnion AttributeSpecifierList IDENTIFIER 543 544 /*yy:example struct { int i; } s; */ 545 /*yy:case Struct */ StructOrUnion: 546 "struct" 547 /*yy:example union { int i; double d; } u; */ 548 /*yy:case Union */ | "union" 549 550 /*yy:example struct{ int i; } */ 551 StructDeclarationList: 552 StructDeclaration 553 /*yy:example struct{ int i; double d; } */ 554 | StructDeclarationList StructDeclaration 555 556 /*yy:example struct{ int i; } */ 557 /*yy:field Empty bool // TCC extension */ 558 StructDeclaration: 559 SpecifierQualifierList StructDeclaratorList ';' 560 561 /*yy:field noStorageClass */ 562 /*yy:example struct {int i;};*/ 563 /*yy:case TypeSpec */ SpecifierQualifierList: 564 TypeSpecifier SpecifierQualifierList 565 /*yy:example struct {const int i;};*/ 566 /*yy:case TypeQual */ | TypeQualifier SpecifierQualifierList 567 /*yy:example struct {_Alignas(double) int i;};*/ 568 /*yy:case AlignSpec */ | AlignmentSpecifier SpecifierQualifierList 569 /*yy:example struct {__attribute__((a)) int i;};*/ 570 /*yy:case Attribute */ | AttributeSpecifier SpecifierQualifierList 571 572 /*yy:example struct{ int i; } */ 573 StructDeclaratorList: 574 StructDeclarator 575 /*yy:example struct{ int i, j; } */ 576 | StructDeclaratorList ',' StructDeclarator 577 578 /*yy:field decl *StructDeclaration */ 579 /*yy:example struct{ int i; } */ 580 /*yy:case Decl */ StructDeclarator: 581 Declarator 582 /*yy:example struct{ int i:3; } */ 583 /*yy:case BitField */ | Declarator ':' ConstantExpression AttributeSpecifierList 584 585 /* [0], 6.7.2.2 Enumeration specifiers */ 586 /*yy:field lexicalScope Scope */ 587 /*yy:field typ Type */ 588 /*yy:field min Value */ 589 /*yy:field max Value */ 590 /*yy:example enum e {a}; */ 591 /*yy:case Def */ EnumSpecifier: 592 "enum" AttributeSpecifierList IDENTIFIER '{' EnumeratorList ',' '}' 593 /*yy:example enum e i; */ 594 /*yy:case Tag */ | "enum" AttributeSpecifierList IDENTIFIER 595 596 /*yy:example enum e {a}; */ 597 EnumeratorList: 598 Enumerator 599 /*yy:example enum e {a, b}; */ 600 | EnumeratorList ',' Enumerator 601 602 /*yy:field lexicalScope Scope */ 603 /*yy:field Operand Operand */ 604 /*yy:example enum e {a}; */ 605 /*yy:case Ident */ Enumerator: 606 IDENTIFIER AttributeSpecifierList 607 /*yy:example enum e {a = 42}; */ 608 /*yy:case Expr */ | IDENTIFIER AttributeSpecifierList '=' ConstantExpression 609 610 /* [2], 6.7.2.4 Atomic type specifiers */ 611 /*yy:field list []*TypeSpecifier */ 612 /*yy:example _Atomic(int) i; */ 613 AtomicTypeSpecifier: 614 "_Atomic" '(' TypeName ')' 615 616 /* [0], 6.7.3 Type qualifiers */ 617 /*yy:example const int i; */ 618 /*yy:case Const */ TypeQualifier: 619 "const" 620 /*yy:example restrict int i; */ 621 /*yy:case Restrict */ | "restrict" 622 /*yy:example volatile int i; */ 623 /*yy:case Volatile */ | "volatile" 624 /*yy:example _Atomic int i; */ 625 /*yy:case Atomic */ | "_Atomic" 626 627 /* [0], 6.7.4 Function specifiers */ 628 /*yy:example inline int f() {}*/ 629 /*yy:case Inline */ FunctionSpecifier: 630 "inline" 631 /*yy:example _Noreturn int f() {}*/ 632 /*yy:case Noreturn */ | "_Noreturn" 633 634 /* [0], 6.7.5 Declarators */ 635 /*yy:field Linkage Linkage */ 636 /*yy:field Read int */ 637 /*yy:field StorageClass StorageClass */ 638 /*yy:field Write int */ 639 /*yy:field funcDefinition *FunctionDefinition */ 640 /*yy:field lhs map[*Declarator]struct{} */ 641 /*yy:field td typeDescriptor */ 642 /*yy:field typ Type */ 643 /*yy:field AddressTaken bool */ 644 /*yy:field IsParameter bool */ 645 /*yy:field IsTypedefName bool */ 646 /*yy:field SubjectOfAsgnOp bool */ 647 /*yy:field SubjectOfIncDec bool */ 648 /*yy:field called bool */ 649 /*yy:field fnDef bool */ 650 /*yy:field hasInitializer bool */ 651 /*yy:field implicit bool */ 652 /*yy:example int *p __attribute__ ((foo)); */ 653 Declarator: 654 Pointer DirectDeclarator AttributeSpecifierList %prec BELOW_ATTRIBUTE 655 656 /* [2], 6.7.5 Alignment specifier */ 657 /*yy:example _Alignas(double) char c; */ 658 /*yy:case AlignasType*/ AlignmentSpecifier: 659 "_Alignas" '(' TypeName ')' 660 /*yy:example _Alignas(0ll) char c; */ 661 /*yy:case AlignasExpr*/ | "_Alignas" '(' ConstantExpression ')' 662 663 /*yy:field lexicalScope Scope */ 664 /*yy:field paramScope Scope */ 665 /*yy:field typeQualifiers *typeBase */ 666 /*yy:field idListNoDeclList bool */ 667 /*yy:example int i; */ 668 /*yy:case Ident */ DirectDeclarator: 669 IDENTIFIER Asm 670 /*yy:example int (f); */ 671 /*yy:case Decl */ | '(' AttributeSpecifierList Declarator ')' 672 /*yy:example int i[const 42]; */ 673 /*yy:case Arr */ | DirectDeclarator '[' TypeQualifiers AssignmentExpression ']' 674 /*yy:example int i[static const 42]; */ 675 /*yy:case StaticArr */ | DirectDeclarator '[' "static" TypeQualifiers AssignmentExpression ']' 676 /*yy:example int i[const static 42]; */ 677 /*yy:case ArrStatic */ | DirectDeclarator '[' TypeQualifiers "static" AssignmentExpression ']' 678 /*yy:example int i[const *]; */ 679 /*yy:case Star */ | DirectDeclarator '[' TypeQualifiers '*' ']' 680 /*yy:example int f(int i); */ 681 /*yy:case FuncParam */ | DirectDeclarator '(' ParameterTypeList ')' 682 /*yy:example int f(a); */ 683 /*yy:case FuncIdent */ | DirectDeclarator '(' IdentifierList ')' 684 685 /*yy:field typeQualifiers *typeBase*/ 686 /*yy:example int *p; */ 687 /*yy:case TypeQual */ Pointer: 688 '*' TypeQualifiers 689 /*yy:example int **p; */ 690 /*yy:case Ptr */ | '*' TypeQualifiers Pointer 691 /*yy:example int atexit_b(void (^ _Nonnull)(void)); */ 692 /*yy:case Block */ | '^' TypeQualifiers 693 694 /*yy:field noStorageClass */ 695 /*yy:example int * const i; */ 696 /*yy:case TypeQual */ TypeQualifiers: 697 TypeQualifier 698 /*yy:example int * __attribute__((a)) i; */ 699 /*yy:case Attribute */ | AttributeSpecifier 700 /*yy:example int * const volatile i; */ 701 | TypeQualifiers TypeQualifier 702 /*yy:example int * __attribute__((a)) __attribute__((b)) i; */ 703 | TypeQualifiers AttributeSpecifier 704 705 /*yy:example int f(int i) {} */ 706 /*yy:case List */ ParameterTypeList: 707 ParameterList 708 /*yy:example int f(int i, ...) {} */ 709 /*yy:case Var */ | ParameterList ',' "..." 710 711 /*yy:example int f(int i) {} */ 712 ParameterList: 713 ParameterDeclaration 714 /*yy:example int f(int i, int j) {} */ 715 | ParameterList ',' ParameterDeclaration 716 717 /*yy:field typ Type */ 718 /*yy:example int f(int i) {} */ 719 /*yy:case Decl */ ParameterDeclaration: 720 DeclarationSpecifiers Declarator AttributeSpecifierList 721 /*yy:example int f(int*) {} */ 722 /*yy:case Abstract */ | DeclarationSpecifiers AbstractDeclarator 723 724 /*yy:field lexicalScope Scope */ 725 /*yy:example int f(i) int i; {}*/ 726 IdentifierList: 727 IDENTIFIER 728 /*yy:example int f(i, j) int i, j; {}*/ 729 | IdentifierList ',' IDENTIFIER 730 731 /* [0], 6.7.6 Type names */ 732 /*yy:field typ Type */ 733 /*yy:example int i = (int)x; */ 734 TypeName: 735 SpecifierQualifierList AbstractDeclarator 736 737 /*yy:field typ Type */ 738 /*yy:example void f(int*); */ 739 /*yy:case Ptr */ AbstractDeclarator: 740 Pointer 741 /*yy:example void f(int()); */ 742 /*yy:case Decl */ | Pointer DirectAbstractDeclarator 743 744 /*yy:field paramScope Scope */ 745 /*yy:field typeQualifiers *typeBase */ 746 /*yy:example void f(int()); */ 747 /*yy:case Decl */ DirectAbstractDeclarator: 748 '(' AbstractDeclarator ')' 749 /*yy:example void f(int[const 42]); */ 750 /*yy:case Arr */ | DirectAbstractDeclarator '[' TypeQualifiers AssignmentExpression ']' 751 /*yy:example void f(int[static const 42]); */ 752 /*yy:case StaticArr */ | DirectAbstractDeclarator '[' "static" TypeQualifiers AssignmentExpression ']' 753 /*yy:example void f(int[const static 42]); */ 754 /*yy:case ArrStatic */ | DirectAbstractDeclarator '[' TypeQualifiers "static" AssignmentExpression ']' 755 /*yy:example void f(int[*]); */ 756 /*yy:case ArrStar */ | DirectAbstractDeclarator '[' '*' ']' 757 /*yy:example void f(int(char)); */ 758 /*yy:case Func */ | DirectAbstractDeclarator '(' ParameterTypeList ')' 759 760 /* [0], 6.7.8 Initialization */ 761 /*yy:field Field Field // Where aplicable */ 762 /*yy:field Offset uintptr // Case Expr */ 763 /*yy:field field0 Field */ 764 /*yy:field list []*Initializer */ 765 /*yy:field parent *Initializer */ 766 /*yy:field trailingComma *Token */ 767 /*yy:field typ Type */ 768 /*yy:field isConst bool */ 769 /*yy:field isZero bool */ 770 /*yy:example int i = x; */ 771 /*yy:case Expr */ Initializer: 772 AssignmentExpression 773 /*yy:example int i[] = { x }; */ 774 /*yy:case InitList */ | '{' InitializerList ',' '}' 775 776 /*yy:field list []*Initializer */ 777 /*yy:field isConst bool */ 778 /*yy:field isZero bool */ 779 /*yy:example int i[] = { [10] = x }; */ 780 InitializerList: 781 Designation Initializer 782 /*yy:example int i[] = { [10] = x, [20] = y }; */ 783 | InitializerList ',' Designation Initializer 784 785 /*yy:example int a[] = { [42] = 314 }; */ 786 Designation: 787 DesignatorList '=' 788 789 /*yy:example int a[] = { [42] = 314 }; */ 790 DesignatorList: 791 Designator 792 /*yy:example int a[100][] = { [42][12] = 314 }; */ 793 | DesignatorList Designator 794 795 /*yy:field lexicalScope Scope */ 796 /*yy:example int a[] = { [42] = 314 }; */ 797 /*yy:case Index */ Designator: 798 '[' ConstantExpression ']' 799 /*yy:example struct t s = { .fld = 314 }; */ 800 /*yy:case Field */ | '.' IDENTIFIER 801 /*yy:example struct t s = { fld: 314 }; */ 802 /*yy:case Field2 */ | IDENTIFIER ':' 803 804 /* [0], 6.8 Statements and blocks */ 805 /*yy:field Operand Operand // Case CompoundStatement, ExpressionStatement*/ 806 /*yy:example int f() { L: x(); }*/ 807 /*yy:case Labeled */ Statement: 808 LabeledStatement 809 /*yy:example int f() { { y(); } }*/ 810 /*yy:case Compound */ | CompoundStatement 811 /*yy:example int f() { x(); }*/ 812 /*yy:case Expr */ | ExpressionStatement 813 /*yy:example int f() { if(x) y(); }*/ 814 /*yy:case Selection */ | SelectionStatement 815 /*yy:example int f() { for(;;) x(); }*/ 816 /*yy:case Iteration */ | IterationStatement 817 /*yy:example int f() { return x; }*/ 818 /*yy:case Jump */ | JumpStatement 819 /*yy:example int f() { __asm__("nop"); }*/ 820 /*yy:case Asm */ | AsmStatement 821 822 /* [0], 6.8.1 Labeled statements */ 823 /*yy:field block *CompoundStatement */ 824 /*yy:field lexicalScope Scope */ 825 /*yy:example int f() { L: goto L; } */ 826 /*yy:case Label */ LabeledStatement: 827 IDENTIFIER ':' AttributeSpecifierList Statement 828 /*yy:example int f() { switch(i) case 42: x(); } */ 829 /*yy:case CaseLabel */ | "case" ConstantExpression ':' Statement 830 /*yy:example int f() { switch(i) case 42 ... 56: x(); } */ 831 /*yy:case Range */ | "case" ConstantExpression "..." ConstantExpression ':' Statement 832 /*yy:example int f() { switch(i) default: x(); } */ 833 /*yy:case Default */ | "default" ':' Statement 834 835 /* [0], 6.8.2 Compound statement */ 836 /*yy:field Operand Operand */ 837 /*yy:field children []*CompoundStatement */ 838 /*yy:field declarations []*Declaration */ 839 /*yy:field isJumpTarget bool */ 840 /*yy:field labeledStmts []*LabeledStatement */ 841 /*yy:field parent *CompoundStatement */ 842 /*yy:field scope Scope */ 843 /*yy:example int f() { int i; } */ 844 CompoundStatement: 845 '{' BlockItemList '}' 846 847 /*yy:example int f() { int i; }*/ 848 BlockItemList: 849 BlockItem 850 /*yy:example int f() { int i; double j; }*/ 851 | BlockItemList BlockItem 852 853 /*yy:field fn *FunctionDefinition // Case FuncDef */ 854 /*yy:field closure map[StringID]struct{} // Case FuncDef */ 855 /*yy:field Last bool */ 856 /*yy:example int f() { int i; }*/ 857 /*yy:case Decl */ BlockItem: 858 Declaration 859 /*yy:example int f() { g(); }*/ 860 /*yy:case Stmt */ | Statement 861 /*yy:example int f() { __label__ L; }*/ 862 /*yy:case Label */ | LabelDeclaration 863 /*yy:example int f() { int g() {} }*/ 864 /*yy:case FuncDef */ | DeclarationSpecifiers Declarator CompoundStatement 865 /*yy:example int f() {\n#pragma STDC FENV_ACCESS OFF\n}*/ 866 /*yy:case Pragma */ | PragmaSTDC 867 868 /* [0], 6.8.3 Expression and null statements */ 869 /*yy:example int f() { g(); }*/ 870 ExpressionStatement: 871 Expression AttributeSpecifierList ';' 872 873 /* [0], 6.8.4 Selection statements */ 874 /*yy:field promote Type // switch expression promoted type */ 875 /*yy:field cases []*LabeledStatement */ 876 /*yy:example int f() { if(x) y(); } */ 877 /*yy:case If */ SelectionStatement: 878 "if" '(' Expression ')' Statement %prec BELOW_ELSE 879 /*yy:example int f() { if(x) y(); else z(); } */ 880 /*yy:case IfElse */ | "if" '(' Expression ')' Statement "else" Statement 881 /*yy:example int f() { switch(i) case 42: x(); } */ 882 /*yy:case Switch */ | "switch" '(' Expression ')' Statement 883 884 /* [0], 6.8.5 Iteration statements */ 885 /*yy:example int f() { while(x) y(); } */ 886 /*yy:case While */ IterationStatement: 887 "while" '(' Expression ')' Statement 888 /*yy:example int f() { do x(); while(y); } */ 889 /*yy:case Do */ | "do" Statement "while" '(' Expression ')' ';' 890 /*yy:example int f() { for( i = 0; i < 10; i++) x(); } */ 891 /*yy:case For */ | "for" '(' Expression ';' Expression ';' Expression ')' Statement 892 /*yy:example int f() { for( int i = 0; i < 10; i++) x(); } */ 893 /*yy:case ForDecl */ | "for" '(' Declaration Expression ';' Expression ')' Statement 894 895 /* [0], 6.8.6 Jump statements */ 896 /*yy:field context Node */ 897 /*yy:field lexicalScope Scope */ 898 /*yy:example int f() { L: goto L; } */ 899 /*yy:case Goto */ JumpStatement: 900 "goto" IDENTIFIER ';' 901 /*yy:example int f() { L: x(); void *p = &&L; goto *p; } */ 902 /*yy:case GotoExpr */ | "goto" '*' Expression ';' 903 /*yy:example int f() { for(;;) if (i) continue; } */ 904 /*yy:case Continue */ | "continue" ';' 905 /*yy:example int f() { for(;;) if (i) break; } */ 906 /*yy:case Break */ | "break" ';' 907 /*yy:example int f() { if (i) return x; } */ 908 /*yy:case Return */ | "return" Expression ';' 909 910 /* [0], 6.9 External definitions */ 911 /*yy:list*/ 912 /*yy:example int i; */ 913 TranslationUnit: 914 ExternalDeclaration 915 /*yy:example int i; int j; */ 916 | TranslationUnit ExternalDeclaration 917 918 /*yy:example int f() {} */ 919 /*yy:case FuncDef */ ExternalDeclaration: 920 FunctionDefinition 921 /*yy:example int i; */ 922 /*yy:case Decl */ | Declaration 923 /*yy:example int f() __asm__("nop"); */ 924 /*yy:case Asm */ | AsmFunctionDefinition 925 /*yy:example __asm__("nop"); */ 926 /*yy:case AsmStmt */ | AsmStatement 927 /*yy:example ; */ 928 /*yy:case Empty */ | ';' 929 /*yy:example #pragma STDC CX_LIMITED_RANGE DEFAULT */ 930 /*yy:case Pragma */ | PragmaSTDC 931 932 /* [0], 6.9.1 Function definitions */ 933 /*yy:field CallSiteComplexExpr []*AssignmentExpression */ 934 /*yy:field CompositeLiterals []*PostfixExpression */ 935 /*yy:field ComputedGotos map[StringID]*UnaryExpression */ 936 /*yy:field Gotos map[StringID]*JumpStatement */ 937 /*yy:field InitDeclarators []*InitDeclarator */ 938 /*yy:field Labels map[StringID]*LabeledStatement */ 939 /*yy:field ReturnComplexExpr []*Expression */ 940 /*yy:field VLAs []*Declarator */ 941 /*yy:field compoundStatements []*CompoundStatement */ 942 /*yy:field checked bool */ 943 /*yy:example int f() {} */ 944 FunctionDefinition: 945 DeclarationSpecifiers Declarator DeclarationList CompoundStatement 946 947 /*yy:example int f(i) int i; {} */ 948 DeclarationList: 949 Declaration 950 /*yy:example int f(i, j) int i; int j; {} */ 951 | DeclarationList Declaration 952 953 /* -------------------------------------- Extensions */ 954 955 /*yy:example __asm__("nop": [a] b); */ 956 AsmIndex: 957 '[' Expression ']' 958 959 /*yy:example __asm__("nop": a); */ 960 AsmExpressionList: 961 AsmIndex AssignmentExpression 962 /*yy:example __asm__("nop": a, b); */ 963 | AsmExpressionList ',' AsmIndex AssignmentExpression 964 965 /*yy:example __asm__("nop": a); */ 966 AsmArgList: 967 ':' AsmExpressionList 968 /*yy:example __asm__("nop": a : b); */ 969 | AsmArgList ':' AsmExpressionList 970 971 /*yy:example __asm__("nop"); */ 972 Asm: 973 "__asm__" AsmQualifierList '(' STRINGLITERAL AsmArgList ')' 974 975 /*yy:example void f() { __asm__("nop"); } */ 976 AsmStatement: 977 Asm AttributeSpecifierList ';' 978 979 /*yy:example int f() __asm__("nop"); */ 980 AsmFunctionDefinition: 981 DeclarationSpecifiers Declarator AsmStatement 982 983 /*yy:example __asm__ volatile ("nop"); */ 984 /*yy:case Volatile */ AsmQualifier: 985 "volatile" 986 /*yy:example __asm__ inline ("nop"); */ 987 /*yy:case Inline */ | "inline" 988 /*yy:example __asm__ goto ("nop"); */ 989 /*yy:case Goto */ | "goto" 990 991 /*yy:example __asm__ inline ("nop"); */ 992 AsmQualifierList: 993 AsmQualifier 994 /*yy:example __asm__ inline volatile ("nop"); */ 995 | AsmQualifierList AsmQualifier 996 997 /*yy:example int f() { __label__ L; L: x(); } */ 998 LabelDeclaration: 999 "__label__" IdentifierList ';' 1000 1001 /* [4], 6.37 Attribute Syntax */ 1002 /*yy:example int i __attribute__((a(b))); */ 1003 ExpressionList: 1004 AssignmentExpression 1005 /*yy:example int i __attribute__((a(b, c))); */ 1006 | ExpressionList ',' AssignmentExpression 1007 1008 /*yy:field lexicalScope Scope */ 1009 /*yy:example int i __attribute__((a)); */ 1010 /*yy:case Ident */ AttributeValue: 1011 IDENTIFIER 1012 /*yy:example int i __attribute__((a(b))); */ 1013 /*yy:case Expr */ | IDENTIFIER '(' ExpressionList ')' 1014 1015 /*yy:example int i __attribute__((a)); */ 1016 AttributeValueList: 1017 AttributeValue 1018 /*yy:example int i __attribute__((a, b)); */ 1019 | AttributeValueList ',' AttributeValue 1020 1021 /*yy:example int i __attribute__((a)); */ 1022 AttributeSpecifier: 1023 "__attribute__" '(' '(' AttributeValueList ')' ')' 1024 1025 /*yy:example int i __attribute__((a)); */ 1026 AttributeSpecifierList: 1027 AttributeSpecifier %prec BELOW_ATTRIBUTE 1028 /*yy:example int i __attribute__((a)) __attribute((b)); */ 1029 | AttributeSpecifierList AttributeSpecifier 1030 1031 /*yy:example _Pragma("STDC FP_CONTRACT ON") */ 1032 PragmaSTDC: 1033 "__pragma_stdc" IDENTIFIER IDENTIFIER IDENTIFIER