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