code fragment storage initial check-in.
[people/mcb30/basetools.git] / Source / Python / Ecc / C.g
1 \r
2 grammar C;\r
3 options {\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):\r
37         FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))\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 }\r
45 \r
46 translation_unit\r
47         : external_declaration+\r
48         ;\r
49 \r
50 \r
51 /*function_declaration\r
52 @after{\r
53   print $function_declaration.text\r
54 }\r
55         : declaration_specifiers IDENTIFIER '(' parameter_list ')' ';'\r
56         ;\r
57 */\r
58 external_declaration\r
59 options {k=1;}\r
60 /*@after{\r
61   print $external_declaration.text\r
62 }*/\r
63         : ( declaration_specifiers? declarator declaration* '{' )=> function_definition\r
64         | declaration\r
65         | macro_statement (';')?\r
66         ;\r
67         \r
68 \r
69 \r
70 function_definition\r
71 scope {\r
72   ModifierText;\r
73   DeclText;\r
74 }\r
75 @init {\r
76   $function_definition::ModifierText = '';\r
77   $function_definition::DeclText = '';\r
78 }\r
79 @after{\r
80   self.StoreFunctionDefinition($function_definition.start.line, $function_definition.start.charPositionInLine, $function_definition.stop.line, $function_definition.stop.charPositionInLine, $function_definition::ModifierText, $function_definition::DeclText)\r
81 }\r
82         :       declaration_specifiers? declarator\r
83                 (       declaration+ compound_statement // K&R style\r
84                 |       compound_statement                              // ANSI style\r
85                 ) { $function_definition::ModifierText = $declaration_specifiers.text\r
86                     $function_definition::DeclText = $declarator.text}\r
87         ;\r
88 \r
89 declaration\r
90         : a='typedef' b=declaration_specifiers? \r
91           c=init_declarator_list d=';' \r
92           {\r
93           if b != None:\r
94             self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, $b.text, $c.text)\r
95           else:\r
96             self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, '', $c.text)\r
97           }     \r
98         | s=declaration_specifiers t=init_declarator_list? e=';' \r
99         {self.StoreVariableDeclaration($s.start.line, $s.start.charPositionInLine, $e.line, $e.charPositionInLine, $s.text, $t.text)}\r
100         ;\r
101 \r
102 declaration_specifiers\r
103         :   (   storage_class_specifier\r
104                 |   type_specifier\r
105         |   type_qualifier\r
106         )+\r
107         ;\r
108 \r
109 init_declarator_list\r
110         : init_declarator (',' init_declarator)*\r
111         ;\r
112 \r
113 init_declarator\r
114         : declarator ('=' initializer)? \r
115         ;\r
116 \r
117 storage_class_specifier\r
118         : 'extern'\r
119         | 'static'\r
120         | 'auto'\r
121         | 'register'\r
122         ;\r
123 \r
124 type_specifier\r
125         : 'void'\r
126         | 'char'\r
127         | 'short'\r
128         | 'int'\r
129         | 'long'\r
130         | 'float'\r
131         | 'double'\r
132         | 'signed'\r
133         | 'unsigned'\r
134         | s=struct_or_union_specifier {self.StoreStructUnionDefinition($s.start.line, $s.start.charPositionInLine, $s.stop.line, $s.stop.charPositionInLine, $s.text)}\r
135         | e=enum_specifier {self.StoreEnumerationDefinition($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
136         | (IDENTIFIER declarator)=> type_id\r
137         ;\r
138 \r
139 type_id\r
140     :   IDENTIFIER \r
141         //{self.printTokenInfo($a.line, $a.pos, $a.text)}\r
142     ;\r
143 \r
144 struct_or_union_specifier\r
145 options {k=3;}\r
146         : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'\r
147         | struct_or_union IDENTIFIER\r
148         ;\r
149 \r
150 struct_or_union\r
151         : 'struct'\r
152         | 'union'\r
153         ;\r
154 \r
155 struct_declaration_list\r
156         : struct_declaration+\r
157         ;\r
158 \r
159 struct_declaration\r
160         : specifier_qualifier_list struct_declarator_list ';'\r
161         ;\r
162 \r
163 specifier_qualifier_list\r
164         : ( type_qualifier | type_specifier )+\r
165         ;\r
166 \r
167 struct_declarator_list\r
168         : struct_declarator (',' struct_declarator)*\r
169         ;\r
170 \r
171 struct_declarator\r
172         : declarator (':' constant_expression)?\r
173         | ':' constant_expression\r
174         ;\r
175 \r
176 enum_specifier\r
177 options {k=3;}\r
178         : 'enum' '{' enumerator_list '}'\r
179         | 'enum' IDENTIFIER '{' enumerator_list '}'\r
180         | 'enum' IDENTIFIER\r
181         ;\r
182 \r
183 enumerator_list\r
184         : enumerator (',' enumerator)*\r
185         ;\r
186 \r
187 enumerator\r
188         : IDENTIFIER ('=' constant_expression)?\r
189         ;\r
190 \r
191 type_qualifier\r
192         : 'const'\r
193         | 'volatile'\r
194         | 'IN'\r
195         | 'OUT'\r
196         ;\r
197 \r
198 declarator\r
199         : pointer? direct_declarator\r
200         | pointer\r
201         ;\r
202 \r
203 direct_declarator\r
204         : IDENTIFIER declarator_suffix*\r
205         | '(' declarator ')' declarator_suffix+\r
206         ;\r
207 \r
208 declarator_suffix\r
209         :   '[' constant_expression ']'\r
210     |   '[' ']'\r
211     |   '(' parameter_type_list ')'\r
212     |   '(' identifier_list ')'\r
213     |   '(' ')'\r
214         ;\r
215 \r
216 pointer\r
217         : '*' type_qualifier+ pointer?\r
218         | '*' pointer\r
219         | s='*'\r
220         ;\r
221 \r
222 parameter_type_list\r
223         : parameter_list (',' '...')?\r
224         ;\r
225 \r
226 parameter_list\r
227         : parameter_declaration (',' parameter_declaration)*\r
228         ;\r
229 \r
230 parameter_declaration\r
231         : declaration_specifiers (declarator|abstract_declarator)+\r
232         ;\r
233 \r
234 identifier_list\r
235         : IDENTIFIER\r
236         (',' IDENTIFIER)*\r
237         ;\r
238 \r
239 type_name\r
240         : specifier_qualifier_list abstract_declarator?\r
241         | type_id\r
242         ;\r
243 \r
244 abstract_declarator\r
245         : pointer direct_abstract_declarator?\r
246         | direct_abstract_declarator\r
247         ;\r
248 \r
249 direct_abstract_declarator\r
250         :       ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*\r
251         ;\r
252 \r
253 abstract_declarator_suffix\r
254         :       '[' ']'\r
255         |       '[' constant_expression ']'\r
256         |       '(' ')'\r
257         |       '(' parameter_type_list ')'\r
258         ;\r
259         \r
260 initializer\r
261 \r
262         : assignment_expression\r
263         | '{' initializer_list ','? '}'\r
264         ;\r
265 \r
266 initializer_list\r
267         : initializer (',' initializer )*\r
268         ;\r
269 \r
270 // E x p r e s s i o n s\r
271 \r
272 argument_expression_list\r
273         :   assignment_expression (',' assignment_expression)*\r
274         ;\r
275 \r
276 additive_expression\r
277         : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*\r
278         ;\r
279 \r
280 multiplicative_expression\r
281         : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*\r
282         ;\r
283 \r
284 cast_expression\r
285         : '(' type_name ')' cast_expression\r
286         | unary_expression\r
287         ;\r
288 \r
289 unary_expression\r
290         : postfix_expression\r
291         | '++' unary_expression\r
292         | '--' unary_expression\r
293         | unary_operator cast_expression\r
294         | 'sizeof' unary_expression\r
295         | 'sizeof' '(' type_name ')'\r
296         ;\r
297 \r
298 postfix_expression\r
299         :   p=primary_expression\r
300         (   '[' expression ']'\r
301         |   '(' ')'//{self.printTokenInfo($p.start.line, $p.start.charPositionInLine, $p.text)}\r
302         |   a='(' c=argument_expression_list b=')' //{self.printTokenInfo($p.start.line, $p.start.charPositionInLine, $p.text)}\r
303         |   '.' IDENTIFIER\r
304         |   '*' IDENTIFIER\r
305         |   '->' IDENTIFIER\r
306         |   '++'\r
307         |   '--'\r
308         )*\r
309         ;\r
310 \r
311 unary_operator\r
312         : '&'\r
313         | '*'\r
314         | '+'\r
315         | '-'\r
316         | '~'\r
317         | '!'\r
318         ;\r
319 \r
320 primary_expression\r
321         : IDENTIFIER\r
322         | constant\r
323         | '(' expression ')'\r
324         ;\r
325 \r
326 constant\r
327     :   HEX_LITERAL\r
328     |   OCTAL_LITERAL\r
329     |   DECIMAL_LITERAL\r
330     |   CHARACTER_LITERAL\r
331     |   STRING_LITERAL\r
332     |   FLOATING_POINT_LITERAL\r
333     ;\r
334 \r
335 /////\r
336 \r
337 expression\r
338         : assignment_expression (',' assignment_expression)*\r
339         ;\r
340 \r
341 constant_expression\r
342         : conditional_expression\r
343         ;\r
344 \r
345 assignment_expression\r
346         : lvalue assignment_operator assignment_expression\r
347         | conditional_expression\r
348         ;\r
349         \r
350 lvalue\r
351         :       unary_expression\r
352         ;\r
353 \r
354 assignment_operator\r
355         : '='\r
356         | '*='\r
357         | '/='\r
358         | '%='\r
359         | '+='\r
360         | '-='\r
361         | '<<='\r
362         | '>>='\r
363         | '&='\r
364         | '^='\r
365         | '|='\r
366         ;\r
367 \r
368 conditional_expression\r
369         : e=logical_or_expression ('?' expression ':' conditional_expression {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)})?\r
370         ;\r
371 \r
372 logical_or_expression\r
373         : logical_and_expression ('||' logical_and_expression)*\r
374         ;\r
375 \r
376 logical_and_expression\r
377         : inclusive_or_expression ('&&' inclusive_or_expression)*\r
378         ;\r
379 \r
380 inclusive_or_expression\r
381         : exclusive_or_expression ('|' exclusive_or_expression)*\r
382         ;\r
383 \r
384 exclusive_or_expression\r
385         : and_expression ('^' and_expression)*\r
386         ;\r
387 \r
388 and_expression\r
389         : equality_expression ('&' equality_expression)*\r
390         ;\r
391 equality_expression\r
392         : relational_expression (('=='|'!=') relational_expression )*\r
393         ;\r
394 \r
395 relational_expression\r
396         : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*\r
397         ;\r
398 \r
399 shift_expression\r
400         : additive_expression (('<<'|'>>') additive_expression)*\r
401         ;\r
402 \r
403 // S t a t e m e n t s\r
404 \r
405 statement\r
406         : labeled_statement\r
407         | compound_statement\r
408         | expression_statement\r
409         | selection_statement\r
410         | iteration_statement\r
411         | jump_statement\r
412         | macro_statement\r
413         ;\r
414 \r
415 macro_statement\r
416         : IDENTIFIER '(' (IDENTIFIER | declaration*  statement_list?) ')'\r
417         ;\r
418         \r
419 labeled_statement\r
420         : IDENTIFIER ':' statement\r
421         | 'case' constant_expression ':' statement\r
422         | 'default' ':' statement\r
423         ;\r
424 \r
425 compound_statement\r
426         : '{' declaration* statement_list? '}'\r
427         ;\r
428 \r
429 statement_list\r
430         : statement+\r
431         ;\r
432 \r
433 expression_statement\r
434         : ';'\r
435         | expression ';'\r
436         ;\r
437 \r
438 selection_statement\r
439         : '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
440         | 'switch' '(' expression ')' statement\r
441         ;\r
442 \r
443 iteration_statement\r
444         : 'while' '(' e=expression ')' statement {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
445         | 'do' statement 'while' '(' e=expression ')' ';' {self.StorePredicateExpression($e.start.line, $e.start.charPositionInLine, $e.stop.line, $e.stop.charPositionInLine, $e.text)}\r
446         | '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
447         ;\r
448 \r
449 jump_statement\r
450         : 'goto' IDENTIFIER ';'\r
451         | 'continue' ';'\r
452         | 'break' ';'\r
453         | 'return' ';'\r
454         | 'return' expression ';'\r
455         ;\r
456 \r
457 IDENTIFIER\r
458         :       LETTER (LETTER|'0'..'9')*\r
459         ;\r
460         \r
461 fragment\r
462 LETTER\r
463         :       '$'\r
464         |       'A'..'Z'\r
465         |       'a'..'z'\r
466         |       '_'\r
467         ;\r
468 \r
469 CHARACTER_LITERAL\r
470     :   '\'' ( EscapeSequence | ~('\''|'\\') ) '\''\r
471     ;\r
472 \r
473 STRING_LITERAL\r
474     :  ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"'\r
475     ;\r
476     \r
477 HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;\r
478 \r
479 DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;\r
480 \r
481 OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;\r
482 \r
483 fragment\r
484 HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;\r
485 \r
486 fragment\r
487 IntegerTypeSuffix\r
488         :       ('u'|'U')? ('l'|'L')\r
489         |       ('u'|'U')  ('l'|'L')?\r
490         ;\r
491 \r
492 FLOATING_POINT_LITERAL\r
493     :   ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix?\r
494     |   '.' ('0'..'9')+ Exponent? FloatTypeSuffix?\r
495     |   ('0'..'9')+ Exponent FloatTypeSuffix?\r
496     |   ('0'..'9')+ Exponent? FloatTypeSuffix\r
497         ;\r
498 \r
499 fragment\r
500 Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;\r
501 \r
502 fragment\r
503 FloatTypeSuffix : ('f'|'F'|'d'|'D') ;\r
504 \r
505 fragment\r
506 EscapeSequence\r
507     :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')\r
508     |   OctalEscape\r
509     ;\r
510 \r
511 fragment\r
512 OctalEscape\r
513     :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')\r
514     |   '\\' ('0'..'7') ('0'..'7')\r
515     |   '\\' ('0'..'7')\r
516     ;\r
517 \r
518 fragment\r
519 UnicodeEscape\r
520     :   '\\' 'u' HexDigit HexDigit HexDigit HexDigit\r
521     ;\r
522 \r
523 WS  :  (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}\r
524     ;\r
525 \r
526 //COMMENT[content]\r
527 //@init{content = ''}\r
528 //    :   '/*' c=( options {greedy=false;} : . )* {content += c} '*/' {$channel=HIDDEN; print content}\r
529 //    ;\r
530 UnicodeVocabulary\r
531     : '\u0003'..'\uFFFE'\r
532     ;\r
533 COMMENT\r
534     :   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}\r
535     ;\r
536 \r
537 \r
538 LINE_COMMENT\r
539     : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r
540     ;\r
541 \r
542 // ignore #line info for now\r
543 LINE_COMMAND \r
544     : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}\r
545     ;\r