17 def printTokenInfo(self, line, offset, tokenText):
\r
18 print str(line)+ ',' + str(offset) + ':' + str(tokenText)
\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
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
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
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
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
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
47 : external_declaration+
\r
51 /*function_declaration
\r
53 print $function_declaration.text
\r
55 : declaration_specifiers IDENTIFIER '(' parameter_list ')' ';'
\r
58 external_declaration
\r
61 print $external_declaration.text
\r
63 : ( declaration_specifiers? declarator declaration* '{' )=> function_definition
\r
65 | macro_statement (';')?
\r
76 $function_definition::ModifierText = '';
\r
77 $function_definition::DeclText = '';
\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
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
90 : a='typedef' b=declaration_specifiers?
\r
91 c=init_declarator_list d=';'
\r
94 self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, $b.text, $c.text)
\r
96 self.StoreTypedefDefinition($a.line, $a.charPositionInLine, $d.line, $d.charPositionInLine, '', $c.text)
\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
102 declaration_specifiers
\r
103 : ( storage_class_specifier
\r
109 init_declarator_list
\r
110 : init_declarator (',' init_declarator)*
\r
114 : declarator ('=' initializer)?
\r
117 storage_class_specifier
\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
141 //{self.printTokenInfo($a.line, $a.pos, $a.text)}
\r
144 struct_or_union_specifier
\r
146 : struct_or_union IDENTIFIER? '{' struct_declaration_list '}'
\r
147 | struct_or_union IDENTIFIER
\r
155 struct_declaration_list
\r
156 : struct_declaration+
\r
160 : specifier_qualifier_list struct_declarator_list ';'
\r
163 specifier_qualifier_list
\r
164 : ( type_qualifier | type_specifier )+
\r
167 struct_declarator_list
\r
168 : struct_declarator (',' struct_declarator)*
\r
172 : declarator (':' constant_expression)?
\r
173 | ':' constant_expression
\r
178 : 'enum' '{' enumerator_list '}'
\r
179 | 'enum' IDENTIFIER '{' enumerator_list '}'
\r
180 | 'enum' IDENTIFIER
\r
184 : enumerator (',' enumerator)*
\r
188 : IDENTIFIER ('=' constant_expression)?
\r
199 : pointer? direct_declarator
\r
204 : IDENTIFIER declarator_suffix*
\r
205 | '(' declarator ')' declarator_suffix+
\r
209 : '[' constant_expression ']'
\r
211 | '(' parameter_type_list ')'
\r
212 | '(' identifier_list ')'
\r
217 : '*' type_qualifier+ pointer?
\r
222 parameter_type_list
\r
223 : parameter_list (',' '...')?
\r
227 : parameter_declaration (',' parameter_declaration)*
\r
230 parameter_declaration
\r
231 : declaration_specifiers (declarator|abstract_declarator)+
\r
240 : specifier_qualifier_list abstract_declarator?
\r
244 abstract_declarator
\r
245 : pointer direct_abstract_declarator?
\r
246 | direct_abstract_declarator
\r
249 direct_abstract_declarator
\r
250 : ( '(' abstract_declarator ')' | abstract_declarator_suffix ) abstract_declarator_suffix*
\r
253 abstract_declarator_suffix
\r
255 | '[' constant_expression ']'
\r
257 | '(' parameter_type_list ')'
\r
262 : assignment_expression
\r
263 | '{' initializer_list ','? '}'
\r
267 : initializer (',' initializer )*
\r
270 // E x p r e s s i o n s
\r
272 argument_expression_list
\r
273 : assignment_expression (',' assignment_expression)*
\r
276 additive_expression
\r
277 : (multiplicative_expression) ('+' multiplicative_expression | '-' multiplicative_expression)*
\r
280 multiplicative_expression
\r
281 : (cast_expression) ('*' cast_expression | '/' cast_expression | '%' cast_expression)*
\r
285 : '(' type_name ')' cast_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
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
323 | '(' expression ')'
\r
330 | CHARACTER_LITERAL
\r
332 | FLOATING_POINT_LITERAL
\r
338 : assignment_expression (',' assignment_expression)*
\r
341 constant_expression
\r
342 : conditional_expression
\r
345 assignment_expression
\r
346 : lvalue assignment_operator assignment_expression
\r
347 | conditional_expression
\r
354 assignment_operator
\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
372 logical_or_expression
\r
373 : logical_and_expression ('||' logical_and_expression)*
\r
376 logical_and_expression
\r
377 : inclusive_or_expression ('&&' inclusive_or_expression)*
\r
380 inclusive_or_expression
\r
381 : exclusive_or_expression ('|' exclusive_or_expression)*
\r
384 exclusive_or_expression
\r
385 : and_expression ('^' and_expression)*
\r
389 : equality_expression ('&' equality_expression)*
\r
391 equality_expression
\r
392 : relational_expression (('=='|'!=') relational_expression )*
\r
395 relational_expression
\r
396 : shift_expression (('<'|'>'|'<='|'>=') shift_expression)*
\r
400 : additive_expression (('<<'|'>>') additive_expression)*
\r
403 // S t a t e m e n t s
\r
406 : labeled_statement
\r
407 | compound_statement
\r
408 | expression_statement
\r
409 | selection_statement
\r
410 | iteration_statement
\r
416 : IDENTIFIER '(' (IDENTIFIER | declaration* statement_list?) ')'
\r
420 : IDENTIFIER ':' statement
\r
421 | 'case' constant_expression ':' statement
\r
422 | 'default' ':' statement
\r
426 : '{' declaration* statement_list? '}'
\r
433 expression_statement
\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
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
450 : 'goto' IDENTIFIER ';'
\r
454 | 'return' expression ';'
\r
458 : LETTER (LETTER|'0'..'9')*
\r
470 : '\'' ( EscapeSequence | ~('\''|'\\') ) '\''
\r
474 : ('L')? '"' ( EscapeSequence | ~('\\'|'"') )* '"'
\r
477 HEX_LITERAL : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ;
\r
479 DECIMAL_LITERAL : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ;
\r
481 OCTAL_LITERAL : '0' ('0'..'7')+ IntegerTypeSuffix? ;
\r
484 HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
\r
488 : ('u'|'U')? ('l'|'L')
\r
489 | ('u'|'U') ('l'|'L')?
\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
500 Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;
\r
503 FloatTypeSuffix : ('f'|'F'|'d'|'D') ;
\r
507 : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
\r
513 : '\\' ('0'..'3') ('0'..'7') ('0'..'7')
\r
514 | '\\' ('0'..'7') ('0'..'7')
\r
520 : '\\' 'u' HexDigit HexDigit HexDigit HexDigit
\r
523 WS : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}
\r
527 //@init{content = ''}
\r
528 // : '/*' c=( options {greedy=false;} : . )* {content += c} '*/' {$channel=HIDDEN; print content}
\r
531 : '\u0003'..'\uFFFE'
\r
534 : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
\r
539 : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
\r
542 // ignore #line info for now
\r
544 : '#' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
\r