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