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