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