]>
Commit | Line | Data |
---|---|---|
52302d4d LG |
1 | /* @file\r |
2 | This file is used to be the grammar file of ECC tool\r | |
3 | \r | |
40d841f6 LG |
4 | Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r |
5 | This program and the accompanying materials\r | |
52302d4d LG |
6 | are licensed and made available under the terms and conditions of the BSD License\r |
7 | which accompanies this distribution. The full text of the license may be found at\r | |
8 | http://opensource.org/licenses/bsd-license.php\r | |
9 | \r | |
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
11 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
12 | */\r | |
30fdf114 LG |
13 | \r |
14 | grammar C;\r | |
15 | options {\r | |
16 | language=Python;\r | |
17 | backtrack=true;\r | |
18 | memoize=true;\r | |
19 | k=2;\r | |
20 | }\r | |
21 | \r | |
52302d4d LG |
22 | @lexer::header{\r |
23 | ## @file\r | |
24 | # The file defines the Lexer for C source files.\r | |
25 | #\r | |
26 | # THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE.\r | |
27 | # This file is generated by running:\r | |
28 | # java org.antlr.Tool C.g\r | |
29 | #\r | |
30 | # Copyright (c) 2009 - 2010, Intel Corporation All rights reserved.\r | |
31 | #\r | |
32 | # This program and the accompanying materials are licensed and made available\r | |
33 | # under the terms and conditions of the BSD License which accompanies this\r | |
34 | # distribution. The full text of the license may be found at:\r | |
35 | # http://opensource.org/licenses/bsd-license.php\r | |
36 | #\r | |
37 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
38 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
39 | #\r | |
40 | ##\r | |
41 | }\r | |
42 | \r | |
30fdf114 | 43 | @header {\r |
52302d4d LG |
44 | ## @file\r |
45 | # The file defines the parser for C source files.\r | |
46 | #\r | |
47 | # THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE.\r | |
48 | # This file is generated by running:\r | |
49 | # java org.antlr.Tool C.g\r | |
50 | #\r | |
51 | # Copyright (c) 2009 - 2010, Intel Corporation All rights reserved.\r | |
52 | #\r | |
53 | # This program and the accompanying materials are licensed and made available\r | |
54 | # under the terms and conditions of the BSD License which accompanies this\r | |
55 | # distribution. The full text of the license may be found at:\r | |
56 | # http://opensource.org/licenses/bsd-license.php\r | |
57 | #\r | |
58 | # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
59 | # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
60 | #\r | |
61 | ##\r | |
62 | \r | |
63 | import CodeFragment\r | |
64 | import FileProfile\r | |
30fdf114 LG |
65 | }\r |
66 | \r | |
67 | @members {\r | |
68 | \r | |
69 | def printTokenInfo(self, line, offset, tokenText):\r | |
70 | print str(line)+ ',' + str(offset) + ':' + str(tokenText)\r | |
71 | \r | |
72 | def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r | |
73 | PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
74 | FileProfile.PredicateExpressionList.append(PredExp)\r | |
75 | \r | |
76 | def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r | |
77 | EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
78 | FileProfile.EnumerationDefinitionList.append(EnumDef)\r | |
79 | \r | |
80 | def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):\r | |
81 | SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
82 | FileProfile.StructUnionDefinitionList.append(SUDef)\r | |
83 | \r | |
84 | def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText):\r | |
85 | Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
86 | FileProfile.TypedefDefinitionList.append(Tdef)\r | |
87 | \r | |
88 | def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText, LeftBraceLine, LeftBraceOffset, DeclLine, DeclOffset):\r | |
89 | FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset), (LeftBraceLine, LeftBraceOffset), (DeclLine, DeclOffset))\r | |
90 | FileProfile.FunctionDefinitionList.append(FuncDef)\r | |
91 | \r | |
92 | def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText):\r | |
93 | VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
94 | FileProfile.VariableDeclarationList.append(VarDecl)\r | |
95 | \r | |
96 | def StoreFunctionCalling(self, StartLine, StartOffset, EndLine, EndOffset, FuncName, ParamList):\r | |
97 | FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset))\r | |
98 | FileProfile.FunctionCallingList.append(FuncCall)\r | |
99 | \r | |
100 | }\r | |
101 | \r | |
102 | translation_unit\r | |
103 | : external_declaration*\r | |
104 | ;\r | |
105 | \r | |
106 | \r | |
107 | /*function_declaration\r | |
108 | @after{\r | |
109 | print $function_declaration.text\r | |
110 | }\r | |
111 | : declaration_specifiers IDENTIFIER '(' parameter_list ')' ';'\r | |
112 | ;\r | |
113 | */\r | |
114 | external_declaration\r | |
115 | options {k=1;}\r | |
116 | /*@after{\r | |
117 | print $external_declaration.text\r | |
118 | }*/\r | |
119 | : ( declaration_specifiers? declarator declaration* '{' )=> function_definition\r | |
120 | | declaration\r | |
121 | | macro_statement (';')?\r | |
122 | ;\r | |
123 | \r | |
124 | \r | |
125 | \r | |
126 | function_definition\r | |
127 | scope {\r | |
128 | ModifierText;\r | |
129 | DeclText;\r | |
130 | LBLine;\r | |
131 | LBOffset;\r | |
132 | DeclLine;\r | |
133 | DeclOffset;\r | |
134 | }\r | |
135 | @init {\r | |
136 | $function_definition::ModifierText = '';\r | |
137 | $function_definition::DeclText = '';\r | |
138 | $function_definition::LBLine = 0;\r | |
139 | $function_definition::LBOffset = 0;\r | |
140 | $function_definition::DeclLine = 0;\r | |
141 | $function_definition::DeclOffset = 0;\r | |
142 | }\r | |
143 | @after{\r | |
144 | self.StoreFunctionDefinition($function_definition.start.line, $function_definition.start.charPositionInLine, $function_definition.stop.line, $function_definition.stop.charPositionInLine, $function_definition::ModifierText, $function_definition::DeclText, $function_definition::LBLine, $function_definition::LBOffset, $function_definition::DeclLine, $function_definition::DeclOffset)\r | |
145 | }\r | |
146 | : d=declaration_specifiers? declarator\r | |
147 | ( declaration+ a=compound_statement // K&R style\r | |
148 | | b=compound_statement // ANSI style\r | |
149 | ) { \r | |
150 | if d != None:\r | |
151 | $function_definition::ModifierText = $declaration_specifiers.text\r | |
152 | else:\r | |
153 | $function_definition::ModifierText = ''\r | |
154 | $function_definition::DeclText = $declarator.text\r | |
155 | $function_definition::DeclLine = $declarator.start.line\r | |
156 | $function_definition::DeclOffset = $declarator.start.charPositionInLine\r | |
157 | if a != None:\r | |
158 | $function_definition::LBLine = $a.start.line\r | |
159 | $function_definition::LBOffset = $a.start.charPositionInLine\r | |
160 | else:\r | |
161 | $function_definition::LBLine = $b.start.line\r | |
162 | $function_definition::LBOffset = $b.start.charPositionInLine\r | |
163 | }\r | |
164 | ;\r | |
165 | \r | |
166 | declaration\r | |
167 | : a='typedef' b=declaration_specifiers? \r | |
168 | c=init_declarator_list d=';' \r | |
169 | {\r | |
170 | if b != None:\r | |
171 | self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, $b.text, $c.text)\r | |
172 | else:\r | |
173 | self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, '', $c.text)\r | |
174 | } \r | |
175 | | s=declaration_specifiers t=init_declarator_list? e=';' \r | |
176 | {\r | |
177 | if t != None:\r | |
178 | self.StoreVariableDeclaration($s.start.line, $s.start.charPositionInLine, $t.start.line, $t.start.charPositionInLine, $s.text, $t.text)\r | |
179 | }\r | |
180 | ;\r | |
181 | \r | |
182 | declaration_specifiers\r | |
183 | : ( storage_class_specifier\r | |
184 | | type_specifier\r | |
185 | | type_qualifier\r | |
186 | )+\r | |
187 | ;\r | |
188 | \r | |
189 | init_declarator_list\r | |
190 | : init_declarator (',' init_declarator)*\r | |
191 | ;\r | |
192 | \r | |
193 | init_declarator\r | |
194 | : declarator ('=' initializer)? \r | |
195 | ;\r | |
196 | \r | |
197 | storage_class_specifier\r | |
198 | : 'extern'\r | |
199 | | 'static'\r | |
200 | | 'auto'\r | |
201 | | 'register'\r | |
202 | | 'STATIC'\r | |
203 | ;\r | |
204 | \r | |
205 | type_specifier\r | |
206 | : 'void'\r | |
207 | | 'char'\r | |
208 | | 'short'\r | |
209 | | 'int'\r | |
210 | | 'long'\r | |
211 | | 'float'\r | |
212 | | 'double'\r | |
213 | | 'signed'\r | |
214 | | 'unsigned'\r | |
215 | | s=struct_or_union_specifier\r | |
216 | {\r | |
217 | if s.stop != None:\r | |
218 | self.StoreStructUnionDefinition($s.start.line, $s.start.charPositionInLine, $s.stop.line, $s.stop.charPositionInLine, $s.text)\r | |
219 | }\r | |
220 | | e=enum_specifier\r | |
221 | {\r | |
222 | if e.stop != None:\r | |
223 | self.StoreEnumerationDefinition($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)\r | |
224 | }\r | |
225 | | (IDENTIFIER type_qualifier* declarator)=> type_id\r | |
226 | ;\r | |
227 | \r | |
228 | type_id\r | |
229 | : IDENTIFIER\r | |
230 | //{self.printTokenInfo($a.line, $a.pos, $a.text)}\r | |
231 | ;\r | |
232 | \r | |
233 | struct_or_union_specifier\r | |
234 | options {k=3;}\r | |
235 | : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'\r | |
236 | | struct_or_union IDENTIFIER\r | |
237 | ;\r | |
238 | \r | |
239 | struct_or_union\r | |
240 | : 'struct'\r | |
241 | | 'union'\r | |
242 | ;\r | |
243 | \r | |
244 | struct_declaration_list\r | |
245 | : struct_declaration+\r | |
246 | ;\r | |
247 | \r | |
248 | struct_declaration\r | |
249 | : specifier_qualifier_list struct_declarator_list ';'\r | |
250 | ;\r | |
251 | \r | |
252 | specifier_qualifier_list\r | |
253 | : ( type_qualifier | type_specifier )+\r | |
254 | ;\r | |
255 | \r | |
256 | struct_declarator_list\r | |
257 | : struct_declarator (',' struct_declarator)*\r | |
258 | ;\r | |
259 | \r | |
260 | struct_declarator\r | |
261 | : declarator (':' constant_expression)?\r | |
262 | | ':' constant_expression\r | |
263 | ;\r | |
264 | \r | |
265 | enum_specifier\r | |
266 | options {k=3;}\r | |
267 | : 'enum' '{' enumerator_list ','? '}'\r | |
268 | | 'enum' IDENTIFIER '{' enumerator_list ','? '}'\r | |
269 | | 'enum' IDENTIFIER\r | |
270 | ;\r | |
271 | \r | |
272 | enumerator_list\r | |
273 | : enumerator (',' enumerator)*\r | |
274 | ;\r | |
275 | \r | |
276 | enumerator\r | |
277 | : IDENTIFIER ('=' constant_expression)?\r | |
278 | ;\r | |
279 | \r | |
280 | type_qualifier\r | |
281 | : 'const'\r | |
282 | | 'volatile'\r | |
283 | | 'IN'\r | |
284 | | 'OUT'\r | |
285 | | 'OPTIONAL'\r | |
286 | | 'CONST'\r | |
287 | | 'UNALIGNED'\r | |
288 | | 'VOLATILE'\r | |
289 | | 'GLOBAL_REMOVE_IF_UNREFERENCED'\r | |
290 | | 'EFIAPI'\r | |
291 | | 'EFI_BOOTSERVICE'\r | |
292 | | 'EFI_RUNTIMESERVICE'\r | |
52302d4d | 293 | | 'PACKED'\r |
30fdf114 LG |
294 | ;\r |
295 | \r | |
296 | declarator\r | |
297 | : pointer? ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? direct_declarator\r | |
298 | // | ('EFIAPI')? ('EFI_BOOTSERVICE')? ('EFI_RUNTIMESERVICE')? pointer? direct_declarator\r | |
299 | | pointer\r | |
300 | ;\r | |
301 | \r | |
302 | direct_declarator\r | |
303 | : IDENTIFIER declarator_suffix*\r | |
304 | | '(' ('EFIAPI')? declarator ')' declarator_suffix+\r | |
305 | ;\r | |
306 | \r | |
307 | declarator_suffix\r | |
308 | : '[' constant_expression ']'\r | |
309 | | '[' ']'\r | |
310 | | '(' parameter_type_list ')'\r | |
311 | | '(' identifier_list ')'\r | |
312 | | '(' ')'\r | |
313 | ;\r | |
314 | \r | |
315 | pointer\r | |
316 | : '*' type_qualifier+ pointer?\r | |
317 | | '*' pointer\r | |
318 | | '*'\r | |
319 | ;\r | |
320 | \r | |
321 | parameter_type_list\r | |
322 | : parameter_list (',' ('OPTIONAL')? '...')?\r | |
323 | ;\r | |
324 | \r | |
325 | parameter_list\r | |
326 | : parameter_declaration (',' ('OPTIONAL')? parameter_declaration)*\r | |
327 | ;\r | |
328 | \r | |
329 | parameter_declaration\r | |
330 | : declaration_specifiers (declarator|abstract_declarator)* ('OPTIONAL')?\r | |
331 | //accomerdate user-defined type only, no declarator follow.\r | |
332 | | pointer* IDENTIFIER\r | |
333 | ;\r | |
334 | \r | |
335 | identifier_list\r | |
336 | : IDENTIFIER\r | |
337 | (',' IDENTIFIER)*\r | |
338 | ;\r | |
339 | \r | |
340 | type_name\r | |
341 | : specifier_qualifier_list abstract_declarator?\r | |
342 | | type_id\r | |
343 | ;\r | |
344 | \r | |
345 | abstract_declarator\r | |
346 | : pointer direct_abstract_declarator?\r | |
347 | | direct_abstract_declarator\r | |
348 | ;\r | |
349 | \r | |
350 | direct_abstract_declarator\r | |
351 | : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*\r | |
352 | ;\r | |
353 | \r | |
354 | abstract_declarator_suffix\r | |
355 | : '[' ']'\r | |
356 | | '[' constant_expression ']'\r | |
357 | | '(' ')'\r | |
358 | | '(' parameter_type_list ')'\r | |
359 | ;\r | |
360 | \r | |
361 | initializer\r | |
362 | \r | |
363 | : assignment_expression\r | |
364 | | '{' initializer_list ','? '}'\r | |
365 | ;\r | |
366 | \r | |
367 | initializer_list\r | |
368 | : initializer (',' initializer )*\r | |
369 | ;\r | |
370 | \r | |
371 | // E x p r e s s i o n s\r | |
372 | \r | |
373 | argument_expression_list\r | |
374 | : assignment_expression ('OPTIONAL')? (',' assignment_expression ('OPTIONAL')?)*\r | |
375 | ;\r | |
376 | \r | |
377 | additive_expression\r | |
378 | : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*\r | |
379 | ;\r | |
380 | \r | |
381 | multiplicative_expression\r | |
382 | : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*\r | |
383 | ;\r | |
384 | \r | |
385 | cast_expression\r | |
386 | : '(' type_name ')' cast_expression\r | |
387 | | unary_expression\r | |
388 | ;\r | |
389 | \r | |
390 | unary_expression\r | |
391 | : postfix_expression\r | |
392 | | '++' unary_expression\r | |
393 | | '--' unary_expression\r | |
394 | | unary_operator cast_expression\r | |
395 | | 'sizeof' unary_expression\r | |
396 | | 'sizeof' '(' type_name ')'\r | |
397 | ;\r | |
398 | \r | |
399 | postfix_expression\r | |
400 | scope {\r | |
401 | FuncCallText;\r | |
402 | }\r | |
403 | @init {\r | |
404 | $postfix_expression::FuncCallText = '';\r | |
405 | }\r | |
406 | : p=primary_expression {$postfix_expression::FuncCallText += $p.text}\r | |
407 | ( '[' expression ']'\r | |
408 | | '(' a=')'{self.StoreFunctionCalling($p.start.line, $p.start.charPositionInLine, $a.line, $a.charPositionInLine, $postfix_expression::FuncCallText, '')}\r | |
409 | | '(' c=argument_expression_list b=')' {self.StoreFunctionCalling($p.start.line, $p.start.charPositionInLine, $b.line, $b.charPositionInLine, $postfix_expression::FuncCallText, $c.text)}\r | |
410 | | '(' macro_parameter_list ')'\r | |
411 | | '.' x=IDENTIFIER {$postfix_expression::FuncCallText += '.' + $x.text}\r | |
412 | | '*' y=IDENTIFIER {$postfix_expression::FuncCallText = $y.text}\r | |
413 | | '->' z=IDENTIFIER {$postfix_expression::FuncCallText += '->' + $z.text}\r | |
414 | | '++'\r | |
415 | | '--'\r | |
416 | )*\r | |
417 | ;\r | |
418 | \r | |
419 | macro_parameter_list\r | |
420 | : parameter_declaration (',' parameter_declaration)*\r | |
421 | ;\r | |
422 | \r | |
423 | unary_operator\r | |
424 | : '&'\r | |
425 | | '*'\r | |
426 | | '+'\r | |
427 | | '-'\r | |
428 | | '~'\r | |
429 | | '!'\r | |
430 | ;\r | |
431 | \r | |
432 | primary_expression\r | |
433 | : IDENTIFIER\r | |
434 | | constant\r | |
435 | | '(' expression ')'\r | |
436 | ;\r | |
437 | \r | |
438 | constant\r | |
439 | : HEX_LITERAL\r | |
440 | | OCTAL_LITERAL\r | |
441 | | DECIMAL_LITERAL\r | |
442 | | CHARACTER_LITERAL\r | |
443 | | (IDENTIFIER* STRING_LITERAL+)+ IDENTIFIER*\r | |
444 | | FLOATING_POINT_LITERAL\r | |
445 | ;\r | |
446 | \r | |
447 | /////\r | |
448 | \r | |
449 | expression\r | |
450 | : assignment_expression (',' assignment_expression)*\r | |
451 | ;\r | |
452 | \r | |
453 | constant_expression\r | |
454 | : conditional_expression\r | |
455 | ;\r | |
456 | \r | |
457 | assignment_expression\r | |
458 | : lvalue assignment_operator assignment_expression\r | |
459 | | conditional_expression\r | |
460 | ;\r | |
461 | \r | |
462 | lvalue\r | |
463 | : unary_expression\r | |
464 | ;\r | |
465 | \r | |
466 | assignment_operator\r | |
467 | : '='\r | |
468 | | '*='\r | |
469 | | '/='\r | |
470 | | '%='\r | |
471 | | '+='\r | |
472 | | '-='\r | |
473 | | '<<='\r | |
474 | | '>>='\r | |
475 | | '&='\r | |
476 | | '^='\r | |
477 | | '|='\r | |
478 | ;\r | |
479 | \r | |
480 | conditional_expression\r | |
481 | : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)})?\r | |
482 | ;\r | |
483 | \r | |
484 | logical_or_expression\r | |
485 | : logical_and_expression ('||' logical_and_expression)*\r | |
486 | ;\r | |
487 | \r | |
488 | logical_and_expression\r | |
489 | : inclusive_or_expression ('&&' inclusive_or_expression)*\r | |
490 | ;\r | |
491 | \r | |
492 | inclusive_or_expression\r | |
493 | : exclusive_or_expression ('|' exclusive_or_expression)*\r | |
494 | ;\r | |
495 | \r | |
496 | exclusive_or_expression\r | |
497 | : and_expression ('^' and_expression)*\r | |
498 | ;\r | |
499 | \r | |
500 | and_expression\r | |
501 | : equality_expression ('&' equality_expression)*\r | |
502 | ;\r | |
503 | equality_expression\r | |
504 | : relational_expression (('=='|'!=') relational_expression )*\r | |
505 | ;\r | |
506 | \r | |
507 | relational_expression\r | |
508 | : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*\r | |
509 | ;\r | |
510 | \r | |
511 | shift_expression\r | |
512 | : additive_expression (('<<'|'>>') additive_expression)*\r | |
513 | ;\r | |
514 | \r | |
515 | // S t a t e m e n t s\r | |
516 | \r | |
517 | statement\r | |
518 | : labeled_statement\r | |
519 | | compound_statement\r | |
520 | | expression_statement\r | |
521 | | selection_statement\r | |
522 | | iteration_statement\r | |
523 | | jump_statement\r | |
524 | | macro_statement\r | |
525 | | asm2_statement\r | |
526 | | asm1_statement\r | |
527 | | asm_statement\r | |
528 | | declaration\r | |
529 | ;\r | |
530 | \r | |
531 | asm2_statement\r | |
532 | : '__asm__'? IDENTIFIER '(' (~(';'))* ')' ';'\r | |
533 | ;\r | |
534 | \r | |
535 | asm1_statement\r | |
536 | : '_asm' '{' (~('}'))* '}'\r | |
537 | ;\r | |
538 | \r | |
539 | asm_statement\r | |
540 | : '__asm' '{' (~('}'))* '}'\r | |
541 | ;\r | |
542 | \r | |
543 | macro_statement\r | |
544 | : IDENTIFIER '(' declaration* statement_list? expression? ')'\r | |
545 | ;\r | |
546 | \r | |
547 | labeled_statement\r | |
548 | : IDENTIFIER ':' statement\r | |
549 | | 'case' constant_expression ':' statement\r | |
550 | | 'default' ':' statement\r | |
551 | ;\r | |
552 | \r | |
553 | compound_statement\r | |
554 | : '{' declaration* statement_list? '}'\r | |
555 | ;\r | |
556 | \r | |
557 | statement_list\r | |
558 | : statement+\r | |
559 | ;\r | |
560 | \r | |
561 | expression_statement\r | |
562 | : ';'\r | |
563 | | expression ';'\r | |
564 | ;\r | |
565 | \r | |
566 | selection_statement\r | |
567 | : 'if' '(' e=expression ')' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)} statement (options {k=1; backtrack=false;}:'else' statement)?\r | |
568 | | 'switch' '(' expression ')' statement\r | |
569 | ;\r | |
570 | \r | |
571 | iteration_statement\r | |
572 | : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r | |
573 | | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r | |
574 | | 'for' '(' expression_statement e=expression_statement expression? ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r | |
575 | ;\r | |
576 | \r | |
577 | jump_statement\r | |
578 | : 'goto' IDENTIFIER ';'\r | |
579 | | 'continue' ';'\r | |
580 | | 'break' ';'\r | |
581 | | 'return' ';'\r | |
582 | | 'return' expression ';'\r | |
583 | ;\r | |
584 | \r | |
585 | IDENTIFIER\r | |
586 | : LETTER (LETTER|'0'..'9')*\r | |
587 | ;\r | |
588 | \r | |
589 | fragment\r | |
590 | LETTER\r | |
591 | : '$'\r | |
592 | | 'A'..'Z'\r | |
593 | | 'a'..'z'\r | |
594 | | '_'\r | |
595 | ;\r | |
596 | \r | |
597 | CHARACTER_LITERAL\r | |
598 | : ('L')? '\'' ( EscapeSequence | ~('\''|'\\') ) '\''\r | |
599 | ;\r | |
600 | \r | |
601 | STRING_LITERAL\r | |
602 | : ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"'\r | |
603 | ;\r | |
604 | \r | |
605 | HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;\r | |
606 | \r | |
607 | DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;\r | |
608 | \r | |
609 | OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;\r | |
610 | \r | |
611 | fragment\r | |
612 | HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;\r | |
613 | \r | |
614 | fragment\r | |
615 | IntegerTypeSuffix\r | |
616 | : ('u'|'U')\r | |
617 | | ('l'|'L')\r | |
618 | | ('u'|'U') ('l'|'L')\r | |
619 | | ('u'|'U') ('l'|'L') ('l'|'L')\r | |
620 | ;\r | |
621 | \r | |
622 | FLOATING_POINT_LITERAL\r | |
623 | : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?\r | |
624 | | '.' ('0'..'9')+ Exponent? FloatTypeSuffix?\r | |
625 | | ('0'..'9')+ Exponent FloatTypeSuffix?\r | |
626 | | ('0'..'9')+ Exponent? FloatTypeSuffix\r | |
627 | ;\r | |
628 | \r | |
629 | fragment\r | |
630 | Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;\r | |
631 | \r | |
632 | fragment\r | |
633 | FloatTypeSuffix : ('f'|'F'|'d'|'D') ;\r | |
634 | \r | |
635 | fragment\r | |
636 | EscapeSequence\r | |
637 | : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')\r | |
638 | | OctalEscape\r | |
639 | ;\r | |
640 | \r | |
641 | fragment\r | |
642 | OctalEscape\r | |
643 | : '\\' ('0'..'3') ('0'..'7') ('0'..'7')\r | |
644 | | '\\' ('0'..'7') ('0'..'7')\r | |
645 | | '\\' ('0'..'7')\r | |
646 | ;\r | |
647 | \r | |
648 | fragment\r | |
649 | UnicodeEscape\r | |
650 | : '\\' 'u' HexDigit HexDigit HexDigit HexDigit\r | |
651 | ;\r | |
652 | \r | |
653 | WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}\r | |
654 | ;\r | |
655 | \r | |
656 | // ingore '\' of line concatenation\r | |
657 | BS : ('\\') {$channel=HIDDEN;}\r | |
658 | ;\r | |
659 | \r | |
660 | // ingore function modifiers\r | |
661 | //FUNC_MODIFIERS : 'EFIAPI' {$channel=HIDDEN;}\r | |
662 | // ;\r | |
663 | \r | |
664 | UnicodeVocabulary\r | |
665 | : '\u0003'..'\uFFFE'\r | |
666 | ;\r | |
667 | COMMENT\r | |
668 | : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}\r | |
669 | ;\r | |
670 | \r | |
671 | \r | |
672 | LINE_COMMENT\r | |
673 | : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r | |
674 | ;\r | |
675 | \r | |
676 | // ignore #line info for now\r | |
677 | LINE_COMMAND \r | |
678 | : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r | |
679 | ;\r |