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
|
---|