]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
BaseTools: use set instead of list for a variable to be used with in
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / CodeFragmentCollector.py
... / ...
CommitLineData
1## @file\r
2# preprocess source file\r
3#\r
4# Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
5#\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15##\r
16# Import Modules\r
17#\r
18\r
19import re\r
20import Common.LongFilePathOs as os\r
21import sys\r
22\r
23import antlr3\r
24from CLexer import CLexer\r
25from CParser import CParser\r
26\r
27import FileProfile\r
28from CodeFragment import Comment\r
29from CodeFragment import PP_Directive\r
30from ParserWarning import Warning\r
31\r
32\r
33##define T_CHAR_SPACE ' '\r
34##define T_CHAR_NULL '\0'\r
35##define T_CHAR_CR '\r'\r
36##define T_CHAR_TAB '\t'\r
37##define T_CHAR_LF '\n'\r
38##define T_CHAR_SLASH '/'\r
39##define T_CHAR_BACKSLASH '\\'\r
40##define T_CHAR_DOUBLE_QUOTE '\"'\r
41##define T_CHAR_SINGLE_QUOTE '\''\r
42##define T_CHAR_STAR '*'\r
43##define T_CHAR_HASH '#'\r
44\r
45(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \\r
46T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \\r
47(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')\r
48\r
49SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') \r
50\r
51(T_COMMENT_TWO_SLASH, T_COMMENT_SLASH_STAR) = (0, 1)\r
52\r
53(T_PP_INCLUDE, T_PP_DEFINE, T_PP_OTHERS) = (0, 1, 2)\r
54\r
55## The collector for source code fragments.\r
56#\r
57# PreprocessFile method should be called prior to ParseFile\r
58#\r
59# GetNext*** procedures mean these procedures will get next token first, then make judgement.\r
60# Get*** procedures mean these procedures will make judgement on current token only.\r
61# \r
62class CodeFragmentCollector:\r
63 ## The constructor\r
64 #\r
65 # @param self The object pointer\r
66 # @param FileName The file that to be parsed\r
67 #\r
68 def __init__(self, FileName):\r
69 self.Profile = FileProfile.FileProfile(FileName)\r
70 self.Profile.FileLinesList.append(T_CHAR_LF)\r
71 self.FileName = FileName\r
72 self.CurrentLineNumber = 1\r
73 self.CurrentOffsetWithinLine = 0\r
74\r
75 self.__Token = ""\r
76 self.__SkippedChars = ""\r
77\r
78 ## __EndOfFile() method\r
79 #\r
80 # Judge current buffer pos is at file end\r
81 #\r
82 # @param self The object pointer\r
83 # @retval True Current File buffer position is at file end\r
84 # @retval False Current File buffer position is NOT at file end\r
85 #\r
86 def __EndOfFile(self):\r
87 NumberOfLines = len(self.Profile.FileLinesList)\r
88 SizeOfLastLine = NumberOfLines\r
89 if NumberOfLines > 0:\r
90 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
91 \r
92 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
93 return True\r
94 elif self.CurrentLineNumber > NumberOfLines:\r
95 return True\r
96 else:\r
97 return False\r
98\r
99 ## __EndOfLine() method\r
100 #\r
101 # Judge current buffer pos is at line end\r
102 #\r
103 # @param self The object pointer\r
104 # @retval True Current File buffer position is at line end\r
105 # @retval False Current File buffer position is NOT at line end\r
106 #\r
107 def __EndOfLine(self):\r
108 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
109 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine - 1:\r
110 return True\r
111 else:\r
112 return False\r
113 \r
114 ## Rewind() method\r
115 #\r
116 # Reset file data buffer to the initial state\r
117 #\r
118 # @param self The object pointer\r
119 #\r
120 def Rewind(self):\r
121 self.CurrentLineNumber = 1\r
122 self.CurrentOffsetWithinLine = 0\r
123 \r
124 ## __UndoOneChar() method\r
125 #\r
126 # Go back one char in the file buffer\r
127 #\r
128 # @param self The object pointer\r
129 # @retval True Successfully go back one char\r
130 # @retval False Not able to go back one char as file beginning reached\r
131 # \r
132 def __UndoOneChar(self):\r
133 \r
134 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
135 return False\r
136 elif self.CurrentOffsetWithinLine == 0:\r
137 self.CurrentLineNumber -= 1\r
138 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
139 else:\r
140 self.CurrentOffsetWithinLine -= 1\r
141 return True\r
142 \r
143 ## __GetOneChar() method\r
144 #\r
145 # Move forward one char in the file buffer\r
146 #\r
147 # @param self The object pointer\r
148 # \r
149 def __GetOneChar(self):\r
150 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
151 self.CurrentLineNumber += 1\r
152 self.CurrentOffsetWithinLine = 0\r
153 else:\r
154 self.CurrentOffsetWithinLine += 1\r
155\r
156 ## __CurrentChar() method\r
157 #\r
158 # Get the char pointed to by the file buffer pointer\r
159 #\r
160 # @param self The object pointer\r
161 # @retval Char Current char\r
162 # \r
163 def __CurrentChar(self):\r
164 CurrentChar = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
165# if CurrentChar > 255:\r
166# raise Warning("Non-Ascii char found At Line %d, offset %d" % (self.CurrentLineNumber, self.CurrentOffsetWithinLine), self.FileName, self.CurrentLineNumber)\r
167 return CurrentChar\r
168 \r
169 ## __NextChar() method\r
170 #\r
171 # Get the one char pass the char pointed to by the file buffer pointer\r
172 #\r
173 # @param self The object pointer\r
174 # @retval Char Next char\r
175 #\r
176 def __NextChar(self):\r
177 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
178 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
179 else:\r
180 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
181 \r
182 ## __SetCurrentCharValue() method\r
183 #\r
184 # Modify the value of current char\r
185 #\r
186 # @param self The object pointer\r
187 # @param Value The new value of current char\r
188 #\r
189 def __SetCurrentCharValue(self, Value):\r
190 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
191 \r
192 ## __SetCharValue() method\r
193 #\r
194 # Modify the value of current char\r
195 #\r
196 # @param self The object pointer\r
197 # @param Value The new value of current char\r
198 #\r
199 def __SetCharValue(self, Line, Offset, Value):\r
200 self.Profile.FileLinesList[Line - 1][Offset] = Value\r
201 \r
202 ## __CurrentLine() method\r
203 #\r
204 # Get the list that contains current line contents\r
205 #\r
206 # @param self The object pointer\r
207 # @retval List current line contents\r
208 #\r
209 def __CurrentLine(self):\r
210 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
211 \r
212 ## __InsertComma() method\r
213 #\r
214 # Insert ',' to replace PP\r
215 #\r
216 # @param self The object pointer\r
217 # @retval List current line contents\r
218 #\r
219 def __InsertComma(self, Line):\r
220 \r
221 \r
222 if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH:\r
223 BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0]\r
224 if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'):\r
225 return\r
226 \r
227 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','):\r
228 return\r
229 \r
230 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'):\r
231 return\r
232 \r
233 if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'):\r
234 return\r
235 \r
236 self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',')\r
237 \r
238 ## PreprocessFile() method\r
239 #\r
240 # Preprocess file contents, replace comments with spaces.\r
241 # In the end, rewind the file buffer pointer to the beginning\r
242 # BUGBUG: No !include statement processing contained in this procedure\r
243 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
244 #\r
245 # @param self The object pointer\r
246 # \r
247 def PreprocessFile(self):\r
248\r
249 self.Rewind()\r
250 InComment = False\r
251 DoubleSlashComment = False\r
252 HashComment = False\r
253 PPExtend = False\r
254 CommentObj = None\r
255 PPDirectiveObj = None\r
256 # HashComment in quoted string " " is ignored.\r
257 InString = False\r
258 InCharLiteral = False \r
259 \r
260 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
261 while not self.__EndOfFile():\r
262 \r
263 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
264 InString = not InString\r
265 \r
266 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
267 InCharLiteral = not InCharLiteral\r
268 # meet new line, then no longer in a comment for // and '#'\r
269 if self.__CurrentChar() == T_CHAR_LF:\r
270 if HashComment and PPDirectiveObj is not None:\r
271 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
272 PPDirectiveObj.Content += T_CHAR_LF\r
273 PPExtend = True\r
274 else:\r
275 PPExtend = False\r
276 \r
277 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
278 \r
279 if InComment and DoubleSlashComment:\r
280 InComment = False\r
281 DoubleSlashComment = False\r
282 CommentObj.Content += T_CHAR_LF\r
283 CommentObj.EndPos = EndLinePos\r
284 FileProfile.CommentList.append(CommentObj)\r
285 CommentObj = None\r
286 if InComment and HashComment and not PPExtend:\r
287 InComment = False\r
288 HashComment = False\r
289 PPDirectiveObj.Content += T_CHAR_LF\r
290 PPDirectiveObj.EndPos = EndLinePos\r
291 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
292 PPDirectiveObj = None\r
293 \r
294 if InString or InCharLiteral:\r
295 CurrentLine = "".join(self.__CurrentLine())\r
296 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
297 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
298 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
299 \r
300 if InComment and not DoubleSlashComment and not HashComment:\r
301 CommentObj.Content += T_CHAR_LF\r
302 self.CurrentLineNumber += 1\r
303 self.CurrentOffsetWithinLine = 0 \r
304 # check for */ comment end\r
305 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
306 CommentObj.Content += self.__CurrentChar()\r
307# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
308 self.__GetOneChar()\r
309 CommentObj.Content += self.__CurrentChar()\r
310# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
311 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
312 FileProfile.CommentList.append(CommentObj)\r
313 CommentObj = None\r
314 self.__GetOneChar()\r
315 InComment = False\r
316 # set comments to spaces\r
317 elif InComment: \r
318 if HashComment:\r
319 # // follows hash PP directive\r
320 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
321 InComment = False\r
322 HashComment = False\r
323 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)\r
324 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
325 PPDirectiveObj = None\r
326 continue\r
327 else:\r
328 PPDirectiveObj.Content += self.__CurrentChar()\r
329 if PPExtend:\r
330 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
331 else:\r
332 CommentObj.Content += self.__CurrentChar()\r
333# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
334 self.__GetOneChar()\r
335 # check for // comment\r
336 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
337 InComment = True\r
338 DoubleSlashComment = True\r
339 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)\r
340 # check for '#' comment\r
341 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
342 InComment = True\r
343 HashComment = True \r
344 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
345 # check for /* comment start\r
346 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
347 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)\r
348 CommentObj.Content += self.__CurrentChar()\r
349# self.__SetCurrentCharValue( T_CHAR_SPACE)\r
350 self.__GetOneChar()\r
351 CommentObj.Content += self.__CurrentChar()\r
352# self.__SetCurrentCharValue( T_CHAR_SPACE)\r
353 self.__GetOneChar()\r
354 InComment = True\r
355 else:\r
356 self.__GetOneChar()\r
357 \r
358 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
359 \r
360 if InComment and DoubleSlashComment:\r
361 CommentObj.EndPos = EndLinePos\r
362 FileProfile.CommentList.append(CommentObj)\r
363 if InComment and HashComment and not PPExtend:\r
364 PPDirectiveObj.EndPos = EndLinePos\r
365 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
366\r
367 self.Rewind()\r
368\r
369 def PreprocessFileWithClear(self):\r
370\r
371 self.Rewind()\r
372 InComment = False\r
373 DoubleSlashComment = False\r
374 HashComment = False\r
375 PPExtend = False\r
376 CommentObj = None\r
377 PPDirectiveObj = None\r
378 # HashComment in quoted string " " is ignored.\r
379 InString = False\r
380 InCharLiteral = False \r
381\r
382 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
383 while not self.__EndOfFile():\r
384 \r
385 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
386 InString = not InString\r
387 \r
388 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
389 InCharLiteral = not InCharLiteral\r
390 # meet new line, then no longer in a comment for // and '#'\r
391 if self.__CurrentChar() == T_CHAR_LF:\r
392 if HashComment and PPDirectiveObj is not None:\r
393 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
394 PPDirectiveObj.Content += T_CHAR_LF\r
395 PPExtend = True\r
396 else:\r
397 PPExtend = False\r
398 \r
399 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
400 \r
401 if InComment and DoubleSlashComment:\r
402 InComment = False\r
403 DoubleSlashComment = False\r
404 CommentObj.Content += T_CHAR_LF\r
405 CommentObj.EndPos = EndLinePos\r
406 FileProfile.CommentList.append(CommentObj)\r
407 CommentObj = None\r
408 if InComment and HashComment and not PPExtend:\r
409 InComment = False\r
410 HashComment = False\r
411 PPDirectiveObj.Content += T_CHAR_LF\r
412 PPDirectiveObj.EndPos = EndLinePos\r
413 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
414 PPDirectiveObj = None\r
415 \r
416 if InString or InCharLiteral:\r
417 CurrentLine = "".join(self.__CurrentLine())\r
418 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
419 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
420 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
421 \r
422 if InComment and not DoubleSlashComment and not HashComment:\r
423 CommentObj.Content += T_CHAR_LF\r
424 self.CurrentLineNumber += 1\r
425 self.CurrentOffsetWithinLine = 0 \r
426 # check for */ comment end\r
427 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
428 CommentObj.Content += self.__CurrentChar()\r
429 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
430 self.__GetOneChar()\r
431 CommentObj.Content += self.__CurrentChar()\r
432 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
433 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
434 FileProfile.CommentList.append(CommentObj)\r
435 CommentObj = None\r
436 self.__GetOneChar()\r
437 InComment = False\r
438 # set comments to spaces\r
439 elif InComment: \r
440 if HashComment:\r
441 # // follows hash PP directive\r
442 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
443 InComment = False\r
444 HashComment = False\r
445 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)\r
446 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
447 PPDirectiveObj = None\r
448 continue\r
449 else:\r
450 PPDirectiveObj.Content += self.__CurrentChar()\r
451# if PPExtend:\r
452# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
453 else:\r
454 CommentObj.Content += self.__CurrentChar()\r
455 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
456 self.__GetOneChar()\r
457 # check for // comment\r
458 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
459 InComment = True\r
460 DoubleSlashComment = True\r
461 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)\r
462 # check for '#' comment\r
463 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
464 InComment = True\r
465 HashComment = True \r
466 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
467 # check for /* comment start\r
468 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
469 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)\r
470 CommentObj.Content += self.__CurrentChar()\r
471 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
472 self.__GetOneChar()\r
473 CommentObj.Content += self.__CurrentChar()\r
474 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
475 self.__GetOneChar()\r
476 InComment = True\r
477 else:\r
478 self.__GetOneChar()\r
479\r
480 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
481 \r
482 if InComment and DoubleSlashComment:\r
483 CommentObj.EndPos = EndLinePos\r
484 FileProfile.CommentList.append(CommentObj)\r
485 if InComment and HashComment and not PPExtend:\r
486 PPDirectiveObj.EndPos = EndLinePos\r
487 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
488 self.Rewind()\r
489\r
490 ## ParseFile() method\r
491 #\r
492 # Parse the file profile buffer to extract fd, fv ... information\r
493 # Exception will be raised if syntax error found\r
494 #\r
495 # @param self The object pointer\r
496 #\r
497 def ParseFile(self):\r
498 self.PreprocessFile()\r
499 # restore from ListOfList to ListOfString\r
500 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
501 FileStringContents = ''\r
502 for fileLine in self.Profile.FileLinesList:\r
503 FileStringContents += fileLine\r
504 cStream = antlr3.StringStream(FileStringContents)\r
505 lexer = CLexer(cStream)\r
506 tStream = antlr3.CommonTokenStream(lexer)\r
507 parser = CParser(tStream)\r
508 parser.translation_unit()\r
509 \r
510 def ParseFileWithClearedPPDirective(self):\r
511 self.PreprocessFileWithClear()\r
512 # restore from ListOfList to ListOfString\r
513 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
514 FileStringContents = ''\r
515 for fileLine in self.Profile.FileLinesList:\r
516 FileStringContents += fileLine\r
517 cStream = antlr3.StringStream(FileStringContents)\r
518 lexer = CLexer(cStream)\r
519 tStream = antlr3.CommonTokenStream(lexer)\r
520 parser = CParser(tStream)\r
521 parser.translation_unit()\r
522 \r
523 def CleanFileProfileBuffer(self):\r
524 FileProfile.CommentList = []\r
525 FileProfile.PPDirectiveList = []\r
526 FileProfile.PredicateExpressionList = []\r
527 FileProfile.FunctionDefinitionList = []\r
528 FileProfile.VariableDeclarationList = []\r
529 FileProfile.EnumerationDefinitionList = []\r
530 FileProfile.StructUnionDefinitionList = []\r
531 FileProfile.TypedefDefinitionList = []\r
532 FileProfile.FunctionCallingList = []\r
533 \r
534 def PrintFragments(self):\r
535 \r
536 print '################# ' + self.FileName + '#####################'\r
537 \r
538 print '/****************************************/'\r
539 print '/*************** COMMENTS ***************/'\r
540 print '/****************************************/'\r
541 for comment in FileProfile.CommentList:\r
542 print str(comment.StartPos) + comment.Content\r
543 \r
544 print '/****************************************/'\r
545 print '/********* PREPROCESS DIRECTIVES ********/'\r
546 print '/****************************************/'\r
547 for pp in FileProfile.PPDirectiveList:\r
548 print str(pp.StartPos) + pp.Content\r
549 \r
550 print '/****************************************/'\r
551 print '/********* VARIABLE DECLARATIONS ********/'\r
552 print '/****************************************/'\r
553 for var in FileProfile.VariableDeclarationList:\r
554 print str(var.StartPos) + var.Modifier + ' '+ var.Declarator\r
555 \r
556 print '/****************************************/'\r
557 print '/********* FUNCTION DEFINITIONS *********/'\r
558 print '/****************************************/'\r
559 for func in FileProfile.FunctionDefinitionList:\r
560 print str(func.StartPos) + func.Modifier + ' '+ func.Declarator + ' ' + str(func.NamePos)\r
561 \r
562 print '/****************************************/'\r
563 print '/************ ENUMERATIONS **************/'\r
564 print '/****************************************/'\r
565 for enum in FileProfile.EnumerationDefinitionList:\r
566 print str(enum.StartPos) + enum.Content\r
567 \r
568 print '/****************************************/'\r
569 print '/*********** STRUCTS/UNIONS *************/'\r
570 print '/****************************************/'\r
571 for su in FileProfile.StructUnionDefinitionList:\r
572 print str(su.StartPos) + su.Content\r
573 \r
574 print '/****************************************/'\r
575 print '/********* PREDICATE EXPRESSIONS ********/'\r
576 print '/****************************************/'\r
577 for predexp in FileProfile.PredicateExpressionList:\r
578 print str(predexp.StartPos) + predexp.Content\r
579 \r
580 print '/****************************************/' \r
581 print '/************** TYPEDEFS ****************/'\r
582 print '/****************************************/'\r
583 for typedef in FileProfile.TypedefDefinitionList:\r
584 print str(typedef.StartPos) + typedef.ToType\r
585 \r
586if __name__ == "__main__":\r
587 \r
588 collector = CodeFragmentCollector(sys.argv[1])\r
589 collector.PreprocessFile()\r
590 print "For Test."\r