]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Ecc/CodeFragmentCollector.py
Sync EDKII BaseTools to BaseTools project r1971
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / CodeFragmentCollector.py
CommitLineData
30fdf114
LG
1## @file\r
2# preprocess source file\r
3#\r
40d841f6 4# Copyright (c) 2007, Intel Corporation. All rights reserved.<BR>\r
30fdf114 5#\r
40d841f6 6# This program and the accompanying materials\r
30fdf114
LG
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 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 ## __IsWhiteSpace() method\r
79 #\r
80 # Whether char at current FileBufferPos is whitespace\r
81 #\r
82 # @param self The object pointer\r
83 # @param Char The char to test\r
84 # @retval True The char is a kind of white space\r
85 # @retval False The char is NOT a kind of white space\r
86 #\r
87 def __IsWhiteSpace(self, Char):\r
88 if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
89 return True\r
90 else:\r
91 return False\r
92\r
93 ## __SkipWhiteSpace() method\r
94 #\r
95 # Skip white spaces from current char, return number of chars skipped\r
96 #\r
97 # @param self The object pointer\r
98 # @retval Count The number of chars skipped\r
99 #\r
100 def __SkipWhiteSpace(self):\r
101 Count = 0\r
102 while not self.__EndOfFile():\r
103 Count += 1\r
104 if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):\r
105 self.__SkippedChars += str(self.__CurrentChar())\r
106 self.__GetOneChar()\r
107\r
108 else:\r
109 Count = Count - 1\r
110 return Count\r
111\r
112 ## __EndOfFile() method\r
113 #\r
114 # Judge current buffer pos is at file end\r
115 #\r
116 # @param self The object pointer\r
117 # @retval True Current File buffer position is at file end\r
118 # @retval False Current File buffer position is NOT at file end\r
119 #\r
120 def __EndOfFile(self):\r
121 NumberOfLines = len(self.Profile.FileLinesList)\r
122 SizeOfLastLine = NumberOfLines\r
123 if NumberOfLines > 0:\r
124 SizeOfLastLine = len(self.Profile.FileLinesList[-1])\r
125 \r
126 if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:\r
127 return True\r
128 elif self.CurrentLineNumber > NumberOfLines:\r
129 return True\r
130 else:\r
131 return False\r
132\r
133 ## __EndOfLine() method\r
134 #\r
135 # Judge current buffer pos is at line end\r
136 #\r
137 # @param self The object pointer\r
138 # @retval True Current File buffer position is at line end\r
139 # @retval False Current File buffer position is NOT at line end\r
140 #\r
141 def __EndOfLine(self):\r
142 SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])\r
143 if self.CurrentOffsetWithinLine >= SizeOfCurrentLine - 1:\r
144 return True\r
145 else:\r
146 return False\r
147 \r
148 ## Rewind() method\r
149 #\r
150 # Reset file data buffer to the initial state\r
151 #\r
152 # @param self The object pointer\r
153 #\r
154 def Rewind(self):\r
155 self.CurrentLineNumber = 1\r
156 self.CurrentOffsetWithinLine = 0\r
157 \r
158 ## __UndoOneChar() method\r
159 #\r
160 # Go back one char in the file buffer\r
161 #\r
162 # @param self The object pointer\r
163 # @retval True Successfully go back one char\r
164 # @retval False Not able to go back one char as file beginning reached\r
165 # \r
166 def __UndoOneChar(self):\r
167 \r
168 if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:\r
169 return False\r
170 elif self.CurrentOffsetWithinLine == 0:\r
171 self.CurrentLineNumber -= 1\r
172 self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1\r
173 else:\r
174 self.CurrentOffsetWithinLine -= 1\r
175 return True\r
176 \r
177 ## __GetOneChar() method\r
178 #\r
179 # Move forward one char in the file buffer\r
180 #\r
181 # @param self The object pointer\r
182 # \r
183 def __GetOneChar(self):\r
184 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
185 self.CurrentLineNumber += 1\r
186 self.CurrentOffsetWithinLine = 0\r
187 else:\r
188 self.CurrentOffsetWithinLine += 1\r
189\r
190 ## __CurrentChar() method\r
191 #\r
192 # Get the char pointed to by the file buffer pointer\r
193 #\r
194 # @param self The object pointer\r
195 # @retval Char Current char\r
196 # \r
197 def __CurrentChar(self):\r
198 CurrentChar = self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]\r
199# if CurrentChar > 255:\r
200# raise Warning("Non-Ascii char found At Line %d, offset %d" % (self.CurrentLineNumber, self.CurrentOffsetWithinLine), self.FileName, self.CurrentLineNumber)\r
201 return CurrentChar\r
202 \r
203 ## __NextChar() method\r
204 #\r
205 # Get the one char pass the char pointed to by the file buffer pointer\r
206 #\r
207 # @param self The object pointer\r
208 # @retval Char Next char\r
209 #\r
210 def __NextChar(self):\r
211 if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:\r
212 return self.Profile.FileLinesList[self.CurrentLineNumber][0]\r
213 else:\r
214 return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]\r
215 \r
216 ## __SetCurrentCharValue() method\r
217 #\r
218 # Modify the value of current char\r
219 #\r
220 # @param self The object pointer\r
221 # @param Value The new value of current char\r
222 #\r
223 def __SetCurrentCharValue(self, Value):\r
224 self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value\r
225 \r
226 ## __SetCharValue() method\r
227 #\r
228 # Modify the value of current char\r
229 #\r
230 # @param self The object pointer\r
231 # @param Value The new value of current char\r
232 #\r
233 def __SetCharValue(self, Line, Offset, Value):\r
234 self.Profile.FileLinesList[Line - 1][Offset] = Value\r
235 \r
236 ## __CurrentLine() method\r
237 #\r
238 # Get the list that contains current line contents\r
239 #\r
240 # @param self The object pointer\r
241 # @retval List current line contents\r
242 #\r
243 def __CurrentLine(self):\r
244 return self.Profile.FileLinesList[self.CurrentLineNumber - 1]\r
245 \r
246 ## __InsertComma() method\r
247 #\r
248 # Insert ',' to replace PP\r
249 #\r
250 # @param self The object pointer\r
251 # @retval List current line contents\r
252 #\r
253 def __InsertComma(self, Line):\r
254 \r
255 \r
256 if self.Profile.FileLinesList[Line - 1][0] != T_CHAR_HASH:\r
257 BeforeHashPart = str(self.Profile.FileLinesList[Line - 1]).split(T_CHAR_HASH)[0]\r
258 if BeforeHashPart.rstrip().endswith(T_CHAR_COMMA) or BeforeHashPart.rstrip().endswith(';'):\r
259 return\r
260 \r
261 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(','):\r
262 return\r
263 \r
264 if Line - 2 >= 0 and str(self.Profile.FileLinesList[Line - 2]).rstrip().endswith(';'):\r
265 return\r
266 \r
267 if str(self.Profile.FileLinesList[Line]).lstrip().startswith(',') or str(self.Profile.FileLinesList[Line]).lstrip().startswith(';'):\r
268 return\r
269 \r
270 self.Profile.FileLinesList[Line - 1].insert(self.CurrentOffsetWithinLine, ',')\r
271 \r
272 ## PreprocessFile() method\r
273 #\r
274 # Preprocess file contents, replace comments with spaces.\r
275 # In the end, rewind the file buffer pointer to the beginning\r
276 # BUGBUG: No !include statement processing contained in this procedure\r
277 # !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]\r
278 #\r
279 # @param self The object pointer\r
280 # \r
281 def PreprocessFile(self):\r
282\r
283 self.Rewind()\r
284 InComment = False\r
285 DoubleSlashComment = False\r
286 HashComment = False\r
287 PPExtend = False\r
288 CommentObj = None\r
289 PPDirectiveObj = None\r
290 # HashComment in quoted string " " is ignored.\r
291 InString = False\r
292 InCharLiteral = False \r
293 \r
294 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
295 while not self.__EndOfFile():\r
296 \r
297 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
298 InString = not InString\r
299 \r
300 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
301 InCharLiteral = not InCharLiteral\r
302 # meet new line, then no longer in a comment for // and '#'\r
303 if self.__CurrentChar() == T_CHAR_LF:\r
304 if HashComment and PPDirectiveObj != None:\r
305 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
306 PPDirectiveObj.Content += T_CHAR_LF\r
307 PPExtend = True\r
308 else:\r
309 PPExtend = False\r
310 \r
311 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
312 \r
313 if InComment and DoubleSlashComment:\r
314 InComment = False\r
315 DoubleSlashComment = False\r
316 CommentObj.Content += T_CHAR_LF\r
317 CommentObj.EndPos = EndLinePos\r
318 FileProfile.CommentList.append(CommentObj)\r
319 CommentObj = None\r
320 if InComment and HashComment and not PPExtend:\r
321 InComment = False\r
322 HashComment = False\r
323 PPDirectiveObj.Content += T_CHAR_LF\r
324 PPDirectiveObj.EndPos = EndLinePos\r
325 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
326 PPDirectiveObj = None\r
327 \r
328 if InString or InCharLiteral:\r
329 CurrentLine = "".join(self.__CurrentLine())\r
330 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
331 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
332 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
333 \r
334 if InComment and not DoubleSlashComment and not HashComment:\r
335 CommentObj.Content += T_CHAR_LF\r
336 self.CurrentLineNumber += 1\r
337 self.CurrentOffsetWithinLine = 0 \r
338 # check for */ comment end\r
339 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
340 CommentObj.Content += self.__CurrentChar()\r
341# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
342 self.__GetOneChar()\r
343 CommentObj.Content += self.__CurrentChar()\r
344# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
345 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
346 FileProfile.CommentList.append(CommentObj)\r
347 CommentObj = None\r
348 self.__GetOneChar()\r
349 InComment = False\r
350 # set comments to spaces\r
351 elif InComment: \r
352 if HashComment:\r
353 # // follows hash PP directive\r
354 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
355 InComment = False\r
356 HashComment = False\r
357 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)\r
358 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
359 PPDirectiveObj = None\r
360 continue\r
361 else:\r
362 PPDirectiveObj.Content += self.__CurrentChar()\r
363 if PPExtend:\r
364 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
365 else:\r
366 CommentObj.Content += self.__CurrentChar()\r
367# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
368 self.__GetOneChar()\r
369 # check for // comment\r
370 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
371 InComment = True\r
372 DoubleSlashComment = True\r
373 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)\r
374 # check for '#' comment\r
375 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
376 InComment = True\r
377 HashComment = True \r
378 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
379 # check for /* comment start\r
380 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
381 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)\r
382 CommentObj.Content += self.__CurrentChar()\r
383# self.__SetCurrentCharValue( T_CHAR_SPACE)\r
384 self.__GetOneChar()\r
385 CommentObj.Content += self.__CurrentChar()\r
386# self.__SetCurrentCharValue( T_CHAR_SPACE)\r
387 self.__GetOneChar()\r
388 InComment = True\r
389 else:\r
390 self.__GetOneChar()\r
391 \r
392 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
393 \r
394 if InComment and DoubleSlashComment:\r
395 CommentObj.EndPos = EndLinePos\r
396 FileProfile.CommentList.append(CommentObj)\r
397 if InComment and HashComment and not PPExtend:\r
398 PPDirectiveObj.EndPos = EndLinePos\r
399 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
400\r
401 self.Rewind()\r
402\r
403 def PreprocessFileWithClear(self):\r
404\r
405 self.Rewind()\r
406 InComment = False\r
407 DoubleSlashComment = False\r
408 HashComment = False\r
409 PPExtend = False\r
410 CommentObj = None\r
411 PPDirectiveObj = None\r
412 # HashComment in quoted string " " is ignored.\r
413 InString = False\r
414 InCharLiteral = False \r
415\r
416 self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesListFromFile]\r
417 while not self.__EndOfFile():\r
418 \r
419 if not InComment and self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE:\r
420 InString = not InString\r
421 \r
422 if not InComment and self.__CurrentChar() == T_CHAR_SINGLE_QUOTE:\r
423 InCharLiteral = not InCharLiteral\r
424 # meet new line, then no longer in a comment for // and '#'\r
425 if self.__CurrentChar() == T_CHAR_LF:\r
426 if HashComment and PPDirectiveObj != None:\r
427 if PPDirectiveObj.Content.rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
428 PPDirectiveObj.Content += T_CHAR_LF\r
429 PPExtend = True\r
430 else:\r
431 PPExtend = False\r
432 \r
433 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
434 \r
435 if InComment and DoubleSlashComment:\r
436 InComment = False\r
437 DoubleSlashComment = False\r
438 CommentObj.Content += T_CHAR_LF\r
439 CommentObj.EndPos = EndLinePos\r
440 FileProfile.CommentList.append(CommentObj)\r
441 CommentObj = None\r
442 if InComment and HashComment and not PPExtend:\r
443 InComment = False\r
444 HashComment = False\r
445 PPDirectiveObj.Content += T_CHAR_LF\r
446 PPDirectiveObj.EndPos = EndLinePos\r
447 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
448 PPDirectiveObj = None\r
449 \r
450 if InString or InCharLiteral:\r
451 CurrentLine = "".join(self.__CurrentLine())\r
452 if CurrentLine.rstrip(T_CHAR_LF).rstrip(T_CHAR_CR).endswith(T_CHAR_BACKSLASH):\r
453 SlashIndex = CurrentLine.rindex(T_CHAR_BACKSLASH)\r
454 self.__SetCharValue(self.CurrentLineNumber, SlashIndex, T_CHAR_SPACE)\r
455 \r
456 if InComment and not DoubleSlashComment and not HashComment:\r
457 CommentObj.Content += T_CHAR_LF\r
458 self.CurrentLineNumber += 1\r
459 self.CurrentOffsetWithinLine = 0 \r
460 # check for */ comment end\r
461 elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:\r
462 CommentObj.Content += self.__CurrentChar()\r
463 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
464 self.__GetOneChar()\r
465 CommentObj.Content += self.__CurrentChar()\r
466 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
467 CommentObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
468 FileProfile.CommentList.append(CommentObj)\r
469 CommentObj = None\r
470 self.__GetOneChar()\r
471 InComment = False\r
472 # set comments to spaces\r
473 elif InComment: \r
474 if HashComment:\r
475 # // follows hash PP directive\r
476 if self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
477 InComment = False\r
478 HashComment = False\r
479 PPDirectiveObj.EndPos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine - 1)\r
480 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
481 PPDirectiveObj = None\r
482 continue\r
483 else:\r
484 PPDirectiveObj.Content += self.__CurrentChar()\r
485# if PPExtend:\r
486# self.__SetCurrentCharValue(T_CHAR_SPACE)\r
487 else:\r
488 CommentObj.Content += self.__CurrentChar()\r
489 self.__SetCurrentCharValue(T_CHAR_SPACE)\r
490 self.__GetOneChar()\r
491 # check for // comment\r
492 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH:\r
493 InComment = True\r
494 DoubleSlashComment = True\r
495 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_TWO_SLASH)\r
496 # check for '#' comment\r
497 elif self.__CurrentChar() == T_CHAR_HASH and not InString and not InCharLiteral:\r
498 InComment = True\r
499 HashComment = True \r
500 PPDirectiveObj = PP_Directive('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None)\r
501 # check for /* comment start\r
502 elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:\r
503 CommentObj = Comment('', (self.CurrentLineNumber, self.CurrentOffsetWithinLine), None, T_COMMENT_SLASH_STAR)\r
504 CommentObj.Content += self.__CurrentChar()\r
505 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
506 self.__GetOneChar()\r
507 CommentObj.Content += self.__CurrentChar()\r
508 self.__SetCurrentCharValue( T_CHAR_SPACE)\r
509 self.__GetOneChar()\r
510 InComment = True\r
511 else:\r
512 self.__GetOneChar()\r
513\r
514 EndLinePos = (self.CurrentLineNumber, self.CurrentOffsetWithinLine)\r
515 \r
516 if InComment and DoubleSlashComment:\r
517 CommentObj.EndPos = EndLinePos\r
518 FileProfile.CommentList.append(CommentObj)\r
519 if InComment and HashComment and not PPExtend:\r
520 PPDirectiveObj.EndPos = EndLinePos\r
521 FileProfile.PPDirectiveList.append(PPDirectiveObj)\r
522 self.Rewind()\r
523\r
524 ## ParseFile() method\r
525 #\r
526 # Parse the file profile buffer to extract fd, fv ... information\r
527 # Exception will be raised if syntax error found\r
528 #\r
529 # @param self The object pointer\r
530 #\r
531 def ParseFile(self):\r
532 self.PreprocessFile()\r
533 # restore from ListOfList to ListOfString\r
534 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
535 FileStringContents = ''\r
536 for fileLine in self.Profile.FileLinesList:\r
537 FileStringContents += fileLine\r
538 cStream = antlr3.StringStream(FileStringContents)\r
539 lexer = CLexer(cStream)\r
540 tStream = antlr3.CommonTokenStream(lexer)\r
541 parser = CParser(tStream)\r
542 parser.translation_unit()\r
543 \r
544 def ParseFileWithClearedPPDirective(self):\r
545 self.PreprocessFileWithClear()\r
546 # restore from ListOfList to ListOfString\r
547 self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]\r
548 FileStringContents = ''\r
549 for fileLine in self.Profile.FileLinesList:\r
550 FileStringContents += fileLine\r
551 cStream = antlr3.StringStream(FileStringContents)\r
552 lexer = CLexer(cStream)\r
553 tStream = antlr3.CommonTokenStream(lexer)\r
554 parser = CParser(tStream)\r
555 parser.translation_unit()\r
556 \r
557 def CleanFileProfileBuffer(self):\r
558 FileProfile.CommentList = []\r
559 FileProfile.PPDirectiveList = []\r
560 FileProfile.PredicateExpressionList = []\r
561 FileProfile.FunctionDefinitionList = []\r
562 FileProfile.VariableDeclarationList = []\r
563 FileProfile.EnumerationDefinitionList = []\r
564 FileProfile.StructUnionDefinitionList = []\r
565 FileProfile.TypedefDefinitionList = []\r
566 FileProfile.FunctionCallingList = []\r
567 \r
568 def PrintFragments(self):\r
569 \r
570 print '################# ' + self.FileName + '#####################'\r
571 \r
572 print '/****************************************/'\r
573 print '/*************** COMMENTS ***************/'\r
574 print '/****************************************/'\r
575 for comment in FileProfile.CommentList:\r
576 print str(comment.StartPos) + comment.Content\r
577 \r
578 print '/****************************************/'\r
579 print '/********* PREPROCESS DIRECTIVES ********/'\r
580 print '/****************************************/'\r
581 for pp in FileProfile.PPDirectiveList:\r
582 print str(pp.StartPos) + pp.Content\r
583 \r
584 print '/****************************************/'\r
585 print '/********* VARIABLE DECLARATIONS ********/'\r
586 print '/****************************************/'\r
587 for var in FileProfile.VariableDeclarationList:\r
588 print str(var.StartPos) + var.Modifier + ' '+ var.Declarator\r
589 \r
590 print '/****************************************/'\r
591 print '/********* FUNCTION DEFINITIONS *********/'\r
592 print '/****************************************/'\r
593 for func in FileProfile.FunctionDefinitionList:\r
594 print str(func.StartPos) + func.Modifier + ' '+ func.Declarator + ' ' + str(func.NamePos)\r
595 \r
596 print '/****************************************/'\r
597 print '/************ ENUMERATIONS **************/'\r
598 print '/****************************************/'\r
599 for enum in FileProfile.EnumerationDefinitionList:\r
600 print str(enum.StartPos) + enum.Content\r
601 \r
602 print '/****************************************/'\r
603 print '/*********** STRUCTS/UNIONS *************/'\r
604 print '/****************************************/'\r
605 for su in FileProfile.StructUnionDefinitionList:\r
606 print str(su.StartPos) + su.Content\r
607 \r
608 print '/****************************************/'\r
609 print '/********* PREDICATE EXPRESSIONS ********/'\r
610 print '/****************************************/'\r
611 for predexp in FileProfile.PredicateExpressionList:\r
612 print str(predexp.StartPos) + predexp.Content\r
613 \r
614 print '/****************************************/' \r
615 print '/************** TYPEDEFS ****************/'\r
616 print '/****************************************/'\r
617 for typedef in FileProfile.TypedefDefinitionList:\r
618 print str(typedef.StartPos) + typedef.ToType\r
619 \r
620if __name__ == "__main__":\r
621 \r
622 collector = CodeFragmentCollector(sys.argv[1])\r
623 collector.PreprocessFile()\r
624 print "For Test."\r