[edk2] [PATCH] BaseTools: Remove FdfParserLite.py from soure code

Feng, YunhuaX posted 1 patch 6 years, 1 month ago
Failed in applying to current master (apply log)
BaseTools/Source/Python/Common/FdfClassObject.py |    2 +-
BaseTools/Source/Python/Common/FdfParserLite.py  | 3639 ----------------------
BaseTools/Source/Python/GenFds/FdfParser.py      |    3 +-
BaseTools/Source/Python/Makefile                 |    1 -
4 files changed, 3 insertions(+), 3642 deletions(-)
delete mode 100644 BaseTools/Source/Python/Common/FdfParserLite.py
[edk2] [PATCH] BaseTools: Remove FdfParserLite.py from soure code
Posted by Feng, YunhuaX 6 years, 1 month ago
Remove FdfParserLite.py from source code

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
---
 BaseTools/Source/Python/Common/FdfClassObject.py |    2 +-
 BaseTools/Source/Python/Common/FdfParserLite.py  | 3639 ----------------------
 BaseTools/Source/Python/GenFds/FdfParser.py      |    3 +-
 BaseTools/Source/Python/Makefile                 |    1 -
 4 files changed, 3 insertions(+), 3642 deletions(-)
 delete mode 100644 BaseTools/Source/Python/Common/FdfParserLite.py

diff --git a/BaseTools/Source/Python/Common/FdfClassObject.py b/BaseTools/Source/Python/Common/FdfClassObject.py
index 9a7d6494d3..0401247351 100644
--- a/BaseTools/Source/Python/Common/FdfClassObject.py
+++ b/BaseTools/Source/Python/Common/FdfClassObject.py
@@ -12,11 +12,11 @@
 #
 
 ##
 # Import Modules
 #
-from FdfParserLite import FdfParser
+from GenFds.FdfParser import FdfParser
 from Table.TableFdf import TableFdf
 from CommonDataClass.DataClass import MODEL_FILE_FDF, MODEL_PCD, MODEL_META_DATA_COMPONENT
 from String import NormPath
 
 
diff --git a/BaseTools/Source/Python/Common/FdfParserLite.py b/BaseTools/Source/Python/Common/FdfParserLite.py
deleted file mode 100644
index dd822505d3..0000000000
--- a/BaseTools/Source/Python/Common/FdfParserLite.py
+++ /dev/null
@@ -1,3639 +0,0 @@
-## @file
-# parse FDF file
-#
-#  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  This program and the accompanying materials
-#  are licensed and made available under the terms and conditions of the BSD License
-#  which accompanies this distribution.  The full text of the license may be found at
-#  http://opensource.org/licenses/bsd-license.php
-#
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-
-##
-# Import Modules
-#
-import re
-import Common.LongFilePathOs as os
-
-import CommonDataClass.FdfClass
-from Common.LongFilePathSupport import OpenLongFilePath as open
-from Common.MultipleWorkspace import MultipleWorkspace as mws
-from Common.RangeExpression import RangeExpression
-from Common.GlobalData import *
-import string
-
-##define T_CHAR_SPACE                ' '
-##define T_CHAR_NULL                 '\0'
-##define T_CHAR_CR                   '\r'
-##define T_CHAR_TAB                  '\t'
-##define T_CHAR_LF                   '\n'
-##define T_CHAR_SLASH                '/'
-##define T_CHAR_BACKSLASH            '\\'
-##define T_CHAR_DOUBLE_QUOTE         '\"'
-##define T_CHAR_SINGLE_QUOTE         '\''
-##define T_CHAR_STAR                 '*'
-##define T_CHAR_HASH                 '#'
-
-(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \
-T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \
-(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
-
-SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') 
-
-IncludeFileList = []
-# Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
-InputMacroDict = {}
-# All Macro values when parsing file, not replace existing Macro
-AllMacroList = []
-
-FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')
-TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
-
-def GetRealFileLine (File, Line):
-    
-    InsertedLines = 0
-    for Profile in IncludeFileList:
-        if Line >= Profile.InsertStartLineNumber and Line < Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):
-            return (Profile.FileName, Line - Profile.InsertStartLineNumber + 1)
-        if Line >= Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):
-            InsertedLines += Profile.InsertAdjust + len(Profile.FileLinesList)
-    
-    return (File, Line - InsertedLines)
-
-## The exception class that used to report error messages when parsing FDF
-#
-# Currently the "ToolName" is set to be "FDF Parser".
-#
-class Warning (Exception):
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  Str         The message to record
-    #   @param  File        The FDF name
-    #   @param  Line        The Line number that error occurs
-    #
-    def __init__(self, Str, File=None, Line=None):
-
-        FileLineTuple = GetRealFileLine(File, Line)
-        self.FileName = FileLineTuple[0]
-        self.LineNumber = FileLineTuple[1]
-        self.message = Str + str(self.LineNumber)
-        self.ToolName = 'FDF Parser'
-        
-## The MACRO class that used to record macro value data when parsing include file
-#
-#
-class MacroProfile :
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName, Line):
-        self.FileName = FileName        
-        self.DefinedAtLine  = Line
-        self.MacroName = None
-        self.MacroValue = None
-
-## The Include file content class that used to record file data when parsing include file
-#
-# May raise Exception when opening file.
-#
-class IncludeFileProfile :
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName):
-        self.FileName = FileName
-        self.FileLinesList = []
-        try:
-            fsock = open(FileName, "rb", 0)
-            try:
-                self.FileLinesList = fsock.readlines()
-            finally:
-                fsock.close()
-
-        except IOError:
-            raise Warning("Error when opening file %s" % FileName)
-        
-        self.InsertStartLineNumber = None
-        self.InsertAdjust = 0
-
-## The FDF content class that used to record file data when parsing FDF
-#
-# May raise Exception when opening file.
-#
-class FileProfile :
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName):
-        self.FileLinesList = []
-        try:
-            fsock = open(FileName, "rb", 0)
-            try:
-                self.FileLinesList = fsock.readlines()
-            finally:
-                fsock.close()
-
-        except IOError:
-            raise Warning("Error when opening file %s" % FileName)
-        
-        self.PcdDict = {}
-        self.InfList = []
-        
-        self.PcdFileLineDict = {}
-        self.InfFileLineList = []
-        
-        self.FdDict = {}
-        self.FvDict = {}
-        self.CapsuleList = []
-#        self.VtfList = []
-#        self.RuleDict = {}
-
-## The syntax parser for FDF
-#
-# PreprocessFile method should be called prior to ParseFile
-# CycleReferenceCheck method can detect cycles in FDF contents
-#
-# GetNext*** procedures mean these procedures will get next token first, then make judgement.
-# Get*** procedures mean these procedures will make judgement on current token only.
-#        
-class FdfParser(object):
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName):
-        self.Profile = FileProfile(FileName)
-        self.FileName = FileName
-        self.CurrentLineNumber = 1
-        self.CurrentOffsetWithinLine = 0
-        self.CurrentFdName = None
-        self.CurrentFvName = None
-        self.__Token = ""
-        self.__SkippedChars = ""
-        
-        self.__WipeOffArea = []
-
-    ## __SkipWhiteSpace() method
-    #
-    #   Skip white spaces from current char, return number of chars skipped
-    #
-    #   @param  self        The object pointer
-    #   @retval Count       The number of chars skipped
-    #
-    def __SkipWhiteSpace(self):
-        Count = 0
-        while not self.__EndOfFile():
-            Count += 1
-            if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):
-                self.__SkippedChars += str(self.__CurrentChar())
-                self.__GetOneChar()
-
-            else:
-                Count = Count - 1
-                return Count
-
-    ## __EndOfFile() method
-    #
-    #   Judge current buffer pos is at file end
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Current File buffer position is at file end
-    #   @retval False       Current File buffer position is NOT at file end
-    #
-    def __EndOfFile(self):
-        NumberOfLines = len(self.Profile.FileLinesList)
-        SizeOfLastLine = len(self.Profile.FileLinesList[-1])
-        if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:
-            return True
-        elif self.CurrentLineNumber > NumberOfLines:
-            return True
-        else:
-            return False
-
-    ## __EndOfLine() method
-    #
-    #   Judge current buffer pos is at line end
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Current File buffer position is at line end
-    #   @retval False       Current File buffer position is NOT at line end
-    #
-    def __EndOfLine(self):
-        if self.CurrentLineNumber > len(self.Profile.FileLinesList):
-            return True
-        SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])
-        if self.CurrentOffsetWithinLine >= SizeOfCurrentLine:
-            return True
-        else:
-            return False
-    
-    ## Rewind() method
-    #
-    #   Reset file data buffer to the initial state
-    #
-    #   @param  self        The object pointer
-    #
-    def Rewind(self):
-        self.CurrentLineNumber = 1
-        self.CurrentOffsetWithinLine = 0
-    
-    ## __UndoOneChar() method
-    #
-    #   Go back one char in the file buffer
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully go back one char
-    #   @retval False       Not able to go back one char as file beginning reached
-    #    
-    def __UndoOneChar(self):
-        
-        if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:
-            return False
-        elif self.CurrentOffsetWithinLine == 0:
-            self.CurrentLineNumber -= 1
-            self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1
-        else:
-            self.CurrentOffsetWithinLine -= 1
-        return True
-        
-    ## __GetOneChar() method
-    #
-    #   Move forward one char in the file buffer
-    #
-    #   @param  self        The object pointer
-    #  
-    def __GetOneChar(self):
-        if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:
-            self.CurrentLineNumber += 1
-            self.CurrentOffsetWithinLine = 0
-        else:
-            self.CurrentOffsetWithinLine += 1
-
-    ## __CurrentChar() method
-    #
-    #   Get the char pointed to by the file buffer pointer
-    #
-    #   @param  self        The object pointer
-    #   @retval Char        Current char
-    #  
-    def __CurrentChar(self):
-        return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]
-    
-    ## __NextChar() method
-    #
-    #   Get the one char pass the char pointed to by the file buffer pointer
-    #
-    #   @param  self        The object pointer
-    #   @retval Char        Next char
-    #
-    def __NextChar(self):
-        if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:
-            return self.Profile.FileLinesList[self.CurrentLineNumber][0]
-        else:
-            return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]
-        
-    ## __SetCurrentCharValue() method
-    #
-    #   Modify the value of current char
-    #
-    #   @param  self        The object pointer
-    #   @param  Value       The new value of current char
-    #
-    def __SetCurrentCharValue(self, Value):
-        self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value
-        
-    ## __CurrentLine() method
-    #
-    #   Get the list that contains current line contents
-    #
-    #   @param  self        The object pointer
-    #   @retval List        current line contents
-    #
-    def __CurrentLine(self):
-        return self.Profile.FileLinesList[self.CurrentLineNumber - 1]
-        
-    def __StringToList(self):
-        self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList]
-        self.Profile.FileLinesList[-1].append(' ')
-
-    def __ReplaceMacros(self, Str, File, Line):
-        MacroEnd = 0
-        while Str.find('$(', MacroEnd) >= 0:
-            MacroStart = Str.find('$(', MacroEnd)
-            if Str.find(')', MacroStart) > 0:
-                MacroEnd = Str.find(')', MacroStart)
-                Name = Str[MacroStart + 2 : MacroEnd]
-                Value = None
-                if Name in InputMacroDict:
-                    Value = InputMacroDict[Name]
-                   
-                else:
-                    for Profile in AllMacroList:
-                        if Profile.FileName == File and Profile.MacroName == Name and Profile.DefinedAtLine <= Line:
-                            Value = Profile.MacroValue
-                            
-                if Value is not None:
-                    Str = Str.replace('$(' + Name + ')', Value)
-                    MacroEnd = MacroStart + len(Value) 
-                
-            else:
-                raise Warning("Macro not complete At Line ", self.FileName, self.CurrentLineNumber)
-        return Str
-
-    def __ReplaceFragment(self, StartPos, EndPos, Value=' '):
-        if StartPos[0] == EndPos[0]:
-            Offset = StartPos[1]
-            while Offset <= EndPos[1]:
-                self.Profile.FileLinesList[StartPos[0]][Offset] = Value
-                Offset += 1
-            return
-        
-        Offset = StartPos[1]
-        while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'):
-            self.Profile.FileLinesList[StartPos[0]][Offset] = Value
-            Offset += 1
-        
-        Line = StartPos[0]
-        while Line < EndPos[0]:
-            Offset = 0
-            while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'):
-                self.Profile.FileLinesList[Line][Offset] = Value
-                Offset += 1
-            Line += 1
-            
-        Offset = 0
-        while Offset <= EndPos[1]:
-            self.Profile.FileLinesList[EndPos[0]][Offset] = Value
-            Offset += 1
-
-
-    def __GetMacroName(self):
-        if not self.__GetNextToken():
-            raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)
-        MacroName = self.__Token
-        NotFlag = False
-        if MacroName.startswith('!'):
-            NotFlag = True
-            MacroName = MacroName[1:].strip()
-         
-        if not MacroName.startswith('$(') or not MacroName.endswith(')'):
-            raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},
-                          self.FileName, self.CurrentLineNumber)
-        MacroName = MacroName[2:-1]
-        return MacroName, NotFlag
-    
-    ## PreprocessFile() method
-    #
-    #   Preprocess file contents, replace comments with spaces.
-    #   In the end, rewind the file buffer pointer to the beginning
-    #   BUGBUG: No !include statement processing contained in this procedure
-    #   !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
-    #
-    #   @param  self        The object pointer
-    #   
-    def PreprocessFile(self):
-        
-        self.Rewind()
-        InComment = False
-        DoubleSlashComment = False
-        HashComment = False
-        # HashComment in quoted string " " is ignored.
-        InString = False    
-        
-        while not self.__EndOfFile():
-            
-            if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment:
-                InString = not InString
-            # meet new line, then no longer in a comment for // and '#'
-            if self.__CurrentChar() == T_CHAR_LF:
-                self.CurrentLineNumber += 1
-                self.CurrentOffsetWithinLine = 0
-                if InComment and DoubleSlashComment:
-                    InComment = False
-                    DoubleSlashComment = False
-                if InComment and HashComment:
-                    InComment = False
-                    HashComment = False
-            # check for */ comment end
-            elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:
-                self.__SetCurrentCharValue(T_CHAR_SPACE)
-                self.__GetOneChar()
-                self.__SetCurrentCharValue(T_CHAR_SPACE)
-                self.__GetOneChar()
-                InComment = False
-            # set comments to spaces
-            elif InComment:
-                self.__SetCurrentCharValue(T_CHAR_SPACE)
-                self.__GetOneChar()
-            # check for // comment
-            elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine():
-                InComment = True
-                DoubleSlashComment = True
-            # check for '#' comment
-            elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString:
-                InComment = True
-                HashComment = True
-            # check for /* comment start
-            elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:
-                self.__SetCurrentCharValue( T_CHAR_SPACE)
-                self.__GetOneChar()
-                self.__SetCurrentCharValue( T_CHAR_SPACE)
-                self.__GetOneChar()
-                InComment = True
-            else:
-                self.__GetOneChar()
-        
-        # restore from ListOfList to ListOfString
-        self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]
-        self.Rewind()
-
-    ## PreprocessIncludeFile() method
-    #
-    #   Preprocess file contents, replace !include statements with file contents.
-    #   In the end, rewind the file buffer pointer to the beginning
-    #
-    #   @param  self        The object pointer
-    #   
-    def PreprocessIncludeFile(self):
-        
-        while self.__GetNextToken():
-            
-            if self.__Token == '!include':
-                IncludeLine = self.CurrentLineNumber
-                IncludeOffset = self.CurrentOffsetWithinLine - len('!include')
-                if not self.__GetNextToken():
-                    raise Warning("expected include file name At Line ", self.FileName, self.CurrentLineNumber)
-                IncFileName = self.__Token
-                if not os.path.isabs(IncFileName):
-                    if IncFileName.startswith('$(WORKSPACE)'):
-                        Str = mws.handleWsMacro(IncFileName)
-                        Str = Str.replace('$(WORKSPACE)', os.environ.get('WORKSPACE'))
-                        if os.path.exists(Str):
-                            if not os.path.isabs(Str):
-                                Str = os.path.abspath(Str)
-                        IncFileName = Str
-                    else:
-                        # file is in the same dir with FDF file
-                        FullFdf = self.FileName
-                        if not os.path.isabs(self.FileName):
-                            FullFdf = mws.join(os.environ.get('WORKSPACE'), self.FileName)
-                
-                        IncFileName = os.path.join(os.path.dirname(FullFdf), IncFileName)
-                    
-                if not os.path.exists(os.path.normpath(IncFileName)):
-                    raise Warning("Include file not exists At Line ", self.FileName, self.CurrentLineNumber)
-                
-                IncFileProfile = IncludeFileProfile(os.path.normpath(IncFileName))
-                
-                CurrentLine = self.CurrentLineNumber
-                CurrentOffset = self.CurrentOffsetWithinLine
-                # list index of the insertion, note that line number is 'CurrentLine + 1'
-                InsertAtLine = CurrentLine
-                IncFileProfile.InsertStartLineNumber = InsertAtLine + 1
-                # deal with remaining portions after "!include filename", if exists.
-                if self.__GetNextToken():
-                    if self.CurrentLineNumber == CurrentLine:
-                        RemainingLine = self.__CurrentLine()[CurrentOffset:]
-                        self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine)
-                        IncFileProfile.InsertAdjust += 1
-                        self.CurrentLineNumber += 1
-                        self.CurrentOffsetWithinLine = 0
-                
-                for Line in IncFileProfile.FileLinesList:
-                    self.Profile.FileLinesList.insert(InsertAtLine, Line)
-                    self.CurrentLineNumber += 1
-                    InsertAtLine += 1    
-                
-                IncludeFileList.append(IncFileProfile)
-                
-                # comment out the processed include file statement
-                TempList = list(self.Profile.FileLinesList[IncludeLine - 1])
-                TempList.insert(IncludeOffset, '#')
-                self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)
-                
-        self.Rewind()
-
-    ## PreprocessIncludeFile() method
-    #
-    #   Preprocess file contents, replace !include statements with file contents.
-    #   In the end, rewind the file buffer pointer to the beginning
-    #
-    #   @param  self        The object pointer
-    #   
-    def PreprocessConditionalStatement(self):
-        # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
-        IfList = []
-        while self.__GetNextToken():
-            if self.__Token == 'DEFINE':
-                DefineLine = self.CurrentLineNumber - 1
-                DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')
-                if not self.__GetNextToken():
-                    raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)
-                Macro = self.__Token
-                if not self.__IsToken( "="):
-                    raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-                if not self.__GetNextToken():
-                    raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                
-                if self.__GetStringData():
-                    pass
-                Value = self.__Token
-                if not Macro in InputMacroDict:
-                    FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)
-                    MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])
-                    MacProfile.MacroName = Macro
-                    MacProfile.MacroValue = Value
-                    AllMacroList.append(MacProfile)
-                self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-            
-            elif self.__Token in ('!ifdef', '!ifndef', '!if'):
-                IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))
-                IfList.append([IfStartPos, None, None])
-                CondLabel = self.__Token
-                
-                MacroName, NotFlag = self.__GetMacroName() 
-                NotDefineFlag = False
-                if CondLabel == '!ifndef':
-                    NotDefineFlag = True
-                if CondLabel == '!ifdef' or CondLabel == '!ifndef':
-                    if NotFlag:
-                        raise Warning("'NOT' operation not allowed for Macro name At Line ", self.FileName, self.CurrentLineNumber)
-                    
-                if CondLabel == '!if':
-                        
-                    if not self.__GetNextOp():
-                        raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)
-                    
-                    if self.__Token in ('!=', '==', '>', '<', '>=', '<='):
-                        Op = self.__Token
-                        if not self.__GetNextToken():
-                            raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                        if self.__GetStringData():
-                            pass
-                        MacroValue = self.__Token
-                        ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)
-                        if NotFlag:
-                            ConditionSatisfied = not ConditionSatisfied
-                        BranchDetermined = ConditionSatisfied
-                    else:
-                        self.CurrentOffsetWithinLine -= len(self.__Token)                        
-                        ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')
-                        if NotFlag:
-                            ConditionSatisfied = not ConditionSatisfied
-                        BranchDetermined = ConditionSatisfied
-                    IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]
-                    if ConditionSatisfied:
-                        self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                        
-                else:
-                    ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1)
-                    if NotDefineFlag:
-                        ConditionSatisfied = not ConditionSatisfied
-                    BranchDetermined = ConditionSatisfied
-                    IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]
-                    if ConditionSatisfied:
-                        self.__WipeOffArea.append((IfStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                    
-            elif self.__Token in ('!elseif', '!else'):
-                ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))
-                if len(IfList) <= 0:
-                    raise Warning("Missing !if statement At Line ", self.FileName, self.CurrentLineNumber)
-                if IfList[-1][1]:
-                    IfList[-1] = [ElseStartPos, False, True]
-                    self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                else:
-                    self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))
-                    IfList[-1] = [ElseStartPos, True, IfList[-1][2]]
-                    if self.__Token == '!elseif':
-                        MacroName, NotFlag = self.__GetMacroName() 
-                        if not self.__GetNextOp():
-                            raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)
-                    
-                        if self.__Token in ('!=', '==', '>', '<', '>=', '<='):
-                            Op = self.__Token
-                            if not self.__GetNextToken():
-                                raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                            if self.__GetStringData():
-                                pass
-                            MacroValue = self.__Token
-                            ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)
-                            if NotFlag:
-                                ConditionSatisfied = not ConditionSatisfied
-
-                        else:
-                            self.CurrentOffsetWithinLine -= len(self.__Token)                        
-                            ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')
-                            if NotFlag:
-                                ConditionSatisfied = not ConditionSatisfied
-
-                        IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]]
-                    
-                    if IfList[-1][1]:
-                        if IfList[-1][2]:
-                            IfList[-1][1] = False
-                        else:
-                            IfList[-1][2] = True
-                            self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-
-                
-            elif self.__Token == '!endif':
-                if IfList[-1][1]:
-                    self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                else:
-                    self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                
-                IfList.pop()
-                
-                    
-        if len(IfList) > 0:
-            raise Warning("Missing !endif At Line ", self.FileName, self.CurrentLineNumber)
-        self.Rewind()
-
-    def __EvaluateConditional(self, Name, Line, Op = None, Value = None):
-        
-        FileLineTuple = GetRealFileLine(self.FileName, Line)
-        if Name in InputMacroDict:
-            MacroValue = InputMacroDict[Name]
-            if Op is None:
-                if Value == 'Bool' and MacroValue is None or MacroValue.upper() == 'FALSE':
-                    return False
-                return True
-            elif Op == '!=':
-                if Value != MacroValue:
-                    return True
-                else:
-                    return False
-            elif Op == '==':
-                if Value == MacroValue:
-                    return True
-                else:
-                    return False
-            else:
-                if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(MacroValue) or (MacroValue is not None and MacroValue.isdigit())):
-                    InputVal = long(Value, 0)
-                    MacroVal = long(MacroValue, 0)
-                    if Op == '>':
-                        if MacroVal > InputVal:
-                            return True
-                        else:
-                            return False
-                    elif Op == '>=':
-                        if MacroVal >= InputVal:
-                            return True
-                        else:
-                            return False
-                    elif Op == '<':
-                        if MacroVal < InputVal:
-                            return True
-                        else:
-                            return False
-                    elif Op == '<=':
-                        if MacroVal <= InputVal:
-                            return True
-                        else:
-                            return False
-                    else:
-                        return False
-                else:
-                    raise Warning("Value %s is not a number At Line ", self.FileName, Line)
-                
-        for Profile in AllMacroList:
-            if Profile.FileName == FileLineTuple[0] and Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]:
-                if Op is None:
-                    if Value == 'Bool' and Profile.MacroValue is None or Profile.MacroValue.upper() == 'FALSE':
-                        return False
-                    return True
-                elif Op == '!=':
-                    if Value != Profile.MacroValue:
-                        return True
-                    else:
-                        return False
-                elif Op == '==':
-                    if Value == Profile.MacroValue:
-                        return True
-                    else:
-                        return False
-                else:
-                    if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(Profile.MacroValue) or (Profile.MacroValue is not None and Profile.MacroValue.isdigit())):
-                        InputVal = long(Value, 0)
-                        MacroVal = long(Profile.MacroValue, 0)
-                        if Op == '>':
-                            if MacroVal > InputVal:
-                                return True
-                            else:
-                                return False
-                        elif Op == '>=':
-                            if MacroVal >= InputVal:
-                                return True
-                            else:
-                                return False
-                        elif Op == '<':
-                            if MacroVal < InputVal:
-                                return True
-                            else:
-                                return False
-                        elif Op == '<=':
-                            if MacroVal <= InputVal:
-                                return True
-                            else:
-                                return False
-                        else:
-                            return False
-                    else:
-                        raise Warning("Value %s is not a number At Line ", self.FileName, Line)
-        
-        return False
-
-    ## __IsToken() method
-    #
-    #   Check whether input string is found from current char position along
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @param  String      The string to search
-    #   @param  IgnoreCase  Indicate case sensitive/non-sensitive search, default is case sensitive
-    #   @retval True        Successfully find string, file buffer pointer moved forward
-    #   @retval False       Not able to find string, file buffer pointer not changed
-    #
-    def __IsToken(self, String, IgnoreCase = False):
-        self.__SkipWhiteSpace()
-
-        # Only consider the same line, no multi-line token allowed
-        StartPos = self.CurrentOffsetWithinLine
-        index = -1
-        if IgnoreCase:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) 
-        else:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)
-        if index == 0:
-            self.CurrentOffsetWithinLine += len(String)
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-        return False
-
-    ## __IsKeyword() method
-    #
-    #   Check whether input keyword is found from current char position along, whole word only!
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @param  Keyword     The string to search
-    #   @param  IgnoreCase  Indicate case sensitive/non-sensitive search, default is case sensitive
-    #   @retval True        Successfully find string, file buffer pointer moved forward
-    #   @retval False       Not able to find string, file buffer pointer not changed
-    #
-    def __IsKeyword(self, KeyWord, IgnoreCase = False):
-        self.__SkipWhiteSpace()
-
-        # Only consider the same line, no multi-line token allowed
-        StartPos = self.CurrentOffsetWithinLine
-        index = -1
-        if IgnoreCase:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper()) 
-        else:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord)
-        if index == 0:
-            followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)]
-            if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE:
-                return False
-            self.CurrentOffsetWithinLine += len(KeyWord)
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-        return False
-
-    ## __GetNextWord() method
-    #
-    #   Get next C name from file lines
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a C name string, file buffer pointer moved forward
-    #   @retval False       Not able to find a C name string, file buffer pointer not changed
-    #
-    def __GetNextWord(self):
-        self.__SkipWhiteSpace()
-        if self.__EndOfFile():
-            return False
-        
-        TempChar = self.__CurrentChar()
-        StartPos = self.CurrentOffsetWithinLine
-        if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_':
-            self.__GetOneChar()
-            while not self.__EndOfLine():
-                TempChar = self.__CurrentChar()
-                if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \
-                or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-':
-                    self.__GetOneChar()
-                    
-                else:
-                    break
-
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-            
-        return False
-    
-    ## __GetNextToken() method
-    #
-    #   Get next token unit before a seperator
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a token unit, file buffer pointer moved forward
-    #   @retval False       Not able to find a token unit, file buffer pointer not changed
-    #
-    def __GetNextToken(self):
-        # Skip leading spaces, if exist.
-        self.__SkipWhiteSpace()
-        if self.__EndOfFile():
-            return False
-        # Record the token start position, the position of the first non-space char.
-        StartPos = self.CurrentOffsetWithinLine
-        StartLine = self.CurrentLineNumber
-        while not self.__EndOfLine():
-            TempChar = self.__CurrentChar()
-            # Try to find the end char that is not a space and not in seperator tuple.
-            # That is, when we got a space or any char in the tuple, we got the end of token.
-            if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE:
-                self.__GetOneChar()
-            # if we happen to meet a seperator as the first char, we must proceed to get it.
-            # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
-            elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:
-                self.__GetOneChar()
-                break
-            else:
-                break
-#        else:
-#            return False
-
-        EndPos = self.CurrentOffsetWithinLine
-        if self.CurrentLineNumber != StartLine:
-            EndPos = len(self.Profile.FileLinesList[StartLine-1])
-        self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos]
-        if StartPos != self.CurrentOffsetWithinLine:
-            return True
-        else:
-            return False
-    
-    def __GetNextOp(self):
-        # Skip leading spaces, if exist.
-        self.__SkipWhiteSpace()
-        if self.__EndOfFile():
-            return False
-        # Record the token start position, the position of the first non-space char.
-        StartPos = self.CurrentOffsetWithinLine
-        while not self.__EndOfLine():
-            TempChar = self.__CurrentChar()
-            # Try to find the end char that is not a space
-            if not str(TempChar).isspace():
-                self.__GetOneChar()
-            else:
-                break
-        else:
-            return False
-        
-        if StartPos != self.CurrentOffsetWithinLine:
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-        else:
-            return False
-    ## __GetNextGuid() method
-    #
-    #   Get next token unit before a seperator
-    #   If found, the GUID string is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a registry format GUID, file buffer pointer moved forward
-    #   @retval False       Not able to find a registry format GUID, file buffer pointer not changed
-    #
-    def __GetNextGuid(self):
-        
-        if not self.__GetNextToken():
-            return False
-        if gGuidPattern.match(self.__Token) is not None:
-            return True
-        else:
-            self.__UndoToken()
-            return False
-
-    ## __UndoToken() method
-    #
-    #   Go back one token unit in file buffer
-    #
-    #   @param  self        The object pointer
-    #
-    def __UndoToken(self):
-        self.__UndoOneChar()
-        while self.__CurrentChar().isspace():
-            if not self.__UndoOneChar():
-                self.__GetOneChar()
-                return
-        
-        
-        StartPos = self.CurrentOffsetWithinLine
-        CurrentLine = self.CurrentLineNumber
-        while CurrentLine == self.CurrentLineNumber:
-            
-            TempChar = self.__CurrentChar()
-            # Try to find the end char that is not a space and not in seperator tuple.
-            # That is, when we got a space or any char in the tuple, we got the end of token.
-            if not str(TempChar).isspace() and not TempChar in SEPERATOR_TUPLE:
-                if not self.__UndoOneChar():
-                    break
-            # if we happen to meet a seperator as the first char, we must proceed to get it.
-            # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
-            elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:
-                return
-            else:
-                break
-            
-        self.__GetOneChar()
-    
-    def __IsHex(self, HexStr):
-        if not HexStr.upper().startswith("0X"):
-            return False
-        if len(self.__Token) <= 2:
-            return False
-        return True if all(x in string.hexdigits for x in HexStr[2:]) else False
-
-    ## __GetNextHexNumber() method
-    #
-    #   Get next HEX data before a seperator
-    #   If found, the HEX data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a HEX data, file buffer pointer moved forward
-    #   @retval False       Not able to find a HEX data, file buffer pointer not changed
-    #
-    def __GetNextHexNumber(self):
-        if not self.__GetNextToken():
-            return False
-        if self.__IsHex(self.__Token):
-            return True
-        else:
-            self.__UndoToken()
-            return False
-        
-    ## __GetNextDecimalNumber() method
-    #
-    #   Get next decimal data before a seperator
-    #   If found, the decimal data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a decimal data, file buffer pointer moved forward
-    #   @retval False       Not able to find a decimal data, file buffer pointer not changed
-    #
-    def __GetNextDecimalNumber(self):
-        if not self.__GetNextToken():
-            return False
-        if self.__Token.isdigit():
-            return True
-        else:
-            self.__UndoToken()
-            return False
-    
-    ## __GetNextPcdName() method
-    #
-    #   Get next PCD token space C name and PCD C name pair before a seperator
-    #   If found, the decimal data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval Tuple       PCD C name and PCD token space C name pair 
-    #
-    def __GetNextPcdName(self):
-        if not self.__GetNextWord():
-            raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)
-        pcdTokenSpaceCName = self.__Token
-        
-        if not self.__IsToken( "."):
-            raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextWord():
-            raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)
-        pcdCName = self.__Token
-        
-        return (pcdCName, pcdTokenSpaceCName) 
-            
-    ## __GetStringData() method
-    #
-    #   Get string contents quoted in ""
-    #   If found, the decimal data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a string data, file buffer pointer moved forward
-    #   @retval False       Not able to find a string data, file buffer pointer not changed
-    #    
-    def __GetStringData(self):
-        if self.__Token.startswith("\"") or self.__Token.startswith("L\""):
-            self.__UndoToken()
-            self.__SkipToToken("\"")
-            currentLineNumber = self.CurrentLineNumber
-            
-            if not self.__SkipToToken("\""):
-                raise Warning("Missing Quote \" for String At Line ", self.FileName, self.CurrentLineNumber)
-            if currentLineNumber != self.CurrentLineNumber:
-                raise Warning("Missing Quote \" for String At Line ", self.FileName, self.CurrentLineNumber)
-            self.__Token = self.__SkippedChars.rstrip('\"')
-            return True
-        
-        elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"):
-            self.__UndoToken()
-            self.__SkipToToken("\'")
-            currentLineNumber = self.CurrentLineNumber
-            
-            if not self.__SkipToToken("\'"):
-                raise Warning("Missing Quote \' for String At Line ", self.FileName, self.CurrentLineNumber)
-            if currentLineNumber != self.CurrentLineNumber:
-                raise Warning("Missing Quote \' for String At Line ", self.FileName, self.CurrentLineNumber)
-            self.__Token = self.__SkippedChars.rstrip('\'')
-            return True
-        
-        else:
-            return False
-            
-    ## __SkipToToken() method
-    #
-    #   Search forward in file buffer for the string
-    #   The skipped chars are put into self.__SkippedChars
-    #
-    #   @param  self        The object pointer
-    #   @param  String      The string to search
-    #   @param  IgnoreCase  Indicate case sensitive/non-sensitive search, default is case sensitive
-    #   @retval True        Successfully find the string, file buffer pointer moved forward
-    #   @retval False       Not able to find the string, file buffer pointer not changed
-    #
-    def __SkipToToken(self, String, IgnoreCase = False):
-        StartPos = self.GetFileBufferPos()
-        
-        self.__SkippedChars = ""
-        while not self.__EndOfFile():
-            index = -1
-            if IgnoreCase:
-                index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) 
-            else:
-                index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)
-            if index == 0:
-                self.CurrentOffsetWithinLine += len(String)
-                self.__SkippedChars += String
-                return True
-            self.__SkippedChars += str(self.__CurrentChar())
-            self.__GetOneChar()
-            
-        self.SetFileBufferPos( StartPos)
-        self.__SkippedChars = ""
-        return False
-
-    ## GetFileBufferPos() method
-    #
-    #   Return the tuple of current line and offset within the line
-    #
-    #   @param  self        The object pointer
-    #   @retval Tuple       Line number and offset pair 
-    #
-    def GetFileBufferPos(self):
-        return (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
-    
-    ## SetFileBufferPos() method
-    #
-    #   Restore the file buffer position
-    #
-    #   @param  self        The object pointer
-    #   @param  Pos         The new file buffer position
-    #
-    def SetFileBufferPos(self, Pos):
-        (self.CurrentLineNumber, self.CurrentOffsetWithinLine) = Pos
-            
-    ## ParseFile() method
-    #
-    #   Parse the file profile buffer to extract fd, fv ... information
-    #   Exception will be raised if syntax error found
-    #
-    #   @param  self        The object pointer
-    #
-    def ParseFile(self):
-
-        try:
-            self.__StringToList()
-            self.PreprocessFile()
-            self.PreprocessIncludeFile()
-            self.__StringToList()
-            self.PreprocessFile()
-            self.PreprocessConditionalStatement()
-            self.__StringToList()
-            for Pos in self.__WipeOffArea:
-                self.__ReplaceFragment(Pos[0], Pos[1])
-            self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]
-            
-            while self.__GetDefines():
-                pass
-            
-            Index = 0
-            while Index < len(self.Profile.FileLinesList):
-                FileLineTuple = GetRealFileLine(self.FileName, Index + 1)
-                self.Profile.FileLinesList[Index] = self.__ReplaceMacros(self.Profile.FileLinesList[Index], FileLineTuple[0], FileLineTuple[1])
-                Index += 1
-                
-            while self.__GetFd():
-                pass
-
-            while self.__GetFv():
-                pass
-
-            while self.__GetCapsule():
-                pass
-
-#            while self.__GetVtf():
-#                pass
-#
-#            while self.__GetRule():
-#                pass
-            
-
-        except Warning, X:
-            self.__UndoToken()
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            X.message += '\nGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
-                'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'), FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise
-
-    ## __GetDefines() method
-    #
-    #   Get Defines section contents and store its data into AllMacrosList
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a Defines
-    #   @retval False       Not able to find a Defines
-    #
-    def __GetDefines(self):
-
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[DEFINES"):
-            if not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \
-                and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[DEFINES", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-            #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)
-
-        while self.__GetNextWord():
-            Macro = self.__Token
-            
-            if not self.__IsToken("="):
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken() or self.__Token.startswith('['):
-                raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)
-            Value = self.__Token
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])
-            MacProfile.MacroName = Macro
-            MacProfile.MacroValue = Value
-            AllMacroList.append(MacProfile)
-
-        return False
-
-    ## __GetFd() method
-    #
-    #   Get FD section contents and store its data into FD dictionary of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a FD
-    #   @retval False       Not able to find a FD
-    #
-    def __GetFd(self):
-
-        if not self.__GetNextToken():
-            return False
-        
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[FD."):
-            if not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \
-                and not S.startswith("[VTF.") and not S.startswith("[RULE."):
-                raise Warning("Unknown section At Line ", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-        
-        self.__UndoToken()
-        if not self.__IsToken("[FD.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [FD.] At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FdName = self.__GetUiName()
-        self.CurrentFdName = FdName.upper()
-        
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FdObj = CommonDataClass.FdfClass.FDClassObject()
-        FdObj.FdUiName = self.CurrentFdName
-        self.Profile.FdDict[self.CurrentFdName] = FdObj
-        Status = self.__GetCreateFile(FdObj)
-        if not Status:
-            raise Warning("FD name error At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetTokenStatements(FdObj):
-            return False
-        
-        self.__GetDefineStatements(FdObj)
-
-        self.__GetSetStatements(FdObj)
-
-        if not self.__GetRegionLayout(FdObj):
-            raise Warning("expected region layout At Line ", self.FileName, self.CurrentLineNumber)
-            
-        while self.__GetRegionLayout(FdObj):
-            pass
-        return True
-    
-    ## __GetUiName() method
-    #
-    #   Return the UI name of a section
-    #
-    #   @param  self        The object pointer
-    #   @retval FdName      UI name
-    #
-    def __GetUiName(self):
-        FdName = ""
-        if self.__GetNextWord():
-            FdName = self.__Token
-            
-        return FdName
-
-    ## __GetCreateFile() method
-    #
-    #   Return the output file name of object
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         object whose data will be stored in file
-    #   @retval FdName      UI name
-    #
-    def __GetCreateFile(self, Obj):
-
-        if self.__IsKeyword( "CREATE_FILE"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextToken():
-                raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)
-                
-            FileName = self.__Token
-            Obj.CreateFileName = FileName
-
-        return True
-
-    ## __GetTokenStatements() method
-    #
-    #   Get token statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom token statement is got
-    #   @retval True        Successfully find a token statement
-    #   @retval False       Not able to find a token statement
-    #
-    def __GetTokenStatements(self, Obj):
-        if not self.__IsKeyword( "BaseAddress"):
-            raise Warning("BaseAddress missing At Line ", self.FileName, self.CurrentLineNumber)
-           
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Hex base address At Line ", self.FileName, self.CurrentLineNumber)
-            
-        Obj.BaseAddress = self.__Token
-        
-        if self.__IsToken( "|"):
-            pcdPair = self.__GetNextPcdName()
-            Obj.BaseAddressPcd = pcdPair
-            self.Profile.PcdDict[pcdPair] = long(Obj.BaseAddress, 0)
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple
-            
-        if not self.__IsKeyword( "Size"):
-            raise Warning("Size missing At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Hex size At Line ", self.FileName, self.CurrentLineNumber)
-            
-      
-        Obj.Size = long(self.__Token, 0)
-
-        if self.__IsToken( "|"):
-            pcdPair = self.__GetNextPcdName()
-            Obj.SizePcd = pcdPair
-            self.Profile.PcdDict[pcdPair] = Obj.Size
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple
-                    
-        if not self.__IsKeyword( "ErasePolarity"):
-            raise Warning("ErasePolarity missing At Line ", self.FileName, self.CurrentLineNumber)
-           
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextToken():
-            raise Warning("expected Erase Polarity At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if self.__Token != "1" and self.__Token != "0":
-            raise Warning("expected 1 or 0 Erase Polarity At Line ", self.FileName, self.CurrentLineNumber)
-            
-        Obj.ErasePolarity = self.__Token
-
-        Status = self.__GetBlockStatements(Obj)
-        return Status
-    
-    ## __GetAddressStatements() method
-    #
-    #   Get address statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom address statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetAddressStatements(self, Obj):
-        
-        if self.__IsKeyword("BsBaseAddress"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():
-                raise Warning("expected address At Line ", self.FileName, self.CurrentLineNumber)
-                
-            BsAddress = long(self.__Token, 0)
-            Obj.BsBaseAddress = BsAddress
-            
-        if self.__IsKeyword("RtBaseAddress"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():
-                raise Warning("expected address At Line ", self.FileName, self.CurrentLineNumber)
-                
-            RtAddress = long(self.__Token, 0)
-            Obj.RtBaseAddress = RtAddress
-    
-    ## __GetBlockStatements() method
-    #
-    #   Get block statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom block statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetBlockStatements(self, Obj):
-        
-        if not self.__GetBlockStatement(Obj):
-            #set default block size is 1
-            Obj.BlockSizeList.append((1, Obj.Size, None))
-            return True
-
-        while self.__GetBlockStatement(Obj):
-            pass
-        
-        for Item in Obj.BlockSizeList:
-            if Item[0] is None or Item[1] is None:
-                raise Warning("expected block statement for Fd Section", self.FileName, self.CurrentLineNumber)
-
-        return True
-    
-    ## __GetBlockStatement() method
-    #
-    #   Get block statement
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom block statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetBlockStatement(self, Obj):
-        if not self.__IsKeyword( "BlockSize"):
-            return False
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():
-            raise Warning("expected Hex block size At Line ", self.FileName, self.CurrentLineNumber)
-
-        BlockSize = long(self.__Token, 0)
-        BlockSizePcd = None
-        if self.__IsToken( "|"):
-            PcdPair = self.__GetNextPcdName()
-            BlockSizePcd = PcdPair
-            self.Profile.PcdDict[PcdPair] = BlockSize
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple
-            
-        BlockNumber = None
-        if self.__IsKeyword( "NumBlocks"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():
-                raise Warning("expected block numbers At Line ", self.FileName, self.CurrentLineNumber)
-                
-            BlockNumber = long(self.__Token, 0)
-        
-        Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))
-        return True
-
-    ## __GetDefineStatements() method
-    #
-    #   Get define statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom define statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetDefineStatements(self, Obj):
-        while self.__GetDefineStatement( Obj):
-            pass
-    
-    ## __GetDefineStatement() method
-    #
-    #   Get define statement
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom define statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetDefineStatement(self, Obj):
-        if self.__IsKeyword("DEFINE"):
-            self.__GetNextToken()
-            Macro = self.__Token
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextToken():
-                raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-
-            Value = self.__Token
-            Macro = '$(' + Macro + ')'
-            Obj.DefineVarDict[Macro] = Value
-            return True
-        
-        return False
-    
-    ## __GetSetStatements() method
-    #
-    #   Get set statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom set statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetSetStatements(self, Obj):
-        while self.__GetSetStatement(Obj):
-            pass
-
-    ## __GetSetStatement() method
-    #
-    #   Get set statement
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom set statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetSetStatement(self, Obj):
-        if self.__IsKeyword("SET"):
-            PcdPair = self.__GetNextPcdName()
-            
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextToken():
-                raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                
-            Value = self.__Token
-            if Value.startswith("{"):
-                # deal with value with {}
-                if not self.__SkipToToken( "}"):
-                    raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-                Value += self.__SkippedChars
-                
-            Obj.SetVarDict[PcdPair] = Value
-            self.Profile.PcdDict[PcdPair] = Value
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple
-            return True
-
-        return False
-
-    ## __GetRegionLayout() method
-    #
-    #   Get region layout for FD
-    #
-    #   @param  self        The object pointer
-    #   @param  Fd          for whom region is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetRegionLayout(self, Fd):
-        if not self.__GetNextHexNumber():
-            return False
-        
-        RegionObj = CommonDataClass.FdfClass.RegionClassObject()
-        RegionObj.Offset = long(self.__Token, 0)
-        Fd.RegionList.append(RegionObj)
-        
-        if not self.__IsToken( "|"):
-            raise Warning("expected '|' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Region Size At Line ", self.FileName, self.CurrentLineNumber)
-        RegionObj.Size = long(self.__Token, 0)
-        
-        if not self.__GetNextWord():
-            return True
-        
-        if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
-            self.__UndoToken()
-            RegionObj.PcdOffset = self.__GetNextPcdName()
-            self.Profile.PcdDict[RegionObj.PcdOffset] = RegionObj.Offset + long(Fd.BaseAddress, 0)
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple
-            if self.__IsToken( "|"):
-                RegionObj.PcdSize = self.__GetNextPcdName()
-                self.Profile.PcdDict[RegionObj.PcdSize] = RegionObj.Size
-                FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-                self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple
-            
-            if not self.__GetNextWord():
-                return True
-
-        if self.__Token == "SET":
-            self.__UndoToken()
-            self.__GetSetStatements( RegionObj)
-            if not self.__GetNextWord():
-                return True
-            
-        elif self.__Token == "FV":
-            self.__UndoToken()
-            self.__GetRegionFvType( RegionObj)
-
-        elif self.__Token == "CAPSULE":
-            self.__UndoToken()
-            self.__GetRegionCapType( RegionObj)
-
-        elif self.__Token == "FILE":
-            self.__UndoToken()
-            self.__GetRegionFileType( RegionObj)
-
-        else:
-            self.__UndoToken()
-            self.__GetRegionDataType( RegionObj)
-            
-        return True
-            
-    ## __GetRegionFvType() method
-    #
-    #   Get region fv data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionFvType(self, RegionObj):
-
-        if not self.__IsKeyword( "FV"):
-            raise Warning("expected Keyword 'FV' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-        
-        RegionObj.RegionType = "FV"
-        RegionObj.RegionDataList.append(self.__Token)
-        
-        while self.__IsKeyword( "FV"):
-        
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__GetNextToken():
-                raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-        
-            RegionObj.RegionDataList.append(self.__Token)
-
-    ## __GetRegionCapType() method
-    #
-    #   Get region capsule data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionCapType(self, RegionObj):
-
-        if not self.__IsKeyword("CAPSULE"):
-            raise Warning("expected Keyword 'CAPSULE' at line", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' at line", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected CAPSULE name at line", self.FileName, self.CurrentLineNumber)
-
-        RegionObj.RegionType = "CAPSULE"
-        RegionObj.RegionDataList.append(self.__Token)
-
-        while self.__IsKeyword("CAPSULE"):
-
-            if not self.__IsToken("="):
-                raise Warning("expected '=' at line", self.FileName, self.CurrentLineNumber)
-
-            if not self.__GetNextToken():
-                raise Warning("expected CAPSULE name at line", self.FileName, self.CurrentLineNumber)
-
-            RegionObj.RegionDataList.append(self.__Token)
-
-    ## __GetRegionFileType() method
-    #
-    #   Get region file data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionFileType(self, RegionObj):
-
-        if not self.__IsKeyword( "FILE"):
-            raise Warning("expected Keyword 'FILE' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)
-
-        RegionObj.RegionType = "FILE"
-        RegionObj.RegionDataList.append( self.__Token)
-        
-        while self.__IsKeyword( "FILE"):
-        
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__GetNextToken():
-                raise Warning("expected FILE name At Line ", self.FileName, self.CurrentLineNumber)
-        
-            RegionObj.RegionDataList.append(self.__Token)
-
-    ## __GetRegionDataType() method
-    #
-    #   Get region array data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionDataType(self, RegionObj):
-        
-        if not self.__IsKeyword( "DATA"):
-            raise Warning("expected Region Data type At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__IsToken( "{"):
-            raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if len(self.__Token) > 18:
-            raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
-        
-        DataString = self.__Token
-        DataString += ","
-        
-        while self.__IsToken(","):
-            if not self.__GetNextHexNumber():
-                raise Warning("Invalid Hex number At Line ", self.FileName, self.CurrentLineNumber)
-            if len(self.__Token) > 4:
-                raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
-            DataString += self.__Token
-            DataString += ","
-            
-        if not self.__IsToken( "}"):
-            raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        DataString = DataString.rstrip(",")
-        RegionObj.RegionType = "DATA"
-        RegionObj.RegionDataList.append( DataString)
-        
-        while self.__IsKeyword( "DATA"):
-
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__IsToken( "{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__GetNextHexNumber():
-                raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if len(self.__Token) > 18:
-                raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
-        
-            DataString = self.__Token
-            DataString += ","
-        
-            while self.__IsToken(","):
-                self.__GetNextHexNumber()
-                if len(self.__Token) > 4:
-                    raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
-                DataString += self.__Token
-                DataString += ","
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            DataString = DataString.rstrip(",")
-            RegionObj.RegionDataList.append( DataString)
-    
-    ## __GetFv() method
-    #
-    #   Get FV section contents and store its data into FV dictionary of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a FV
-    #   @retval False       Not able to find a FV
-    #    
-    def __GetFv(self):
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[FV."):
-            if not S.startswith("[CAPSULE.") \
-                and not S.startswith("[VTF.") and not S.startswith("[RULE."):
-                raise Warning("Unknown section or section appear sequence error \n(The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.]) At Line ", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[FV.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("Unknown Keyword At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FvName = self.__GetUiName()
-        self.CurrentFvName = FvName.upper()
-        
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FvObj = CommonDataClass.FdfClass.FvClassObject()
-        FvObj.UiFvName = self.CurrentFvName
-        self.Profile.FvDict[self.CurrentFvName] = FvObj
-        
-        Status = self.__GetCreateFile(FvObj)
-        if not Status:
-            raise Warning("FV name error At Line ", self.FileName, self.CurrentLineNumber)
-
-        self.__GetDefineStatements(FvObj)
-
-        self.__GetAddressStatements(FvObj)
-        
-        self.__GetBlockStatement(FvObj)
-
-        self.__GetSetStatements(FvObj)
-
-        self.__GetFvAlignment(FvObj)
-
-        self.__GetFvAttributes(FvObj)
-        
-        self.__GetFvNameGuid(FvObj)
-
-        self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())
-        self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())
-        
-        while True:
-            isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())
-            isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())
-            if not isInf and not isFile:
-                break
-        
-        return True
-
-    ## __GetFvAlignment() method
-    #
-    #   Get alignment for FV
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom alignment is got
-    #   @retval True        Successfully find a alignment statement
-    #   @retval False       Not able to find a alignment statement
-    #
-    def __GetFvAlignment(self, Obj):
-        
-        if not self.__IsKeyword( "FvAlignment"):
-            return False
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected alignment value At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
-                                        "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
-                                        "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
-                                        "1G", "2G"):
-            raise Warning("Unknown alignment value At Line ", self.FileName, self.CurrentLineNumber)
-        Obj.FvAlignment = self.__Token
-        return True
-    
-    ## __GetFvAttributes() method
-    #
-    #   Get attributes for FV
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom attribute is got
-    #   @retval None
-    #
-    def __GetFvAttributes(self, FvObj):
-        
-        while self.__GetNextWord():
-            name = self.__Token
-            if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
-                           "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
-                           "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
-                           "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
-                           "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
-                           "WRITE_POLICY_RELIABLE"):
-                self.__UndoToken()
-                return
-
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):
-                raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)
-            
-            FvObj.FvAttributeDict[name] = self.__Token
-
-        return
-    
-    ## __GetFvNameGuid() method
-    #
-    #   Get FV GUID for FV
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom GUID is got
-    #   @retval None
-    #
-    def __GetFvNameGuid(self, FvObj):
-
-        if not self.__IsKeyword( "FvNameGuid"):
-            return
-
-        if not self.__IsToken( "="):
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextGuid():
-            raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)
-
-        FvObj.FvNameGuid = self.__Token
-
-        return
-
-    ## __GetAprioriSection() method
-    #
-    #   Get token statements
-    #
-    #   @param  self        The object pointer
-    #   @param  FvObj       for whom apriori is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find apriori statement
-    #   @retval False       Not able to find apriori statement
-    #
-    def __GetAprioriSection(self, FvObj, MacroDict = {}):
-        
-        if not self.__IsKeyword( "APRIORI"):
-            return False
-        
-        if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):
-            raise Warning("expected Apriori file type At Line ", self.FileName, self.CurrentLineNumber)
-        AprType = self.__Token
-        
-        if not self.__IsToken( "{"):
-            raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        AprSectionObj = CommonDataClass.FdfClass.AprioriSectionClassObject()
-        AprSectionObj.AprioriType = AprType
-        
-        self.__GetDefineStatements(AprSectionObj)
-        MacroDict.update(AprSectionObj.DefineVarDict)
-        
-        while True:
-            IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)
-            IsFile = self.__GetFileStatement( AprSectionObj)
-            if not IsInf and not IsFile:
-                break
-        
-        if not self.__IsToken( "}"):
-            raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-
-        FvObj.AprioriSectionList.append(AprSectionObj)
-        return True
-
-    ## __GetInfStatement() method
-    #
-    #   Get INF statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom inf statement is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find inf statement
-    #   @retval False       Not able to find inf statement
-    #
-    def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):
-
-        if not self.__IsKeyword( "INF"):
-            return False
-        
-        ffsInf = CommonDataClass.FdfClass.FfsInfStatementClassObject()
-        self.__GetInfOptions( ffsInf)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected INF file path At Line ", self.FileName, self.CurrentLineNumber)
-        ffsInf.InfFileName = self.__Token
-        
-#        if ffsInf.InfFileName.find('$') >= 0:
-#            ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
-            
-        if not ffsInf.InfFileName in self.Profile.InfList:
-            self.Profile.InfList.append(ffsInf.InfFileName)
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.InfFileLineList.append(FileLineTuple)
-        
-        if self.__IsToken('|'):
-            if self.__IsKeyword('RELOCS_STRIPPED'):
-                ffsInf.KeepReloc = False
-            elif self.__IsKeyword('RELOCS_RETAINED'):
-                ffsInf.KeepReloc = True
-            else:
-                raise Warning("Unknown reloc strip flag At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if ForCapsule:
-            capsuleFfs = CapsuleData.CapsuleFfs()
-            capsuleFfs.Ffs = ffsInf
-            Obj.CapsuleDataList.append(capsuleFfs)
-        else:
-            Obj.FfsList.append(ffsInf)
-        return True
-    
-    ## __GetInfOptions() method
-    #
-    #   Get options for INF
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsInfObj   for whom option is got
-    #
-    def __GetInfOptions(self, FfsInfObj):
-        
-        if self.__IsKeyword( "RuleOverride"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected Rule name At Line ", self.FileName, self.CurrentLineNumber)
-            FfsInfObj.Rule = self.__Token
-            
-        if self.__IsKeyword( "VERSION"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected Version At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if self.__GetStringData():
-                FfsInfObj.Version = self.__Token
-        
-        if self.__IsKeyword( "UI"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected UI name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if self.__GetStringData():
-                FfsInfObj.Ui = self.__Token
-
-        if self.__IsKeyword( "USE"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)
-            FfsInfObj.UseArch = self.__Token
-
-                
-        if self.__GetNextToken():
-            if TokenFindPattern.match(self.__Token):
-                FfsInfObj.KeyStringList.append(self.__Token)
-                if not self.__IsToken(","):
-                    return
-            else:
-                self.__UndoToken()
-                return
-                
-            while self.__GetNextToken():
-                if not TokenFindPattern.match(self.__Token):
-                    raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)
-                FfsInfObj.KeyStringList.append(self.__Token)
-    
-                if not self.__IsToken(","):
-                    break
-                
-    ## __GetFileStatement() method
-    #
-    #   Get FILE statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom FILE statement is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find FILE statement
-    #   @retval False       Not able to find FILE statement
-    #
-    def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):
-
-        if not self.__IsKeyword( "FILE"):
-            return False
-        
-        FfsFileObj = CommonDataClass.FdfClass.FileStatementClassObject()
-        
-        if not self.__GetNextWord():
-            raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)
-        FfsFileObj.FvFileType = self.__Token
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextGuid():
-            if not self.__GetNextWord():
-                raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)
-            if self.__Token == 'PCD':
-                if not self.__IsToken( "("):
-                    raise Warning("expected '('", self.FileName, self.CurrentLineNumber)
-                PcdPair = self.__GetNextPcdName()
-                if not self.__IsToken( ")"):
-                    raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)
-                self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'
-                
-        FfsFileObj.NameGuid = self.__Token
-    
-        self.__GetFilePart( FfsFileObj, MacroDict.copy())
-        
-        if ForCapsule:
-            capsuleFfs = CapsuleData.CapsuleFfs()
-            capsuleFfs.Ffs = FfsFileObj
-            Obj.CapsuleDataList.append(capsuleFfs)
-        else:
-            Obj.FfsList.append(FfsFileObj)
-                
-        return True
-    
-    ## __FileCouldHaveRelocFlag() method
-    #
-    #   Check whether reloc strip flag can be set for a file type.
-    #
-    #   @param  FileType    The file type to check with
-    #   @retval True        This type could have relocation strip flag
-    #   @retval False       No way to have it
-    #
-    @staticmethod
-    def __FileCouldHaveRelocFlag (FileType):
-        if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
-            return True
-        else:
-            return False
-    
-    ## __SectionCouldHaveRelocFlag() method
-    #
-    #   Check whether reloc strip flag can be set for a section type.
-    #
-    #   @param  SectionType The section type to check with
-    #   @retval True        This type could have relocation strip flag
-    #   @retval False       No way to have it
-    #
-    @staticmethod
-    def __SectionCouldHaveRelocFlag (SectionType):
-        if SectionType in ('TE', 'PE32'):
-            return True
-        else:
-            return False
-        
-    ## __GetFilePart() method
-    #
-    #   Get components for FILE statement
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFileObj   for whom component is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #
-    def __GetFilePart(self, FfsFileObj, MacroDict = {}):
-        
-        self.__GetFileOpts( FfsFileObj)
-        
-        if not self.__IsToken("{"):
-#            if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-#                if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
-#                    if self.__Token == 'RELOCS_STRIPPED':
-#                        FfsFileObj.KeepReloc = False
-#                    else:
-#                        FfsFileObj.KeepReloc = True
-#                else:
-#                    raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-#            
-#            if not self.__IsToken("{"):
-            raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextToken():
-            raise Warning("expected File name or section data At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__Token == "FV":
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-            FfsFileObj.FvName = self.__Token
-            
-        elif self.__Token == "FD":
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected FD name At Line ", self.FileName, self.CurrentLineNumber)
-            FfsFileObj.FdName = self.__Token
-            
-        elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):
-            self.__UndoToken()
-            self.__GetSectionData( FfsFileObj, MacroDict)
-        else:
-            FfsFileObj.FileName = self.__Token
-        
-        if not self.__IsToken( "}"):
-            raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-    
-    ## __GetFileOpts() method
-    #
-    #   Get options for FILE statement
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFileObj   for whom options is got
-    #
-    def __GetFileOpts(self, FfsFileObj):
-        
-        if self.__GetNextToken():
-            if TokenFindPattern.match(self.__Token):
-                FfsFileObj.KeyStringList.append(self.__Token)
-                if self.__IsToken(","):
-                    while self.__GetNextToken():
-                        if not TokenFindPattern.match(self.__Token):
-                            raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)
-                        FfsFileObj.KeyStringList.append(self.__Token)
-
-                        if not self.__IsToken(","):
-                            break
-                    
-            else:
-                self.__UndoToken()
-
-        if self.__IsKeyword( "FIXED", True):
-            FfsFileObj.Fixed = True
-            
-        if self.__IsKeyword( "CHECKSUM", True):
-            FfsFileObj.CheckSum = True
-            
-        if self.__GetAlignment():
-            FfsFileObj.Alignment = self.__Token
-            
-        
-    
-    ## __GetAlignment() method
-    #
-    #   Return the alignment value
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find alignment
-    #   @retval False       Not able to find alignment
-    #
-    def __GetAlignment(self):
-        if self.__IsKeyword( "Align", True):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected alignment value At Line ", self.FileName, self.CurrentLineNumber)
-            return True
-            
-        return False
-    
-    ## __GetFilePart() method
-    #
-    #   Get section data for FILE statement
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFileObj   for whom section is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #
-    def __GetSectionData(self, FfsFileObj, MacroDict = {}):
-        Dict = {}
-        Dict.update(MacroDict)
-        
-        self.__GetDefineStatements(FfsFileObj)
-        
-        Dict.update(FfsFileObj.DefineVarDict)
-        self.__GetAprioriSection(FfsFileObj, Dict.copy())
-        self.__GetAprioriSection(FfsFileObj, Dict.copy())
-        
-        while True:
-            IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)
-            IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)
-            if not IsLeafSection and not IsEncapSection:
-                break
-         
-    ## __GetLeafSection() method
-    #
-    #   Get leaf section for Obj
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom leaf section is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetLeafSection(self, Obj, MacroDict = {}):
-        
-        OldPos = self.GetFileBufferPos()
-        
-        if not self.__IsKeyword( "SECTION"):
-            if len(Obj.SectionList) == 0:
-                raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)
-            else:
-                return False
-        
-        AlignValue = None
-        if self.__GetAlignment():
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            AlignValue = self.__Token
-            
-        BuildNum = None
-        if self.__IsKeyword( "BUILD_NUM"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected Build number value At Line ", self.FileName, self.CurrentLineNumber)
-            
-            BuildNum = self.__Token
-            
-        if self.__IsKeyword( "VERSION"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected version At Line ", self.FileName, self.CurrentLineNumber)
-            VerSectionObj = CommonDataClass.FdfClass.VerSectionClassObject()
-            VerSectionObj.Alignment = AlignValue
-            VerSectionObj.BuildNum = BuildNum
-            if self.__GetStringData():
-                VerSectionObj.StringData = self.__Token
-            else:
-                VerSectionObj.FileName = self.__Token
-            Obj.SectionList.append(VerSectionObj)
-
-        elif self.__IsKeyword( "UI"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected UI At Line ", self.FileName, self.CurrentLineNumber)
-            UiSectionObj = CommonDataClass.FdfClass.UiSectionClassObject()
-            UiSectionObj.Alignment = AlignValue
-            if self.__GetStringData():
-                UiSectionObj.StringData = self.__Token
-            else:
-                UiSectionObj.FileName = self.__Token
-            Obj.SectionList.append(UiSectionObj)
-            
-        elif self.__IsKeyword( "FV_IMAGE"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextWord():
-                raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            FvName = self.__Token.upper()
-            FvObj = None
-
-            if self.__IsToken( "{"):
-                FvObj = Fv.FV()
-                FvObj.UiFvName = FvName
-                self.__GetDefineStatements(FvObj)
-                MacroDict.update(FvObj.DefineVarDict)
-                self.__GetBlockStatement(FvObj)
-                self.__GetSetStatements(FvObj)
-                self.__GetFvAlignment(FvObj)
-                self.__GetFvAttributes(FvObj)
-                self.__GetAprioriSection(FvObj, MacroDict.copy())
-                self.__GetAprioriSection(FvObj, MacroDict.copy())
-    
-                while True:
-                    IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())
-                    IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())
-                    if not IsInf and not IsFile:
-                        break
-    
-                if not self.__IsToken( "}"):
-                    raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            FvImageSectionObj = CommonDataClass.FdfClass.FvImageSectionClassObject()
-            FvImageSectionObj.Alignment = AlignValue
-            if FvObj is not None:
-                FvImageSectionObj.Fv = FvObj
-                FvImageSectionObj.FvName = None
-            else:
-                FvImageSectionObj.FvName = FvName
-                
-            Obj.SectionList.append(FvImageSectionObj) 
-           
-        elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            DepexSectionObj = CommonDataClass.FdfClass.DepexSectionClassObject()
-            DepexSectionObj.Alignment = AlignValue
-            DepexSectionObj.DepexType = self.__Token
-            
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__SkipToToken( "}"):
-                raise Warning("expected Depex expression ending '}' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')
-            Obj.SectionList.append(DepexSectionObj)
-        
-        else:
-            
-            if not self.__GetNextWord():
-                raise Warning("expected section type At Line ", self.FileName, self.CurrentLineNumber)
-            
-            # Encapsulation section appear, UndoToken and return
-            if self.__Token == "COMPRESS" or self.__Token == "GUIDED":
-                self.SetFileBufferPos(OldPos)
-                return False
-            
-            if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                               "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
-                raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            # DataSection
-            DataSectionObj = CommonDataClass.FdfClass.DataSectionClassObject()
-            DataSectionObj.Alignment = AlignValue
-            DataSectionObj.SecType = self.__Token
-            
-            if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-                if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):
-                    if self.__Token == 'RELOCS_STRIPPED':
-                        DataSectionObj.KeepReloc = False
-                    else:
-                        DataSectionObj.KeepReloc = True
-                else:
-                    raise Warning("File type %s, section type %s, could not have reloc strip flag At Line %d" % (Obj.FvFileType, DataSectionObj.SecType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            
-            if self.__IsToken("="):
-                if not self.__GetNextToken():
-                    raise Warning("expected section file path At Line ", self.FileName, self.CurrentLineNumber)
-                DataSectionObj.SectFileName = self.__Token
-            else:
-                if not self.__GetCglSection(DataSectionObj):
-                    return False
-            
-            Obj.SectionList.append(DataSectionObj)
-            
-        return True
-            
-    ## __GetCglSection() method
-    #
-    #   Get compressed or GUIDed section for Obj
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom leaf section is got
-    #   @param  AlignValue  alignment value for complex section
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetCglSection(self, Obj, AlignValue = None):
-        
-        if self.__IsKeyword( "COMPRESS"):
-            type = "PI_STD"
-            if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):
-                type = self.__Token
-                
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-
-            CompressSectionObj = CommonDataClass.FdfClass.CompressSectionClassObject()
-            CompressSectionObj.Alignment = AlignValue
-            CompressSectionObj.CompType = type
-            # Recursive sections...
-            while True:
-                IsLeafSection = self.__GetLeafSection(CompressSectionObj)
-                IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)
-                if not IsLeafSection and not IsEncapSection:
-                    break
-            
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Obj.SectionList.append(CompressSectionObj)
-                
-#            else:
-#               raise Warning("Compress type not known At Line ") 
-           
-            return True
-        
-        elif self.__IsKeyword( "GUIDED"):
-            GuidValue = None
-            if self.__GetNextGuid():
-                GuidValue = self.__Token
-
-            AttribDict = self.__GetGuidAttrib()
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            GuidSectionObj = CommonDataClass.FdfClass.GuidSectionClassObject()
-            GuidSectionObj.Alignment = AlignValue
-            GuidSectionObj.NameGuid = GuidValue
-            GuidSectionObj.SectionType = "GUIDED"
-            GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]
-            GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]
-            # Recursive sections...
-            while True:
-                IsLeafSection = self.__GetLeafSection(GuidSectionObj)
-                IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)
-                if not IsLeafSection and not IsEncapSection:
-                    break
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Obj.SectionList.append(GuidSectionObj)
-                
-            return True
-        
-        return False
-
-    ## __GetGuidAttri() method
-    #
-    #   Get attributes for GUID section
-    #
-    #   @param  self        The object pointer
-    #   @retval AttribDict  Dictionary of key-value pair of section attributes
-    #
-    def __GetGuidAttrib(self):
-        
-        AttribDict = {}
-        AttribDict["PROCESSING_REQUIRED"] = False
-        AttribDict["AUTH_STATUS_VALID"] = False
-        if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):
-            AttribKey = self.__Token
-
-            if not self.__IsToken("="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):
-                raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)
-            AttribDict[AttribKey] = self.__Token
-            
-        if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):
-            AttribKey = self.__Token
-
-            if not self.__IsToken("="):
-                raise Warning("expected '=' At Line ")
-
-            if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):
-                raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)
-            AttribDict[AttribKey] = self.__Token
-            
-        return AttribDict
-            
-    ## __GetEncapsulationSec() method
-    #
-    #   Get encapsulation section for FILE
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFile     for whom section is got
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetEncapsulationSec(self, FfsFileObj):        
-        
-        OldPos = self.GetFileBufferPos()
-        if not self.__IsKeyword( "SECTION"):
-            if len(FfsFileObj.SectionList) == 0:
-                raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)
-            else:
-                return False
-        
-        AlignValue = None
-        if self.__GetAlignment():
-            if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            AlignValue = self.__Token
-            
-        if not self.__GetCglSection(FfsFileObj, AlignValue):
-            self.SetFileBufferPos(OldPos)
-            return False
-        else:
-            return True
-
-    ## __GetCapsule() method
-    #
-    #   Get capsule section contents and store its data into capsule list of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a capsule
-    #   @retval False       Not able to find a capsule
-    #
-    def __GetCapsule(self):
-        
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[CAPSULE."):
-            if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[CAPSULE.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [Capsule.] At Line ", self.FileName, self.CurrentLineNumber)        
-            
-        CapsuleObj = CommonDataClass.FdfClass.CapsuleClassObject()
-
-        CapsuleName = self.__GetUiName()
-        if not CapsuleName:
-            raise Warning("expected capsule name At line ", self.FileName, self.CurrentLineNumber)
-        
-        CapsuleObj.UiCapsuleName = CapsuleName.upper()
-        
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__IsKeyword("CREATE_FILE"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            CapsuleObj.CreateFile = self.__Token
-        
-        self.__GetCapsuleStatements(CapsuleObj)
-        self.Profile.CapsuleList.append(CapsuleObj)
-        return True    
-            
-    ## __GetCapsuleStatements() method
-    #
-    #   Get statements for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom statements are got
-    #
-    def __GetCapsuleStatements(self, Obj):
-        self.__GetCapsuleTokens(Obj)
-        self.__GetDefineStatements(Obj)
-        self.__GetSetStatements(Obj)
-        
-        self.__GetCapsuleData(Obj)
-                
-    ## __GetCapsuleStatements() method
-    #
-    #   Get token statements for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom token statements are got
-    #
-    def __GetCapsuleTokens(self, Obj):
-        
-        if not self.__IsKeyword("CAPSULE_GUID"):
-            raise Warning("expected 'CAPSULE_GUID' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        while self.__CurrentLine().find("=") != -1:
-            NameValue = self.__CurrentLine().split("=")
-            Obj.TokensDict[NameValue[0].strip()] = NameValue[1].strip()
-            self.CurrentLineNumber += 1
-            self.CurrentOffsetWithinLine = 0
-    
-    ## __GetCapsuleData() method
-    #
-    #   Get capsule data for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom capsule data are got
-    #
-    def __GetCapsuleData(self, Obj):
-        
-        while True:
-            IsInf = self.__GetInfStatement(Obj, True)
-            IsFile = self.__GetFileStatement(Obj, True)
-            IsFv = self.__GetFvStatement(Obj)
-            if not IsInf and not IsFile and not IsFv:
-                break
-    
-    ## __GetFvStatement() method
-    #
-    #   Get FV for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  CapsuleObj  for whom FV is got
-    #   @retval True        Successfully find a FV statement
-    #   @retval False       Not able to find a FV statement
-    #
-    def __GetFvStatement(self, CapsuleObj):
-        
-        if not self.__IsKeyword("FV"):
-            return False
-        
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-        
-#        CapsuleFv = CapsuleData.CapsuleFv()
-#        CapsuleFv.FvName = self.__Token
-#        CapsuleObj.CapsuleDataList.append(CapsuleFv)
-        return True
-    
-    ## __GetRule() method
-    #
-    #   Get Rule section contents and store its data into rule list of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a Rule
-    #   @retval False       Not able to find a Rule
-    #
-    def __GetRule(self):
-        
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[RULE."):
-            if not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-        self.__UndoToken()
-        if not self.__IsToken("[Rule.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [Rule.] At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__SkipToToken("."):
-            raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        Arch = self.__SkippedChars.rstrip(".")
-        if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
-            raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)
-        
-        ModuleType = self.__GetModuleType()
-        
-        TemplateName = ""
-        if self.__IsToken("."):
-            if not self.__GetNextWord():
-                raise Warning("expected template name At Line ", self.FileName, self.CurrentLineNumber)
-            TemplateName = self.__Token
-            
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        RuleObj = self.__GetRuleFileStatements()
-        RuleObj.Arch = Arch.upper()
-        RuleObj.ModuleType = ModuleType
-        RuleObj.TemplateName = TemplateName
-        if TemplateName == '' :
-            self.Profile.RuleDict['RULE'             + \
-                              '.'                    + \
-                              Arch.upper()           + \
-                              '.'                    + \
-                              ModuleType.upper()     ] = RuleObj
-        else :
-            self.Profile.RuleDict['RULE'             + \
-                              '.'                    + \
-                              Arch.upper()           + \
-                              '.'                    + \
-                              ModuleType.upper()     + \
-                              '.'                    + \
-                              TemplateName.upper() ] = RuleObj
-#        self.Profile.RuleList.append(rule)
-        return True
-    
-    ## __GetModuleType() method
-    #
-    #   Return the module type
-    #
-    #   @param  self        The object pointer
-    #   @retval string      module type
-    #
-    def __GetModuleType(self):
-        
-        if not self.__GetNextWord():
-            raise Warning("expected Module type At Line ", self.FileName, self.CurrentLineNumber)
-        if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
-                             "DXE_DRIVER", "DXE_SAL_DRIVER", \
-                             "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
-                             "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
-                             "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
-                             "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
-            raise Warning("Unknown Module type At line ", self.FileName, self.CurrentLineNumber)
-        return self.__Token
-    
-    ## __GetFileExtension() method
-    #
-    #   Return the file extension
-    #
-    #   @param  self        The object pointer
-    #   @retval string      file name extension
-    #
-    def __GetFileExtension(self):
-        if not self.__IsToken("."):
-                raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        Ext = ""
-        if self.__GetNextToken():
-            if FileExtensionPattern.match(self.__Token):
-                Ext = self.__Token                            
-                return '.' + Ext    
-            else:
-                raise Warning("Unknown file extension At Line ", self.FileName, self.CurrentLineNumber)
-                
-        else:
-            raise Warning("expected file extension At Line ", self.FileName, self.CurrentLineNumber)
-        
-    ## __GetRuleFileStatement() method
-    #
-    #   Get rule contents
-    #
-    #   @param  self        The object pointer
-    #   @retval Rule        Rule object
-    #
-    def __GetRuleFileStatements(self):
-        
-        if not self.__IsKeyword("FILE"):
-            raise Warning("expected FILE At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextWord():
-            raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)
-        
-        Type = self.__Token.strip().upper()
-        if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
-                             "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):
-            raise Warning("Unknown FV type At line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__IsKeyword("$(NAMED_GUID)"):
-            if not self.__GetNextWord():
-                raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)
-            if self.__Token == 'PCD':
-                if not self.__IsToken( "("):
-                    raise Warning("expected '('", self.FileName, self.CurrentLineNumber)
-                PcdPair = self.__GetNextPcdName()
-                if not self.__IsToken( ")"):
-                    raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)
-                self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'
-            
-        NameGuid = self.__Token
-
-        KeepReloc = None
-        if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-            if self.__FileCouldHaveRelocFlag(Type):
-                if self.__Token == 'RELOCS_STRIPPED':
-                    KeepReloc = False
-                else:
-                    KeepReloc = True
-            else:
-                raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-        
-        KeyStringList = []
-        if self.__GetNextToken():
-            if TokenFindPattern.match(self.__Token):
-                KeyStringList.append(self.__Token)
-                if self.__IsToken(","):
-                    while self.__GetNextToken():
-                        if not TokenFindPattern.match(self.__Token):
-                            raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)
-                        KeyStringList.append(self.__Token)
-
-                        if not self.__IsToken(","):
-                            break
-                    
-            else:
-                self.__UndoToken()
-
-        
-        Fixed = False
-        if self.__IsKeyword("Fixed", True):
-            Fixed = True
-            
-        CheckSum = False
-        if self.__IsKeyword("CheckSum", True):
-            CheckSum = True
-            
-        AlignValue = ""
-        if self.__GetAlignment():
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
-            AlignValue = self.__Token
-
-        if self.__IsToken("{"):
-            # Complex file rule expected
-            Rule = RuleComplexFile.RuleComplexFile()
-            Rule.FvFileType = Type
-            Rule.NameGuid = NameGuid
-            Rule.Alignment = AlignValue
-            Rule.CheckSum = CheckSum
-            Rule.Fixed = Fixed
-            Rule.KeyStringList = KeyStringList
-            if KeepReloc is not None:
-                Rule.KeepReloc = KeepReloc
-            
-            while True:
-                IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)
-                IsLeaf = self.__GetEfiSection(Rule)
-                if not IsEncapsulate and not IsLeaf:
-                    break
-                
-            if not self.__IsToken("}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            return Rule
-        
-        elif self.__IsToken("|"):
-            # Ext rule expected
-            Ext = self.__GetFileExtension()
-            
-            Rule = RuleSimpleFile.RuleSimpleFile()
-
-            Rule.FvFileType = Type
-            Rule.NameGuid = NameGuid
-            Rule.Alignment = AlignValue
-            Rule.CheckSum = CheckSum
-            Rule.Fixed = Fixed
-            Rule.FileExtension = Ext
-            Rule.KeyStringList = KeyStringList
-            if KeepReloc is not None:
-                Rule.KeepReloc = KeepReloc
-            
-            return Rule
-            
-        else:
-            # Simple file rule expected
-            if not self.__GetNextWord():
-                raise Warning("expected leaf section type At Line ", self.FileName, self.CurrentLineNumber)
-
-            SectionName = self.__Token
-        
-            if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                                    "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
-                raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)
-
-
-            if self.__IsKeyword("Fixed", True):
-                Fixed = True              
-    
-            if self.__IsKeyword("CheckSum", True):
-                CheckSum = True
-    
-            if self.__GetAlignment():
-                if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                        "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                    raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
-                if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
-                    raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-                AlignValue = self.__Token
-            
-            if not self.__GetNextToken():
-                raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            Rule = RuleSimpleFile.RuleSimpleFile()
-            Rule.SectionType = SectionName
-            Rule.FvFileType = Type
-            Rule.NameGuid = NameGuid
-            Rule.Alignment = AlignValue
-            Rule.CheckSum = CheckSum
-            Rule.Fixed = Fixed
-            Rule.FileName = self.__Token
-            Rule.KeyStringList = KeyStringList
-            if KeepReloc is not None:
-                Rule.KeepReloc = KeepReloc
-            return Rule
-        
-    ## __GetEfiSection() method
-    #
-    #   Get section list for Rule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom section is got
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetEfiSection(self, Obj):
-        
-        OldPos = self.GetFileBufferPos()
-        if not self.__GetNextWord():
-            return False
-        SectionName = self.__Token
-        
-        if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                               "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
-            self.__UndoToken()
-            return False
-        
-        if SectionName == "FV_IMAGE":
-            FvImageSectionObj = FvImageSection.FvImageSection()
-            if self.__IsKeyword("FV_IMAGE"):
-                pass
-            if self.__IsToken( "{"):
-                FvObj = Fv.FV()
-                self.__GetDefineStatements(FvObj)
-                self.__GetBlockStatement(FvObj)
-                self.__GetSetStatements(FvObj)
-                self.__GetFvAlignment(FvObj)
-                self.__GetFvAttributes(FvObj)
-                self.__GetAprioriSection(FvObj)
-                self.__GetAprioriSection(FvObj)
-    
-                while True:
-                    IsInf = self.__GetInfStatement(FvObj)
-                    IsFile = self.__GetFileStatement(FvObj)
-                    if not IsInf and not IsFile:
-                        break
-    
-                if not self.__IsToken( "}"):
-                    raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-                FvImageSectionObj.Fv = FvObj
-                FvImageSectionObj.FvName = None
-                
-            else:
-                if not self.__IsKeyword("FV"):
-                    raise Warning("expected 'FV' At Line ", self.FileName, self.CurrentLineNumber)
-                FvImageSectionObj.FvFileType = self.__Token
-                
-                if self.__GetAlignment():
-                    if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                            "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                        raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
-                    FvImageSectionObj.Alignment = self.__Token
-                
-                if self.__IsToken('|'):
-                    FvImageSectionObj.FvFileExtension = self.__GetFileExtension()
-                elif self.__GetNextToken():
-                    if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                               "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
-                        FvImageSectionObj.FvFileName = self.__Token
-                    else:
-                        self.__UndoToken()
-                else:
-                    raise Warning("expected FV file name At Line ", self.FileName, self.CurrentLineNumber)
-                    
-            Obj.SectionList.append(FvImageSectionObj)
-            return True
-        
-        EfiSectionObj = EfiSection.EfiSection()
-        EfiSectionObj.SectionType = SectionName
-        
-        if not self.__GetNextToken():
-            raise Warning("expected file type At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__Token == "STRING":
-            if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):
-                raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            
-            if not self.__IsToken('='):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected Quoted String At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if self.__GetStringData():
-                EfiSectionObj.StringData = self.__Token
-            
-            if self.__IsKeyword("BUILD_NUM"):
-                if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):
-                    raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            
-                if not self.__IsToken("="):
-                    raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                if not self.__GetNextToken():
-                    raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)
-                EfiSectionObj.BuildNum = self.__Token
-                
-        else:
-            EfiSectionObj.FileType = self.__Token
-            self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)
-            
-        if self.__IsKeyword("Optional"):
-            if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):
-                raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            EfiSectionObj.Optional = True
-        
-            if self.__IsKeyword("BUILD_NUM"):
-                if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):
-                    raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-                
-                if not self.__IsToken("="):
-                    raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                if not self.__GetNextToken():
-                    raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)
-                EfiSectionObj.BuildNum = self.__Token
-                
-        if self.__GetAlignment():
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            EfiSectionObj.Alignment = self.__Token
-        
-        if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-            if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):
-                if self.__Token == 'RELOCS_STRIPPED':
-                    EfiSectionObj.KeepReloc = False
-                else:
-                    EfiSectionObj.KeepReloc = True
-                if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:
-                    raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            else:
-                raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-        
-        
-        if self.__IsToken('|'):
-            EfiSectionObj.FileExtension = self.__GetFileExtension()
-        elif self.__GetNextToken():
-            if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                       "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
-                
-                if self.__Token.startswith('PCD'):
-                    self.__UndoToken()
-                    self.__GetNextWord()
-                
-                    if self.__Token == 'PCD':
-                        if not self.__IsToken( "("):
-                            raise Warning("expected '('", self.FileName, self.CurrentLineNumber)
-                        PcdPair = self.__GetNextPcdName()
-                        if not self.__IsToken( ")"):
-                            raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)
-                        self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'
-                        
-                EfiSectionObj.FileName = self.__Token        
-                            
-            else:
-                self.__UndoToken()
-        else:
-            raise Warning("expected section file name At Line ", self.FileName, self.CurrentLineNumber)
-                
-        Obj.SectionList.append(EfiSectionObj)
-        return True
-        
-    ## __RuleSectionCouldBeOptional() method
-    #
-    #   Get whether a section could be optional
-    #
-    #   @param  SectionType The section type to check
-    #   @retval True        section could be optional
-    #   @retval False       section never optional
-    #
-    @staticmethod
-    def __RuleSectionCouldBeOptional(SectionType):
-        if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
-            return True
-        else:
-            return False
-    
-    ## __RuleSectionCouldHaveBuildNum() method
-    #
-    #   Get whether a section could have build number information
-    #
-    #   @param  SectionType The section type to check
-    #   @retval True        section could have build number information
-    #   @retval False       section never have build number information
-    #
-    @staticmethod
-    def __RuleSectionCouldHaveBuildNum(SectionType):
-        if SectionType in ("VERSION"):
-            return True
-        else:
-            return False
-    
-    ## __RuleSectionCouldHaveString() method
-    #
-    #   Get whether a section could have string
-    #
-    #   @param  SectionType The section type to check
-    #   @retval True        section could have string
-    #   @retval False       section never have string
-    #
-    @staticmethod
-    def __RuleSectionCouldHaveString(SectionType):
-        if SectionType in ("UI", "VERSION"):
-            return True
-        else:
-            return False
-    
-    ## __CheckRuleSectionFileType() method
-    #
-    #   Get whether a section matches a file type
-    #
-    #   @param  self        The object pointer
-    #   @param  SectionType The section type to check
-    #   @param  FileType    The file type to check
-    #
-    def __CheckRuleSectionFileType(self, SectionType, FileType):
-        if SectionType == "COMPAT16":
-            if FileType not in ("COMPAT16", "SEC_COMPAT16"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "PE32":
-            if FileType not in ("PE32", "SEC_PE32"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "PIC":
-            if FileType not in ("PIC", "PIC"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "TE":
-            if FileType not in ("TE", "SEC_TE"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "RAW":
-            if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":
-            if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "UI":
-            if FileType not in ("UI", "SEC_UI"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "VERSION":
-            if FileType not in ("VERSION", "SEC_VERSION"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "PEI_DEPEX":
-            if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "GUID":
-            if FileType not in ("PE32", "SEC_GUID"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)    
-              
-    ## __GetRuleEncapsulationSection() method
-    #
-    #   Get encapsulation section for Rule
-    #
-    #   @param  self        The object pointer
-    #   @param  Rule        for whom section is got
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetRuleEncapsulationSection(self, Rule):
-
-        if self.__IsKeyword( "COMPRESS"):
-            Type = "PI_STD"
-            if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):
-                Type = self.__Token
-                
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-
-            CompressSectionObj = CompressSection.CompressSection()
-            
-            CompressSectionObj.CompType = Type
-            # Recursive sections...
-            while True:
-                IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)
-                IsLeaf = self.__GetEfiSection(CompressSectionObj)
-                if not IsEncapsulate and not IsLeaf:
-                    break
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Rule.SectionList.append(CompressSectionObj)
-                
-            return True
-
-        elif self.__IsKeyword( "GUIDED"):
-            GuidValue = None
-            if self.__GetNextGuid():
-                GuidValue = self.__Token
-            
-            if self.__IsKeyword( "$(NAMED_GUID)"):
-                GuidValue = self.__Token
-                
-            AttribDict = self.__GetGuidAttrib()
-            
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            GuidSectionObj = GuidSection.GuidSection()
-            GuidSectionObj.NameGuid = GuidValue
-            GuidSectionObj.SectionType = "GUIDED"
-            GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]
-            GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]
-            
-            # Efi sections...
-            while True:
-                IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)
-                IsLeaf = self.__GetEfiSection(GuidSectionObj)
-                if not IsEncapsulate and not IsLeaf:
-                    break
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Rule.SectionList.append(GuidSectionObj)
-
-            return True
-
-        return False
-        
-    ## __GetVtf() method
-    #
-    #   Get VTF section contents and store its data into VTF list of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a VTF
-    #   @retval False       Not able to find a VTF
-    #
-    def __GetVtf(self):
-        
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[VTF."):
-            if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[VTF.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [VTF.] At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__SkipToToken("."):
-            raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)
-
-        Arch = self.__SkippedChars.rstrip(".").upper()
-        if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
-            raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextWord():
-            raise Warning("expected VTF name At Line ", self.FileName, self.CurrentLineNumber)
-        Name = self.__Token.upper()
-
-        VtfObj = Vtf.Vtf()
-        VtfObj.UiName = Name
-        VtfObj.KeyArch = Arch
-        
-        if self.__IsToken(","):
-            if not self.__GetNextWord():
-                raise Warning("expected Arch list At Line ", self.FileName, self.CurrentLineNumber)
-            if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
-                raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)
-            VtfObj.ArchList = self.__Token.upper()
-
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__IsKeyword("IA32_RST_BIN"):
-            if not self.__IsToken("="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-            if not self.__GetNextToken():
-                raise Warning("expected Reset file At Line ", self.FileName, self.CurrentLineNumber)
-
-            VtfObj.ResetBin = self.__Token
-            
-        while self.__GetComponentStatement(VtfObj):
-            pass
-        
-        self.Profile.VtfList.append(VtfObj)
-        return True
-    
-    ## __GetComponentStatement() method
-    #
-    #   Get components in VTF
-    #
-    #   @param  self        The object pointer
-    #   @param  VtfObj         for whom component is got
-    #   @retval True        Successfully find a component
-    #   @retval False       Not able to find a component
-    #
-    def __GetComponentStatement(self, VtfObj):
-        
-        if not self.__IsKeyword("COMP_NAME"):
-            return False
-        
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextWord():
-            raise Warning("expected Component Name At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj = ComponentStatement.ComponentStatement()
-        CompStatementObj.CompName = self.__Token
-        
-        if not self.__IsKeyword("COMP_LOC"):
-            raise Warning("expected COMP_LOC At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj.CompLoc = ""
-        if self.__GetNextWord():
-            CompStatementObj.CompLoc = self.__Token
-            if self.__IsToken('|'):
-                if not self.__GetNextWord():
-                    raise Warning("Expected Region Name At Line ", self.FileName, self.CurrentLineNumber)
-                
-                if self.__Token not in ("F", "N", "S"):    #, "H", "L", "PH", "PL"): not support
-                    raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)
-    
-                CompStatementObj.FilePos = self.__Token
-        else:
-            self.CurrentLineNumber += 1
-            self.CurrentOffsetWithinLine = 0
-        
-        if not self.__IsKeyword("COMP_TYPE"):
-            raise Warning("expected COMP_TYPE At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component type At Line ", self.FileName, self.CurrentLineNumber)
-        if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):
-            if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \
-                not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:
-                raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)
-        CompStatementObj.CompType = self.__Token
-        
-        if not self.__IsKeyword("COMP_VER"):
-            raise Warning("expected COMP_VER At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component version At Line ", self.FileName, self.CurrentLineNumber)
-
-        Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
-        if Pattern.match(self.__Token) is None:
-            raise Warning("Unknown version format At line ", self.FileName, self.CurrentLineNumber)
-        CompStatementObj.CompVer = self.__Token
-        
-        if not self.__IsKeyword("COMP_CS"):
-            raise Warning("expected COMP_CS At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component CS At Line ", self.FileName, self.CurrentLineNumber)
-        if self.__Token not in ("1", "0"):
-            raise Warning("Unknown  Component CS At line ", self.FileName, self.CurrentLineNumber)
-        CompStatementObj.CompCs = self.__Token
-        
-        
-        if not self.__IsKeyword("COMP_BIN"):
-            raise Warning("expected COMP_BIN At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component file At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj.CompBin = self.__Token
-        
-        if not self.__IsKeyword("COMP_SYM"):
-            raise Warning("expected COMP_SYM At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component symbol file At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj.CompSym = self.__Token
-    
-        if not self.__IsKeyword("COMP_SIZE"):
-            raise Warning("expected COMP_SIZE At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if self.__IsToken("-"):
-            CompStatementObj.CompSize = self.__Token
-        elif self.__GetNextDecimalNumber():
-            CompStatementObj.CompSize = self.__Token
-        elif self.__GetNextHexNumber():
-            CompStatementObj.CompSize = self.__Token
-        else:
-            raise Warning("Unknown size At line ", self.FileName, self.CurrentLineNumber)
-        
-        VtfObj.ComponentStatementList.append(CompStatementObj)
-        return True
-    
-    ## __GetFvInFd() method
-    #
-    #   Get FV list contained in FD
-    #
-    #   @param  self        The object pointer
-    #   @param  FdName      FD name
-    #   @retval FvList      list of FV in FD
-    #
-    def __GetFvInFd (self, FdName):
-    
-        FvList = []
-        if FdName.upper() in self.Profile.FdDict.keys():
-            FdObj = self.Profile.FdDict[FdName.upper()]
-            for elementRegion in FdObj.RegionList:
-                if elementRegion.RegionType == 'FV':
-                    for elementRegionData in elementRegion.RegionDataList:
-                        if elementRegionData is not None and elementRegionData.upper() not in FvList:
-                            FvList.append(elementRegionData.upper())
-        return FvList
-    
-    ## __GetReferencedFdFvTuple() method
-    #
-    #   Get FD and FV list referenced by a FFS file
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFile     contains sections to be searched
-    #   @param  RefFdList   referenced FD by section
-    #   @param  RefFvList   referenced FV by section
-    #
-    def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):
-        
-        for FfsObj in FvObj.FfsList:
-            if isinstance(FfsObj, FfsFileStatement.FileStatement):
-                if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:
-                    RefFvList.append(FfsObj.FvName.upper())
-                elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:
-                    RefFdList.append(FfsObj.FdName.upper())
-                else:
-                    self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)    
-    
-    ## __GetReferencedFdFvTupleFromSection() method
-    #
-    #   Get FD and FV list referenced by a FFS section
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFile     contains sections to be searched
-    #   @param  FdList      referenced FD by section
-    #   @param  FvList      referenced FV by section
-    #
-    def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):
-        
-        SectionStack = []
-        SectionStack.extend(FfsFile.SectionList)
-        while SectionStack != []:
-            SectionObj = SectionStack.pop()
-            if isinstance(SectionObj, FvImageSection.FvImageSection):
-                if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:
-                    FvList.append(SectionObj.FvName.upper())
-                if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:
-                    FvList.append(SectionObj.Fv.UiFvName.upper())
-                    self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)
-            
-            if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):
-                SectionStack.extend(SectionObj.SectionList)
-                          
-    ## CycleReferenceCheck() method
-    #
-    #   Check whether cycle reference exists in FDF
-    #
-    #   @param  self        The object pointer
-    #   @retval True        cycle reference exists
-    #   @retval False       Not exists cycle reference
-    #
-    def CycleReferenceCheck(self):
-        
-        CycleRefExists = False
-        
-        try:
-            for FvName in self.Profile.FvDict.keys():
-                LogStr = "Cycle Reference Checking for FV: %s\n" % FvName
-                RefFvStack = []
-                RefFvStack.append(FvName)
-                FdAnalyzedList = []
-                
-                while RefFvStack != []:
-                    FvNameFromStack = RefFvStack.pop()
-                    if FvNameFromStack.upper() in self.Profile.FvDict.keys():
-                        FvObj = self.Profile.FvDict[FvNameFromStack.upper()]
-                    else:
-                        continue
-                    
-                    RefFdList = []
-                    RefFvList = []
-                    self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)
-                    
-                    for RefFdName in RefFdList:
-                        if RefFdName in FdAnalyzedList:
-                            continue
-                        
-                        LogStr += "FD %s is referenced by FV %s\n" % (RefFdName, FvNameFromStack) 
-                        FvInFdList = self.__GetFvInFd(RefFdName)
-                        if FvInFdList != []:
-                            LogStr += "FD %s contains FV: " % RefFdName
-                            for FvObj in FvInFdList:
-                                LogStr += FvObj
-                                LogStr += ' \n'
-                                if FvObj not in RefFvStack:
-                                    RefFvStack.append(FvObj)
-                        
-                                if FvName in RefFvStack:
-                                    CycleRefExists = True
-                                    raise Warning(LogStr)
-                        FdAnalyzedList.append(RefFdName)
-                                   
-                    for RefFvName in RefFvList:
-                        LogStr += "FV %s is referenced by FV %s\n" % (RefFvName, FvNameFromStack)
-                        if RefFvName not in RefFvStack:
-                            RefFvStack.append(RefFvName)
-                            
-                        if FvName in RefFvStack:
-                            CycleRefExists = True
-                            raise Warning(LogStr)
-        
-        except Warning:
-            print LogStr
-        
-        finally:
-            return CycleRefExists
-        
-if __name__ == "__main__":
-    import sys
-    try:
-        test_file = sys.argv[1]
-    except IndexError, v:
-        print "Usage: %s filename" % sys.argv[0]
-        sys.exit(1)
-
-    parser = FdfParser(test_file)
-    try:
-        parser.ParseFile()
-        parser.CycleReferenceCheck()
-    except Warning, X:
-        print X.message
-    else:
-        print "Success!"
-
diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py
index 9b7e898570..fd38b3d00d 100644
--- a/BaseTools/Source/Python/GenFds/FdfParser.py
+++ b/BaseTools/Source/Python/GenFds/FdfParser.py
@@ -59,11 +59,10 @@ from Common.MultipleWorkspace import MultipleWorkspace as mws
 import Common.LongFilePathOs as os
 from Common.LongFilePathSupport import OpenLongFilePath as open
 from Capsule import EFI_CERT_TYPE_PKCS7_GUID
 from Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID
 from Common.RangeExpression import RangeExpression
-from Common.FdfParserLite import FileExtensionPattern,TokenFindPattern
 
 ##define T_CHAR_SPACE                ' '
 ##define T_CHAR_NULL                 '\0'
 ##define T_CHAR_CR                   '\r'
 ##define T_CHAR_TAB                  '\t'
@@ -83,10 +82,12 @@ SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')
 
 RegionSizePattern = re.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
 RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
 RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*$")
 ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
+FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')
+TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
 
 AllIncludeFileList = []
 
 # Get the closest parent
 def GetParentAtLine (Line):
diff --git a/BaseTools/Source/Python/Makefile b/BaseTools/Source/Python/Makefile
index e1451e7fae..0b1721ca63 100644
--- a/BaseTools/Source/Python/Makefile
+++ b/BaseTools/Source/Python/Makefile
@@ -42,11 +42,10 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\DscClassObject.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\EdkIIWorkspace.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\EdkLogger.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\Expression.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\FdfClassObject.py \
-              $(BASE_TOOLS_PATH)\Source\Python\Common\FdfParserLite.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\GlobalData.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\Identification.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\InfClassObject.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\LongFilePathOs.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\LongFilePathOsPath.py \
-- 
2.12.2.windows.2

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel
Re: [edk2] [PATCH] BaseTools: Remove FdfParserLite.py from soure code
Posted by Zhu, Yonghong 6 years ago
Reviewed-by: Yonghong Zhu <yonghong.zhu@intel.com> 

Best Regards,
Zhu Yonghong


-----Original Message-----
From: Feng, YunhuaX 
Sent: Wednesday, April 04, 2018 1:53 PM
To: edk2-devel@lists.01.org
Cc: Zhu, Yonghong <yonghong.zhu@intel.com>; Gao, Liming <liming.gao@intel.com>
Subject: [PATCH] BaseTools: Remove FdfParserLite.py from soure code

Remove FdfParserLite.py from source code

Cc: Liming Gao <liming.gao@intel.com>
Cc: Yonghong Zhu <yonghong.zhu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Yunhua Feng <yunhuax.feng@intel.com>
---
 BaseTools/Source/Python/Common/FdfClassObject.py |    2 +-
 BaseTools/Source/Python/Common/FdfParserLite.py  | 3639 ----------------------
 BaseTools/Source/Python/GenFds/FdfParser.py      |    3 +-
 BaseTools/Source/Python/Makefile                 |    1 -
 4 files changed, 3 insertions(+), 3642 deletions(-)
 delete mode 100644 BaseTools/Source/Python/Common/FdfParserLite.py

diff --git a/BaseTools/Source/Python/Common/FdfClassObject.py b/BaseTools/Source/Python/Common/FdfClassObject.py
index 9a7d6494d3..0401247351 100644
--- a/BaseTools/Source/Python/Common/FdfClassObject.py
+++ b/BaseTools/Source/Python/Common/FdfClassObject.py
@@ -12,11 +12,11 @@
 #
 
 ##
 # Import Modules
 #
-from FdfParserLite import FdfParser
+from GenFds.FdfParser import FdfParser
 from Table.TableFdf import TableFdf
 from CommonDataClass.DataClass import MODEL_FILE_FDF, MODEL_PCD, MODEL_META_DATA_COMPONENT
 from String import NormPath
 
 
diff --git a/BaseTools/Source/Python/Common/FdfParserLite.py b/BaseTools/Source/Python/Common/FdfParserLite.py
deleted file mode 100644
index dd822505d3..0000000000
--- a/BaseTools/Source/Python/Common/FdfParserLite.py
+++ /dev/null
@@ -1,3639 +0,0 @@
-## @file
-# parse FDF file
-#
-#  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
-#
-#  This program and the accompanying materials
-#  are licensed and made available under the terms and conditions of the BSD License
-#  which accompanies this distribution.  The full text of the license may be found at
-#  http://opensource.org/licenses/bsd-license.php
-#
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-
-##
-# Import Modules
-#
-import re
-import Common.LongFilePathOs as os
-
-import CommonDataClass.FdfClass
-from Common.LongFilePathSupport import OpenLongFilePath as open
-from Common.MultipleWorkspace import MultipleWorkspace as mws
-from Common.RangeExpression import RangeExpression
-from Common.GlobalData import *
-import string
-
-##define T_CHAR_SPACE                ' '
-##define T_CHAR_NULL                 '\0'
-##define T_CHAR_CR                   '\r'
-##define T_CHAR_TAB                  '\t'
-##define T_CHAR_LF                   '\n'
-##define T_CHAR_SLASH                '/'
-##define T_CHAR_BACKSLASH            '\\'
-##define T_CHAR_DOUBLE_QUOTE         '\"'
-##define T_CHAR_SINGLE_QUOTE         '\''
-##define T_CHAR_STAR                 '*'
-##define T_CHAR_HASH                 '#'
-
-(T_CHAR_SPACE, T_CHAR_NULL, T_CHAR_CR, T_CHAR_TAB, T_CHAR_LF, T_CHAR_SLASH, \
-T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_HASH) = \
-(' ', '\0', '\r', '\t', '\n', '/', '\\', '\"', '\'', '*', '#')
-
-SEPERATOR_TUPLE = ('=', '|', ',', '{', '}') 
-
-IncludeFileList = []
-# Macro passed from command line, which has greatest priority and can NOT be overridden by those in FDF
-InputMacroDict = {}
-# All Macro values when parsing file, not replace existing Macro
-AllMacroList = []
-
-FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')
-TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
-
-def GetRealFileLine (File, Line):
-    
-    InsertedLines = 0
-    for Profile in IncludeFileList:
-        if Line >= Profile.InsertStartLineNumber and Line < Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):
-            return (Profile.FileName, Line - Profile.InsertStartLineNumber + 1)
-        if Line >= Profile.InsertStartLineNumber + Profile.InsertAdjust + len(Profile.FileLinesList):
-            InsertedLines += Profile.InsertAdjust + len(Profile.FileLinesList)
-    
-    return (File, Line - InsertedLines)
-
-## The exception class that used to report error messages when parsing FDF
-#
-# Currently the "ToolName" is set to be "FDF Parser".
-#
-class Warning (Exception):
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  Str         The message to record
-    #   @param  File        The FDF name
-    #   @param  Line        The Line number that error occurs
-    #
-    def __init__(self, Str, File=None, Line=None):
-
-        FileLineTuple = GetRealFileLine(File, Line)
-        self.FileName = FileLineTuple[0]
-        self.LineNumber = FileLineTuple[1]
-        self.message = Str + str(self.LineNumber)
-        self.ToolName = 'FDF Parser'
-        
-## The MACRO class that used to record macro value data when parsing include file
-#
-#
-class MacroProfile :
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName, Line):
-        self.FileName = FileName        
-        self.DefinedAtLine  = Line
-        self.MacroName = None
-        self.MacroValue = None
-
-## The Include file content class that used to record file data when parsing include file
-#
-# May raise Exception when opening file.
-#
-class IncludeFileProfile :
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName):
-        self.FileName = FileName
-        self.FileLinesList = []
-        try:
-            fsock = open(FileName, "rb", 0)
-            try:
-                self.FileLinesList = fsock.readlines()
-            finally:
-                fsock.close()
-
-        except IOError:
-            raise Warning("Error when opening file %s" % FileName)
-        
-        self.InsertStartLineNumber = None
-        self.InsertAdjust = 0
-
-## The FDF content class that used to record file data when parsing FDF
-#
-# May raise Exception when opening file.
-#
-class FileProfile :
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName):
-        self.FileLinesList = []
-        try:
-            fsock = open(FileName, "rb", 0)
-            try:
-                self.FileLinesList = fsock.readlines()
-            finally:
-                fsock.close()
-
-        except IOError:
-            raise Warning("Error when opening file %s" % FileName)
-        
-        self.PcdDict = {}
-        self.InfList = []
-        
-        self.PcdFileLineDict = {}
-        self.InfFileLineList = []
-        
-        self.FdDict = {}
-        self.FvDict = {}
-        self.CapsuleList = []
-#        self.VtfList = []
-#        self.RuleDict = {}
-
-## The syntax parser for FDF
-#
-# PreprocessFile method should be called prior to ParseFile
-# CycleReferenceCheck method can detect cycles in FDF contents
-#
-# GetNext*** procedures mean these procedures will get next token first, then make judgement.
-# Get*** procedures mean these procedures will make judgement on current token only.
-#        
-class FdfParser(object):
-    ## The constructor
-    #
-    #   @param  self        The object pointer
-    #   @param  FileName    The file that to be parsed
-    #
-    def __init__(self, FileName):
-        self.Profile = FileProfile(FileName)
-        self.FileName = FileName
-        self.CurrentLineNumber = 1
-        self.CurrentOffsetWithinLine = 0
-        self.CurrentFdName = None
-        self.CurrentFvName = None
-        self.__Token = ""
-        self.__SkippedChars = ""
-        
-        self.__WipeOffArea = []
-
-    ## __SkipWhiteSpace() method
-    #
-    #   Skip white spaces from current char, return number of chars skipped
-    #
-    #   @param  self        The object pointer
-    #   @retval Count       The number of chars skipped
-    #
-    def __SkipWhiteSpace(self):
-        Count = 0
-        while not self.__EndOfFile():
-            Count += 1
-            if self.__CurrentChar() in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_LF, T_CHAR_SPACE, T_CHAR_TAB):
-                self.__SkippedChars += str(self.__CurrentChar())
-                self.__GetOneChar()
-
-            else:
-                Count = Count - 1
-                return Count
-
-    ## __EndOfFile() method
-    #
-    #   Judge current buffer pos is at file end
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Current File buffer position is at file end
-    #   @retval False       Current File buffer position is NOT at file end
-    #
-    def __EndOfFile(self):
-        NumberOfLines = len(self.Profile.FileLinesList)
-        SizeOfLastLine = len(self.Profile.FileLinesList[-1])
-        if self.CurrentLineNumber == NumberOfLines and self.CurrentOffsetWithinLine >= SizeOfLastLine - 1:
-            return True
-        elif self.CurrentLineNumber > NumberOfLines:
-            return True
-        else:
-            return False
-
-    ## __EndOfLine() method
-    #
-    #   Judge current buffer pos is at line end
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Current File buffer position is at line end
-    #   @retval False       Current File buffer position is NOT at line end
-    #
-    def __EndOfLine(self):
-        if self.CurrentLineNumber > len(self.Profile.FileLinesList):
-            return True
-        SizeOfCurrentLine = len(self.Profile.FileLinesList[self.CurrentLineNumber - 1])
-        if self.CurrentOffsetWithinLine >= SizeOfCurrentLine:
-            return True
-        else:
-            return False
-    
-    ## Rewind() method
-    #
-    #   Reset file data buffer to the initial state
-    #
-    #   @param  self        The object pointer
-    #
-    def Rewind(self):
-        self.CurrentLineNumber = 1
-        self.CurrentOffsetWithinLine = 0
-    
-    ## __UndoOneChar() method
-    #
-    #   Go back one char in the file buffer
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully go back one char
-    #   @retval False       Not able to go back one char as file beginning reached
-    #    
-    def __UndoOneChar(self):
-        
-        if self.CurrentLineNumber == 1 and self.CurrentOffsetWithinLine == 0:
-            return False
-        elif self.CurrentOffsetWithinLine == 0:
-            self.CurrentLineNumber -= 1
-            self.CurrentOffsetWithinLine = len(self.__CurrentLine()) - 1
-        else:
-            self.CurrentOffsetWithinLine -= 1
-        return True
-        
-    ## __GetOneChar() method
-    #
-    #   Move forward one char in the file buffer
-    #
-    #   @param  self        The object pointer
-    #  
-    def __GetOneChar(self):
-        if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:
-            self.CurrentLineNumber += 1
-            self.CurrentOffsetWithinLine = 0
-        else:
-            self.CurrentOffsetWithinLine += 1
-
-    ## __CurrentChar() method
-    #
-    #   Get the char pointed to by the file buffer pointer
-    #
-    #   @param  self        The object pointer
-    #   @retval Char        Current char
-    #  
-    def __CurrentChar(self):
-        return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine]
-    
-    ## __NextChar() method
-    #
-    #   Get the one char pass the char pointed to by the file buffer pointer
-    #
-    #   @param  self        The object pointer
-    #   @retval Char        Next char
-    #
-    def __NextChar(self):
-        if self.CurrentOffsetWithinLine == len(self.Profile.FileLinesList[self.CurrentLineNumber - 1]) - 1:
-            return self.Profile.FileLinesList[self.CurrentLineNumber][0]
-        else:
-            return self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine + 1]
-        
-    ## __SetCurrentCharValue() method
-    #
-    #   Modify the value of current char
-    #
-    #   @param  self        The object pointer
-    #   @param  Value       The new value of current char
-    #
-    def __SetCurrentCharValue(self, Value):
-        self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine] = Value
-        
-    ## __CurrentLine() method
-    #
-    #   Get the list that contains current line contents
-    #
-    #   @param  self        The object pointer
-    #   @retval List        current line contents
-    #
-    def __CurrentLine(self):
-        return self.Profile.FileLinesList[self.CurrentLineNumber - 1]
-        
-    def __StringToList(self):
-        self.Profile.FileLinesList = [list(s) for s in self.Profile.FileLinesList]
-        self.Profile.FileLinesList[-1].append(' ')
-
-    def __ReplaceMacros(self, Str, File, Line):
-        MacroEnd = 0
-        while Str.find('$(', MacroEnd) >= 0:
-            MacroStart = Str.find('$(', MacroEnd)
-            if Str.find(')', MacroStart) > 0:
-                MacroEnd = Str.find(')', MacroStart)
-                Name = Str[MacroStart + 2 : MacroEnd]
-                Value = None
-                if Name in InputMacroDict:
-                    Value = InputMacroDict[Name]
-                   
-                else:
-                    for Profile in AllMacroList:
-                        if Profile.FileName == File and Profile.MacroName == Name and Profile.DefinedAtLine <= Line:
-                            Value = Profile.MacroValue
-                            
-                if Value is not None:
-                    Str = Str.replace('$(' + Name + ')', Value)
-                    MacroEnd = MacroStart + len(Value) 
-                
-            else:
-                raise Warning("Macro not complete At Line ", self.FileName, self.CurrentLineNumber)
-        return Str
-
-    def __ReplaceFragment(self, StartPos, EndPos, Value=' '):
-        if StartPos[0] == EndPos[0]:
-            Offset = StartPos[1]
-            while Offset <= EndPos[1]:
-                self.Profile.FileLinesList[StartPos[0]][Offset] = Value
-                Offset += 1
-            return
-        
-        Offset = StartPos[1]
-        while self.Profile.FileLinesList[StartPos[0]][Offset] not in ('\r', '\n'):
-            self.Profile.FileLinesList[StartPos[0]][Offset] = Value
-            Offset += 1
-        
-        Line = StartPos[0]
-        while Line < EndPos[0]:
-            Offset = 0
-            while self.Profile.FileLinesList[Line][Offset] not in ('\r', '\n'):
-                self.Profile.FileLinesList[Line][Offset] = Value
-                Offset += 1
-            Line += 1
-            
-        Offset = 0
-        while Offset <= EndPos[1]:
-            self.Profile.FileLinesList[EndPos[0]][Offset] = Value
-            Offset += 1
-
-
-    def __GetMacroName(self):
-        if not self.__GetNextToken():
-            raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)
-        MacroName = self.__Token
-        NotFlag = False
-        if MacroName.startswith('!'):
-            NotFlag = True
-            MacroName = MacroName[1:].strip()
-         
-        if not MacroName.startswith('$(') or not MacroName.endswith(')'):
-            raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},
-                          self.FileName, self.CurrentLineNumber)
-        MacroName = MacroName[2:-1]
-        return MacroName, NotFlag
-    
-    ## PreprocessFile() method
-    #
-    #   Preprocess file contents, replace comments with spaces.
-    #   In the end, rewind the file buffer pointer to the beginning
-    #   BUGBUG: No !include statement processing contained in this procedure
-    #   !include statement should be expanded at the same FileLinesList[CurrentLineNumber - 1]
-    #
-    #   @param  self        The object pointer
-    #   
-    def PreprocessFile(self):
-        
-        self.Rewind()
-        InComment = False
-        DoubleSlashComment = False
-        HashComment = False
-        # HashComment in quoted string " " is ignored.
-        InString = False    
-        
-        while not self.__EndOfFile():
-            
-            if self.__CurrentChar() == T_CHAR_DOUBLE_QUOTE and not InComment:
-                InString = not InString
-            # meet new line, then no longer in a comment for // and '#'
-            if self.__CurrentChar() == T_CHAR_LF:
-                self.CurrentLineNumber += 1
-                self.CurrentOffsetWithinLine = 0
-                if InComment and DoubleSlashComment:
-                    InComment = False
-                    DoubleSlashComment = False
-                if InComment and HashComment:
-                    InComment = False
-                    HashComment = False
-            # check for */ comment end
-            elif InComment and not DoubleSlashComment and not HashComment and self.__CurrentChar() == T_CHAR_STAR and self.__NextChar() == T_CHAR_SLASH:
-                self.__SetCurrentCharValue(T_CHAR_SPACE)
-                self.__GetOneChar()
-                self.__SetCurrentCharValue(T_CHAR_SPACE)
-                self.__GetOneChar()
-                InComment = False
-            # set comments to spaces
-            elif InComment:
-                self.__SetCurrentCharValue(T_CHAR_SPACE)
-                self.__GetOneChar()
-            # check for // comment
-            elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_SLASH and not self.__EndOfLine():
-                InComment = True
-                DoubleSlashComment = True
-            # check for '#' comment
-            elif self.__CurrentChar() == T_CHAR_HASH and not self.__EndOfLine() and not InString:
-                InComment = True
-                HashComment = True
-            # check for /* comment start
-            elif self.__CurrentChar() == T_CHAR_SLASH and self.__NextChar() == T_CHAR_STAR:
-                self.__SetCurrentCharValue( T_CHAR_SPACE)
-                self.__GetOneChar()
-                self.__SetCurrentCharValue( T_CHAR_SPACE)
-                self.__GetOneChar()
-                InComment = True
-            else:
-                self.__GetOneChar()
-        
-        # restore from ListOfList to ListOfString
-        self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]
-        self.Rewind()
-
-    ## PreprocessIncludeFile() method
-    #
-    #   Preprocess file contents, replace !include statements with file contents.
-    #   In the end, rewind the file buffer pointer to the beginning
-    #
-    #   @param  self        The object pointer
-    #   
-    def PreprocessIncludeFile(self):
-        
-        while self.__GetNextToken():
-            
-            if self.__Token == '!include':
-                IncludeLine = self.CurrentLineNumber
-                IncludeOffset = self.CurrentOffsetWithinLine - len('!include')
-                if not self.__GetNextToken():
-                    raise Warning("expected include file name At Line ", self.FileName, self.CurrentLineNumber)
-                IncFileName = self.__Token
-                if not os.path.isabs(IncFileName):
-                    if IncFileName.startswith('$(WORKSPACE)'):
-                        Str = mws.handleWsMacro(IncFileName)
-                        Str = Str.replace('$(WORKSPACE)', os.environ.get('WORKSPACE'))
-                        if os.path.exists(Str):
-                            if not os.path.isabs(Str):
-                                Str = os.path.abspath(Str)
-                        IncFileName = Str
-                    else:
-                        # file is in the same dir with FDF file
-                        FullFdf = self.FileName
-                        if not os.path.isabs(self.FileName):
-                            FullFdf = mws.join(os.environ.get('WORKSPACE'), self.FileName)
-                
-                        IncFileName = os.path.join(os.path.dirname(FullFdf), IncFileName)
-                    
-                if not os.path.exists(os.path.normpath(IncFileName)):
-                    raise Warning("Include file not exists At Line ", self.FileName, self.CurrentLineNumber)
-                
-                IncFileProfile = IncludeFileProfile(os.path.normpath(IncFileName))
-                
-                CurrentLine = self.CurrentLineNumber
-                CurrentOffset = self.CurrentOffsetWithinLine
-                # list index of the insertion, note that line number is 'CurrentLine + 1'
-                InsertAtLine = CurrentLine
-                IncFileProfile.InsertStartLineNumber = InsertAtLine + 1
-                # deal with remaining portions after "!include filename", if exists.
-                if self.__GetNextToken():
-                    if self.CurrentLineNumber == CurrentLine:
-                        RemainingLine = self.__CurrentLine()[CurrentOffset:]
-                        self.Profile.FileLinesList.insert(self.CurrentLineNumber, RemainingLine)
-                        IncFileProfile.InsertAdjust += 1
-                        self.CurrentLineNumber += 1
-                        self.CurrentOffsetWithinLine = 0
-                
-                for Line in IncFileProfile.FileLinesList:
-                    self.Profile.FileLinesList.insert(InsertAtLine, Line)
-                    self.CurrentLineNumber += 1
-                    InsertAtLine += 1    
-                
-                IncludeFileList.append(IncFileProfile)
-                
-                # comment out the processed include file statement
-                TempList = list(self.Profile.FileLinesList[IncludeLine - 1])
-                TempList.insert(IncludeOffset, '#')
-                self.Profile.FileLinesList[IncludeLine - 1] = ''.join(TempList)
-                
-        self.Rewind()
-
-    ## PreprocessIncludeFile() method
-    #
-    #   Preprocess file contents, replace !include statements with file contents.
-    #   In the end, rewind the file buffer pointer to the beginning
-    #
-    #   @param  self        The object pointer
-    #   
-    def PreprocessConditionalStatement(self):
-        # IfList is a stack of if branches with elements of list [Pos, CondSatisfied, BranchDetermined]
-        IfList = []
-        while self.__GetNextToken():
-            if self.__Token == 'DEFINE':
-                DefineLine = self.CurrentLineNumber - 1
-                DefineOffset = self.CurrentOffsetWithinLine - len('DEFINE')
-                if not self.__GetNextToken():
-                    raise Warning("expected Macro name At Line ", self.FileName, self.CurrentLineNumber)
-                Macro = self.__Token
-                if not self.__IsToken( "="):
-                    raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-                if not self.__GetNextToken():
-                    raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                
-                if self.__GetStringData():
-                    pass
-                Value = self.__Token
-                if not Macro in InputMacroDict:
-                    FileLineTuple = GetRealFileLine(self.FileName, DefineLine + 1)
-                    MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])
-                    MacProfile.MacroName = Macro
-                    MacProfile.MacroValue = Value
-                    AllMacroList.append(MacProfile)
-                self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-            
-            elif self.__Token in ('!ifdef', '!ifndef', '!if'):
-                IfStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))
-                IfList.append([IfStartPos, None, None])
-                CondLabel = self.__Token
-                
-                MacroName, NotFlag = self.__GetMacroName() 
-                NotDefineFlag = False
-                if CondLabel == '!ifndef':
-                    NotDefineFlag = True
-                if CondLabel == '!ifdef' or CondLabel == '!ifndef':
-                    if NotFlag:
-                        raise Warning("'NOT' operation not allowed for Macro name At Line ", self.FileName, self.CurrentLineNumber)
-                    
-                if CondLabel == '!if':
-                        
-                    if not self.__GetNextOp():
-                        raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)
-                    
-                    if self.__Token in ('!=', '==', '>', '<', '>=', '<='):
-                        Op = self.__Token
-                        if not self.__GetNextToken():
-                            raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                        if self.__GetStringData():
-                            pass
-                        MacroValue = self.__Token
-                        ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)
-                        if NotFlag:
-                            ConditionSatisfied = not ConditionSatisfied
-                        BranchDetermined = ConditionSatisfied
-                    else:
-                        self.CurrentOffsetWithinLine -= len(self.__Token)                        
-                        ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')
-                        if NotFlag:
-                            ConditionSatisfied = not ConditionSatisfied
-                        BranchDetermined = ConditionSatisfied
-                    IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]
-                    if ConditionSatisfied:
-                        self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                        
-                else:
-                    ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1)
-                    if NotDefineFlag:
-                        ConditionSatisfied = not ConditionSatisfied
-                    BranchDetermined = ConditionSatisfied
-                    IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]
-                    if ConditionSatisfied:
-                        self.__WipeOffArea.append((IfStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                    
-            elif self.__Token in ('!elseif', '!else'):
-                ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))
-                if len(IfList) <= 0:
-                    raise Warning("Missing !if statement At Line ", self.FileName, self.CurrentLineNumber)
-                if IfList[-1][1]:
-                    IfList[-1] = [ElseStartPos, False, True]
-                    self.__WipeOffArea.append((ElseStartPos, (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                else:
-                    self.__WipeOffArea.append((IfList[-1][0], ElseStartPos))
-                    IfList[-1] = [ElseStartPos, True, IfList[-1][2]]
-                    if self.__Token == '!elseif':
-                        MacroName, NotFlag = self.__GetMacroName() 
-                        if not self.__GetNextOp():
-                            raise Warning("expected !endif At Line ", self.FileName, self.CurrentLineNumber)
-                    
-                        if self.__Token in ('!=', '==', '>', '<', '>=', '<='):
-                            Op = self.__Token
-                            if not self.__GetNextToken():
-                                raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                            if self.__GetStringData():
-                                pass
-                            MacroValue = self.__Token
-                            ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, Op, MacroValue)
-                            if NotFlag:
-                                ConditionSatisfied = not ConditionSatisfied
-
-                        else:
-                            self.CurrentOffsetWithinLine -= len(self.__Token)                        
-                            ConditionSatisfied = self.__EvaluateConditional(MacroName, IfList[-1][0][0] + 1, None, 'Bool')
-                            if NotFlag:
-                                ConditionSatisfied = not ConditionSatisfied
-
-                        IfList[-1] = [IfList[-1][0], ConditionSatisfied, IfList[-1][2]]
-                    
-                    if IfList[-1][1]:
-                        if IfList[-1][2]:
-                            IfList[-1][1] = False
-                        else:
-                            IfList[-1][2] = True
-                            self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-
-                
-            elif self.__Token == '!endif':
-                if IfList[-1][1]:
-                    self.__WipeOffArea.append(((self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len('!endif')), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                else:
-                    self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))
-                
-                IfList.pop()
-                
-                    
-        if len(IfList) > 0:
-            raise Warning("Missing !endif At Line ", self.FileName, self.CurrentLineNumber)
-        self.Rewind()
-
-    def __EvaluateConditional(self, Name, Line, Op = None, Value = None):
-        
-        FileLineTuple = GetRealFileLine(self.FileName, Line)
-        if Name in InputMacroDict:
-            MacroValue = InputMacroDict[Name]
-            if Op is None:
-                if Value == 'Bool' and MacroValue is None or MacroValue.upper() == 'FALSE':
-                    return False
-                return True
-            elif Op == '!=':
-                if Value != MacroValue:
-                    return True
-                else:
-                    return False
-            elif Op == '==':
-                if Value == MacroValue:
-                    return True
-                else:
-                    return False
-            else:
-                if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(MacroValue) or (MacroValue is not None and MacroValue.isdigit())):
-                    InputVal = long(Value, 0)
-                    MacroVal = long(MacroValue, 0)
-                    if Op == '>':
-                        if MacroVal > InputVal:
-                            return True
-                        else:
-                            return False
-                    elif Op == '>=':
-                        if MacroVal >= InputVal:
-                            return True
-                        else:
-                            return False
-                    elif Op == '<':
-                        if MacroVal < InputVal:
-                            return True
-                        else:
-                            return False
-                    elif Op == '<=':
-                        if MacroVal <= InputVal:
-                            return True
-                        else:
-                            return False
-                    else:
-                        return False
-                else:
-                    raise Warning("Value %s is not a number At Line ", self.FileName, Line)
-                
-        for Profile in AllMacroList:
-            if Profile.FileName == FileLineTuple[0] and Profile.MacroName == Name and Profile.DefinedAtLine <= FileLineTuple[1]:
-                if Op is None:
-                    if Value == 'Bool' and Profile.MacroValue is None or Profile.MacroValue.upper() == 'FALSE':
-                        return False
-                    return True
-                elif Op == '!=':
-                    if Value != Profile.MacroValue:
-                        return True
-                    else:
-                        return False
-                elif Op == '==':
-                    if Value == Profile.MacroValue:
-                        return True
-                    else:
-                        return False
-                else:
-                    if (self.__IsHex(Value) or Value.isdigit()) and (self.__IsHex(Profile.MacroValue) or (Profile.MacroValue is not None and Profile.MacroValue.isdigit())):
-                        InputVal = long(Value, 0)
-                        MacroVal = long(Profile.MacroValue, 0)
-                        if Op == '>':
-                            if MacroVal > InputVal:
-                                return True
-                            else:
-                                return False
-                        elif Op == '>=':
-                            if MacroVal >= InputVal:
-                                return True
-                            else:
-                                return False
-                        elif Op == '<':
-                            if MacroVal < InputVal:
-                                return True
-                            else:
-                                return False
-                        elif Op == '<=':
-                            if MacroVal <= InputVal:
-                                return True
-                            else:
-                                return False
-                        else:
-                            return False
-                    else:
-                        raise Warning("Value %s is not a number At Line ", self.FileName, Line)
-        
-        return False
-
-    ## __IsToken() method
-    #
-    #   Check whether input string is found from current char position along
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @param  String      The string to search
-    #   @param  IgnoreCase  Indicate case sensitive/non-sensitive search, default is case sensitive
-    #   @retval True        Successfully find string, file buffer pointer moved forward
-    #   @retval False       Not able to find string, file buffer pointer not changed
-    #
-    def __IsToken(self, String, IgnoreCase = False):
-        self.__SkipWhiteSpace()
-
-        # Only consider the same line, no multi-line token allowed
-        StartPos = self.CurrentOffsetWithinLine
-        index = -1
-        if IgnoreCase:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) 
-        else:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)
-        if index == 0:
-            self.CurrentOffsetWithinLine += len(String)
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-        return False
-
-    ## __IsKeyword() method
-    #
-    #   Check whether input keyword is found from current char position along, whole word only!
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @param  Keyword     The string to search
-    #   @param  IgnoreCase  Indicate case sensitive/non-sensitive search, default is case sensitive
-    #   @retval True        Successfully find string, file buffer pointer moved forward
-    #   @retval False       Not able to find string, file buffer pointer not changed
-    #
-    def __IsKeyword(self, KeyWord, IgnoreCase = False):
-        self.__SkipWhiteSpace()
-
-        # Only consider the same line, no multi-line token allowed
-        StartPos = self.CurrentOffsetWithinLine
-        index = -1
-        if IgnoreCase:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(KeyWord.upper()) 
-        else:
-            index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(KeyWord)
-        if index == 0:
-            followingChar = self.__CurrentLine()[self.CurrentOffsetWithinLine + len(KeyWord)]
-            if not str(followingChar).isspace() and followingChar not in SEPERATOR_TUPLE:
-                return False
-            self.CurrentOffsetWithinLine += len(KeyWord)
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-        return False
-
-    ## __GetNextWord() method
-    #
-    #   Get next C name from file lines
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a C name string, file buffer pointer moved forward
-    #   @retval False       Not able to find a C name string, file buffer pointer not changed
-    #
-    def __GetNextWord(self):
-        self.__SkipWhiteSpace()
-        if self.__EndOfFile():
-            return False
-        
-        TempChar = self.__CurrentChar()
-        StartPos = self.CurrentOffsetWithinLine
-        if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_':
-            self.__GetOneChar()
-            while not self.__EndOfLine():
-                TempChar = self.__CurrentChar()
-                if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \
-                or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-':
-                    self.__GetOneChar()
-                    
-                else:
-                    break
-
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-            
-        return False
-    
-    ## __GetNextToken() method
-    #
-    #   Get next token unit before a seperator
-    #   If found, the string value is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a token unit, file buffer pointer moved forward
-    #   @retval False       Not able to find a token unit, file buffer pointer not changed
-    #
-    def __GetNextToken(self):
-        # Skip leading spaces, if exist.
-        self.__SkipWhiteSpace()
-        if self.__EndOfFile():
-            return False
-        # Record the token start position, the position of the first non-space char.
-        StartPos = self.CurrentOffsetWithinLine
-        StartLine = self.CurrentLineNumber
-        while not self.__EndOfLine():
-            TempChar = self.__CurrentChar()
-            # Try to find the end char that is not a space and not in seperator tuple.
-            # That is, when we got a space or any char in the tuple, we got the end of token.
-            if not str(TempChar).isspace() and TempChar not in SEPERATOR_TUPLE:
-                self.__GetOneChar()
-            # if we happen to meet a seperator as the first char, we must proceed to get it.
-            # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
-            elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:
-                self.__GetOneChar()
-                break
-            else:
-                break
-#        else:
-#            return False
-
-        EndPos = self.CurrentOffsetWithinLine
-        if self.CurrentLineNumber != StartLine:
-            EndPos = len(self.Profile.FileLinesList[StartLine-1])
-        self.__Token = self.Profile.FileLinesList[StartLine-1][StartPos : EndPos]
-        if StartPos != self.CurrentOffsetWithinLine:
-            return True
-        else:
-            return False
-    
-    def __GetNextOp(self):
-        # Skip leading spaces, if exist.
-        self.__SkipWhiteSpace()
-        if self.__EndOfFile():
-            return False
-        # Record the token start position, the position of the first non-space char.
-        StartPos = self.CurrentOffsetWithinLine
-        while not self.__EndOfLine():
-            TempChar = self.__CurrentChar()
-            # Try to find the end char that is not a space
-            if not str(TempChar).isspace():
-                self.__GetOneChar()
-            else:
-                break
-        else:
-            return False
-        
-        if StartPos != self.CurrentOffsetWithinLine:
-            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]
-            return True
-        else:
-            return False
-    ## __GetNextGuid() method
-    #
-    #   Get next token unit before a seperator
-    #   If found, the GUID string is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a registry format GUID, file buffer pointer moved forward
-    #   @retval False       Not able to find a registry format GUID, file buffer pointer not changed
-    #
-    def __GetNextGuid(self):
-        
-        if not self.__GetNextToken():
-            return False
-        if gGuidPattern.match(self.__Token) is not None:
-            return True
-        else:
-            self.__UndoToken()
-            return False
-
-    ## __UndoToken() method
-    #
-    #   Go back one token unit in file buffer
-    #
-    #   @param  self        The object pointer
-    #
-    def __UndoToken(self):
-        self.__UndoOneChar()
-        while self.__CurrentChar().isspace():
-            if not self.__UndoOneChar():
-                self.__GetOneChar()
-                return
-        
-        
-        StartPos = self.CurrentOffsetWithinLine
-        CurrentLine = self.CurrentLineNumber
-        while CurrentLine == self.CurrentLineNumber:
-            
-            TempChar = self.__CurrentChar()
-            # Try to find the end char that is not a space and not in seperator tuple.
-            # That is, when we got a space or any char in the tuple, we got the end of token.
-            if not str(TempChar).isspace() and not TempChar in SEPERATOR_TUPLE:
-                if not self.__UndoOneChar():
-                    break
-            # if we happen to meet a seperator as the first char, we must proceed to get it.
-            # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.
-            elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPERATOR_TUPLE:
-                return
-            else:
-                break
-            
-        self.__GetOneChar()
-    
-    def __IsHex(self, HexStr):
-        if not HexStr.upper().startswith("0X"):
-            return False
-        if len(self.__Token) <= 2:
-            return False
-        return True if all(x in string.hexdigits for x in HexStr[2:]) else False
-
-    ## __GetNextHexNumber() method
-    #
-    #   Get next HEX data before a seperator
-    #   If found, the HEX data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a HEX data, file buffer pointer moved forward
-    #   @retval False       Not able to find a HEX data, file buffer pointer not changed
-    #
-    def __GetNextHexNumber(self):
-        if not self.__GetNextToken():
-            return False
-        if self.__IsHex(self.__Token):
-            return True
-        else:
-            self.__UndoToken()
-            return False
-        
-    ## __GetNextDecimalNumber() method
-    #
-    #   Get next decimal data before a seperator
-    #   If found, the decimal data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a decimal data, file buffer pointer moved forward
-    #   @retval False       Not able to find a decimal data, file buffer pointer not changed
-    #
-    def __GetNextDecimalNumber(self):
-        if not self.__GetNextToken():
-            return False
-        if self.__Token.isdigit():
-            return True
-        else:
-            self.__UndoToken()
-            return False
-    
-    ## __GetNextPcdName() method
-    #
-    #   Get next PCD token space C name and PCD C name pair before a seperator
-    #   If found, the decimal data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval Tuple       PCD C name and PCD token space C name pair 
-    #
-    def __GetNextPcdName(self):
-        if not self.__GetNextWord():
-            raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)
-        pcdTokenSpaceCName = self.__Token
-        
-        if not self.__IsToken( "."):
-            raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextWord():
-            raise Warning("expected PcdTokenSpaceCName.PcdCName At Line ", self.FileName, self.CurrentLineNumber)
-        pcdCName = self.__Token
-        
-        return (pcdCName, pcdTokenSpaceCName) 
-            
-    ## __GetStringData() method
-    #
-    #   Get string contents quoted in ""
-    #   If found, the decimal data is put into self.__Token
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a string data, file buffer pointer moved forward
-    #   @retval False       Not able to find a string data, file buffer pointer not changed
-    #    
-    def __GetStringData(self):
-        if self.__Token.startswith("\"") or self.__Token.startswith("L\""):
-            self.__UndoToken()
-            self.__SkipToToken("\"")
-            currentLineNumber = self.CurrentLineNumber
-            
-            if not self.__SkipToToken("\""):
-                raise Warning("Missing Quote \" for String At Line ", self.FileName, self.CurrentLineNumber)
-            if currentLineNumber != self.CurrentLineNumber:
-                raise Warning("Missing Quote \" for String At Line ", self.FileName, self.CurrentLineNumber)
-            self.__Token = self.__SkippedChars.rstrip('\"')
-            return True
-        
-        elif self.__Token.startswith("\'") or self.__Token.startswith("L\'"):
-            self.__UndoToken()
-            self.__SkipToToken("\'")
-            currentLineNumber = self.CurrentLineNumber
-            
-            if not self.__SkipToToken("\'"):
-                raise Warning("Missing Quote \' for String At Line ", self.FileName, self.CurrentLineNumber)
-            if currentLineNumber != self.CurrentLineNumber:
-                raise Warning("Missing Quote \' for String At Line ", self.FileName, self.CurrentLineNumber)
-            self.__Token = self.__SkippedChars.rstrip('\'')
-            return True
-        
-        else:
-            return False
-            
-    ## __SkipToToken() method
-    #
-    #   Search forward in file buffer for the string
-    #   The skipped chars are put into self.__SkippedChars
-    #
-    #   @param  self        The object pointer
-    #   @param  String      The string to search
-    #   @param  IgnoreCase  Indicate case sensitive/non-sensitive search, default is case sensitive
-    #   @retval True        Successfully find the string, file buffer pointer moved forward
-    #   @retval False       Not able to find the string, file buffer pointer not changed
-    #
-    def __SkipToToken(self, String, IgnoreCase = False):
-        StartPos = self.GetFileBufferPos()
-        
-        self.__SkippedChars = ""
-        while not self.__EndOfFile():
-            index = -1
-            if IgnoreCase:
-                index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].upper().find(String.upper()) 
-            else:
-                index = self.__CurrentLine()[self.CurrentOffsetWithinLine : ].find(String)
-            if index == 0:
-                self.CurrentOffsetWithinLine += len(String)
-                self.__SkippedChars += String
-                return True
-            self.__SkippedChars += str(self.__CurrentChar())
-            self.__GetOneChar()
-            
-        self.SetFileBufferPos( StartPos)
-        self.__SkippedChars = ""
-        return False
-
-    ## GetFileBufferPos() method
-    #
-    #   Return the tuple of current line and offset within the line
-    #
-    #   @param  self        The object pointer
-    #   @retval Tuple       Line number and offset pair 
-    #
-    def GetFileBufferPos(self):
-        return (self.CurrentLineNumber, self.CurrentOffsetWithinLine)
-    
-    ## SetFileBufferPos() method
-    #
-    #   Restore the file buffer position
-    #
-    #   @param  self        The object pointer
-    #   @param  Pos         The new file buffer position
-    #
-    def SetFileBufferPos(self, Pos):
-        (self.CurrentLineNumber, self.CurrentOffsetWithinLine) = Pos
-            
-    ## ParseFile() method
-    #
-    #   Parse the file profile buffer to extract fd, fv ... information
-    #   Exception will be raised if syntax error found
-    #
-    #   @param  self        The object pointer
-    #
-    def ParseFile(self):
-
-        try:
-            self.__StringToList()
-            self.PreprocessFile()
-            self.PreprocessIncludeFile()
-            self.__StringToList()
-            self.PreprocessFile()
-            self.PreprocessConditionalStatement()
-            self.__StringToList()
-            for Pos in self.__WipeOffArea:
-                self.__ReplaceFragment(Pos[0], Pos[1])
-            self.Profile.FileLinesList = ["".join(list) for list in self.Profile.FileLinesList]
-            
-            while self.__GetDefines():
-                pass
-            
-            Index = 0
-            while Index < len(self.Profile.FileLinesList):
-                FileLineTuple = GetRealFileLine(self.FileName, Index + 1)
-                self.Profile.FileLinesList[Index] = self.__ReplaceMacros(self.Profile.FileLinesList[Index], FileLineTuple[0], FileLineTuple[1])
-                Index += 1
-                
-            while self.__GetFd():
-                pass
-
-            while self.__GetFv():
-                pass
-
-            while self.__GetCapsule():
-                pass
-
-#            while self.__GetVtf():
-#                pass
-#
-#            while self.__GetRule():
-#                pass
-            
-
-        except Warning, X:
-            self.__UndoToken()
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            X.message += '\nGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \
-                'Previous Token: \"%s\" At line: %d, Offset Within Line: %d\n' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :].rstrip('\n').rstrip('\r'), FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise
-
-    ## __GetDefines() method
-    #
-    #   Get Defines section contents and store its data into AllMacrosList
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a Defines
-    #   @retval False       Not able to find a Defines
-    #
-    def __GetDefines(self):
-
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[DEFINES"):
-            if not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \
-                and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[DEFINES", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-            #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)
-
-        while self.__GetNextWord():
-            Macro = self.__Token
-            
-            if not self.__IsToken("="):
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken() or self.__Token.startswith('['):
-                raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)
-            Value = self.__Token
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            MacProfile = MacroProfile(FileLineTuple[0], FileLineTuple[1])
-            MacProfile.MacroName = Macro
-            MacProfile.MacroValue = Value
-            AllMacroList.append(MacProfile)
-
-        return False
-
-    ## __GetFd() method
-    #
-    #   Get FD section contents and store its data into FD dictionary of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a FD
-    #   @retval False       Not able to find a FD
-    #
-    def __GetFd(self):
-
-        if not self.__GetNextToken():
-            return False
-        
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[FD."):
-            if not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \
-                and not S.startswith("[VTF.") and not S.startswith("[RULE."):
-                raise Warning("Unknown section At Line ", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-        
-        self.__UndoToken()
-        if not self.__IsToken("[FD.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [FD.] At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FdName = self.__GetUiName()
-        self.CurrentFdName = FdName.upper()
-        
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FdObj = CommonDataClass.FdfClass.FDClassObject()
-        FdObj.FdUiName = self.CurrentFdName
-        self.Profile.FdDict[self.CurrentFdName] = FdObj
-        Status = self.__GetCreateFile(FdObj)
-        if not Status:
-            raise Warning("FD name error At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetTokenStatements(FdObj):
-            return False
-        
-        self.__GetDefineStatements(FdObj)
-
-        self.__GetSetStatements(FdObj)
-
-        if not self.__GetRegionLayout(FdObj):
-            raise Warning("expected region layout At Line ", self.FileName, self.CurrentLineNumber)
-            
-        while self.__GetRegionLayout(FdObj):
-            pass
-        return True
-    
-    ## __GetUiName() method
-    #
-    #   Return the UI name of a section
-    #
-    #   @param  self        The object pointer
-    #   @retval FdName      UI name
-    #
-    def __GetUiName(self):
-        FdName = ""
-        if self.__GetNextWord():
-            FdName = self.__Token
-            
-        return FdName
-
-    ## __GetCreateFile() method
-    #
-    #   Return the output file name of object
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         object whose data will be stored in file
-    #   @retval FdName      UI name
-    #
-    def __GetCreateFile(self, Obj):
-
-        if self.__IsKeyword( "CREATE_FILE"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextToken():
-                raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)
-                
-            FileName = self.__Token
-            Obj.CreateFileName = FileName
-
-        return True
-
-    ## __GetTokenStatements() method
-    #
-    #   Get token statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom token statement is got
-    #   @retval True        Successfully find a token statement
-    #   @retval False       Not able to find a token statement
-    #
-    def __GetTokenStatements(self, Obj):
-        if not self.__IsKeyword( "BaseAddress"):
-            raise Warning("BaseAddress missing At Line ", self.FileName, self.CurrentLineNumber)
-           
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Hex base address At Line ", self.FileName, self.CurrentLineNumber)
-            
-        Obj.BaseAddress = self.__Token
-        
-        if self.__IsToken( "|"):
-            pcdPair = self.__GetNextPcdName()
-            Obj.BaseAddressPcd = pcdPair
-            self.Profile.PcdDict[pcdPair] = long(Obj.BaseAddress, 0)
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple
-            
-        if not self.__IsKeyword( "Size"):
-            raise Warning("Size missing At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Hex size At Line ", self.FileName, self.CurrentLineNumber)
-            
-      
-        Obj.Size = long(self.__Token, 0)
-
-        if self.__IsToken( "|"):
-            pcdPair = self.__GetNextPcdName()
-            Obj.SizePcd = pcdPair
-            self.Profile.PcdDict[pcdPair] = Obj.Size
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple
-                    
-        if not self.__IsKeyword( "ErasePolarity"):
-            raise Warning("ErasePolarity missing At Line ", self.FileName, self.CurrentLineNumber)
-           
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextToken():
-            raise Warning("expected Erase Polarity At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if self.__Token != "1" and self.__Token != "0":
-            raise Warning("expected 1 or 0 Erase Polarity At Line ", self.FileName, self.CurrentLineNumber)
-            
-        Obj.ErasePolarity = self.__Token
-
-        Status = self.__GetBlockStatements(Obj)
-        return Status
-    
-    ## __GetAddressStatements() method
-    #
-    #   Get address statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom address statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetAddressStatements(self, Obj):
-        
-        if self.__IsKeyword("BsBaseAddress"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():
-                raise Warning("expected address At Line ", self.FileName, self.CurrentLineNumber)
-                
-            BsAddress = long(self.__Token, 0)
-            Obj.BsBaseAddress = BsAddress
-            
-        if self.__IsKeyword("RtBaseAddress"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():
-                raise Warning("expected address At Line ", self.FileName, self.CurrentLineNumber)
-                
-            RtAddress = long(self.__Token, 0)
-            Obj.RtBaseAddress = RtAddress
-    
-    ## __GetBlockStatements() method
-    #
-    #   Get block statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom block statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetBlockStatements(self, Obj):
-        
-        if not self.__GetBlockStatement(Obj):
-            #set default block size is 1
-            Obj.BlockSizeList.append((1, Obj.Size, None))
-            return True
-
-        while self.__GetBlockStatement(Obj):
-            pass
-        
-        for Item in Obj.BlockSizeList:
-            if Item[0] is None or Item[1] is None:
-                raise Warning("expected block statement for Fd Section", self.FileName, self.CurrentLineNumber)
-
-        return True
-    
-    ## __GetBlockStatement() method
-    #
-    #   Get block statement
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom block statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetBlockStatement(self, Obj):
-        if not self.__IsKeyword( "BlockSize"):
-            return False
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():
-            raise Warning("expected Hex block size At Line ", self.FileName, self.CurrentLineNumber)
-
-        BlockSize = long(self.__Token, 0)
-        BlockSizePcd = None
-        if self.__IsToken( "|"):
-            PcdPair = self.__GetNextPcdName()
-            BlockSizePcd = PcdPair
-            self.Profile.PcdDict[PcdPair] = BlockSize
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple
-            
-        BlockNumber = None
-        if self.__IsKeyword( "NumBlocks"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextDecimalNumber() and not self.__GetNextHexNumber():
-                raise Warning("expected block numbers At Line ", self.FileName, self.CurrentLineNumber)
-                
-            BlockNumber = long(self.__Token, 0)
-        
-        Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))
-        return True
-
-    ## __GetDefineStatements() method
-    #
-    #   Get define statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom define statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetDefineStatements(self, Obj):
-        while self.__GetDefineStatement( Obj):
-            pass
-    
-    ## __GetDefineStatement() method
-    #
-    #   Get define statement
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom define statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetDefineStatement(self, Obj):
-        if self.__IsKeyword("DEFINE"):
-            self.__GetNextToken()
-            Macro = self.__Token
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextToken():
-                raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-
-            Value = self.__Token
-            Macro = '$(' + Macro + ')'
-            Obj.DefineVarDict[Macro] = Value
-            return True
-        
-        return False
-    
-    ## __GetSetStatements() method
-    #
-    #   Get set statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom set statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetSetStatements(self, Obj):
-        while self.__GetSetStatement(Obj):
-            pass
-
-    ## __GetSetStatement() method
-    #
-    #   Get set statement
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom set statement is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetSetStatement(self, Obj):
-        if self.__IsKeyword("SET"):
-            PcdPair = self.__GetNextPcdName()
-            
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                
-            if not self.__GetNextToken():
-                raise Warning("expected value At Line ", self.FileName, self.CurrentLineNumber)
-                
-            Value = self.__Token
-            if Value.startswith("{"):
-                # deal with value with {}
-                if not self.__SkipToToken( "}"):
-                    raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-                Value += self.__SkippedChars
-                
-            Obj.SetVarDict[PcdPair] = Value
-            self.Profile.PcdDict[PcdPair] = Value
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple
-            return True
-
-        return False
-
-    ## __GetRegionLayout() method
-    #
-    #   Get region layout for FD
-    #
-    #   @param  self        The object pointer
-    #   @param  Fd          for whom region is got
-    #   @retval True        Successfully find
-    #   @retval False       Not able to find
-    #
-    def __GetRegionLayout(self, Fd):
-        if not self.__GetNextHexNumber():
-            return False
-        
-        RegionObj = CommonDataClass.FdfClass.RegionClassObject()
-        RegionObj.Offset = long(self.__Token, 0)
-        Fd.RegionList.append(RegionObj)
-        
-        if not self.__IsToken( "|"):
-            raise Warning("expected '|' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Region Size At Line ", self.FileName, self.CurrentLineNumber)
-        RegionObj.Size = long(self.__Token, 0)
-        
-        if not self.__GetNextWord():
-            return True
-        
-        if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE"):
-            self.__UndoToken()
-            RegionObj.PcdOffset = self.__GetNextPcdName()
-            self.Profile.PcdDict[RegionObj.PcdOffset] = RegionObj.Offset + long(Fd.BaseAddress, 0)
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple
-            if self.__IsToken( "|"):
-                RegionObj.PcdSize = self.__GetNextPcdName()
-                self.Profile.PcdDict[RegionObj.PcdSize] = RegionObj.Size
-                FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-                self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple
-            
-            if not self.__GetNextWord():
-                return True
-
-        if self.__Token == "SET":
-            self.__UndoToken()
-            self.__GetSetStatements( RegionObj)
-            if not self.__GetNextWord():
-                return True
-            
-        elif self.__Token == "FV":
-            self.__UndoToken()
-            self.__GetRegionFvType( RegionObj)
-
-        elif self.__Token == "CAPSULE":
-            self.__UndoToken()
-            self.__GetRegionCapType( RegionObj)
-
-        elif self.__Token == "FILE":
-            self.__UndoToken()
-            self.__GetRegionFileType( RegionObj)
-
-        else:
-            self.__UndoToken()
-            self.__GetRegionDataType( RegionObj)
-            
-        return True
-            
-    ## __GetRegionFvType() method
-    #
-    #   Get region fv data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionFvType(self, RegionObj):
-
-        if not self.__IsKeyword( "FV"):
-            raise Warning("expected Keyword 'FV' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-        
-        RegionObj.RegionType = "FV"
-        RegionObj.RegionDataList.append(self.__Token)
-        
-        while self.__IsKeyword( "FV"):
-        
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__GetNextToken():
-                raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-        
-            RegionObj.RegionDataList.append(self.__Token)
-
-    ## __GetRegionCapType() method
-    #
-    #   Get region capsule data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionCapType(self, RegionObj):
-
-        if not self.__IsKeyword("CAPSULE"):
-            raise Warning("expected Keyword 'CAPSULE' at line", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' at line", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected CAPSULE name at line", self.FileName, self.CurrentLineNumber)
-
-        RegionObj.RegionType = "CAPSULE"
-        RegionObj.RegionDataList.append(self.__Token)
-
-        while self.__IsKeyword("CAPSULE"):
-
-            if not self.__IsToken("="):
-                raise Warning("expected '=' at line", self.FileName, self.CurrentLineNumber)
-
-            if not self.__GetNextToken():
-                raise Warning("expected CAPSULE name at line", self.FileName, self.CurrentLineNumber)
-
-            RegionObj.RegionDataList.append(self.__Token)
-
-    ## __GetRegionFileType() method
-    #
-    #   Get region file data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionFileType(self, RegionObj):
-
-        if not self.__IsKeyword( "FILE"):
-            raise Warning("expected Keyword 'FILE' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)
-
-        RegionObj.RegionType = "FILE"
-        RegionObj.RegionDataList.append( self.__Token)
-        
-        while self.__IsKeyword( "FILE"):
-        
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__GetNextToken():
-                raise Warning("expected FILE name At Line ", self.FileName, self.CurrentLineNumber)
-        
-            RegionObj.RegionDataList.append(self.__Token)
-
-    ## __GetRegionDataType() method
-    #
-    #   Get region array data for region
-    #
-    #   @param  self        The object pointer
-    #   @param  RegionObj   for whom region data is got
-    #
-    def __GetRegionDataType(self, RegionObj):
-        
-        if not self.__IsKeyword( "DATA"):
-            raise Warning("expected Region Data type At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__IsToken( "{"):
-            raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextHexNumber():
-            raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if len(self.__Token) > 18:
-            raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
-        
-        DataString = self.__Token
-        DataString += ","
-        
-        while self.__IsToken(","):
-            if not self.__GetNextHexNumber():
-                raise Warning("Invalid Hex number At Line ", self.FileName, self.CurrentLineNumber)
-            if len(self.__Token) > 4:
-                raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
-            DataString += self.__Token
-            DataString += ","
-            
-        if not self.__IsToken( "}"):
-            raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        DataString = DataString.rstrip(",")
-        RegionObj.RegionType = "DATA"
-        RegionObj.RegionDataList.append( DataString)
-        
-        while self.__IsKeyword( "DATA"):
-
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__IsToken( "{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if not self.__GetNextHexNumber():
-                raise Warning("expected Hex byte At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if len(self.__Token) > 18:
-                raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)
-        
-            DataString = self.__Token
-            DataString += ","
-        
-            while self.__IsToken(","):
-                self.__GetNextHexNumber()
-                if len(self.__Token) > 4:
-                    raise Warning("Hex byte(must be 2 digits) too long At Line ", self.FileName, self.CurrentLineNumber)
-                DataString += self.__Token
-                DataString += ","
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-        
-            DataString = DataString.rstrip(",")
-            RegionObj.RegionDataList.append( DataString)
-    
-    ## __GetFv() method
-    #
-    #   Get FV section contents and store its data into FV dictionary of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a FV
-    #   @retval False       Not able to find a FV
-    #    
-    def __GetFv(self):
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[FV."):
-            if not S.startswith("[CAPSULE.") \
-                and not S.startswith("[VTF.") and not S.startswith("[RULE."):
-                raise Warning("Unknown section or section appear sequence error \n(The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.]) At Line ", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[FV.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("Unknown Keyword At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FvName = self.__GetUiName()
-        self.CurrentFvName = FvName.upper()
-        
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        FvObj = CommonDataClass.FdfClass.FvClassObject()
-        FvObj.UiFvName = self.CurrentFvName
-        self.Profile.FvDict[self.CurrentFvName] = FvObj
-        
-        Status = self.__GetCreateFile(FvObj)
-        if not Status:
-            raise Warning("FV name error At Line ", self.FileName, self.CurrentLineNumber)
-
-        self.__GetDefineStatements(FvObj)
-
-        self.__GetAddressStatements(FvObj)
-        
-        self.__GetBlockStatement(FvObj)
-
-        self.__GetSetStatements(FvObj)
-
-        self.__GetFvAlignment(FvObj)
-
-        self.__GetFvAttributes(FvObj)
-        
-        self.__GetFvNameGuid(FvObj)
-
-        self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())
-        self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())
-        
-        while True:
-            isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())
-            isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())
-            if not isInf and not isFile:
-                break
-        
-        return True
-
-    ## __GetFvAlignment() method
-    #
-    #   Get alignment for FV
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom alignment is got
-    #   @retval True        Successfully find a alignment statement
-    #   @retval False       Not able to find a alignment statement
-    #
-    def __GetFvAlignment(self, Obj):
-        
-        if not self.__IsKeyword( "FvAlignment"):
-            return False
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected alignment value At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__Token.upper() not in ("1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \
-                                        "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \
-                                        "1M", "2M", "4M", "8M", "16M", "32M", "64M", "128M", "256M", "512M", \
-                                        "1G", "2G"):
-            raise Warning("Unknown alignment value At Line ", self.FileName, self.CurrentLineNumber)
-        Obj.FvAlignment = self.__Token
-        return True
-    
-    ## __GetFvAttributes() method
-    #
-    #   Get attributes for FV
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom attribute is got
-    #   @retval None
-    #
-    def __GetFvAttributes(self, FvObj):
-        
-        while self.__GetNextWord():
-            name = self.__Token
-            if name not in ("ERASE_POLARITY", "MEMORY_MAPPED", \
-                           "STICKY_WRITE", "LOCK_CAP", "LOCK_STATUS", "WRITE_ENABLED_CAP", \
-                           "WRITE_DISABLED_CAP", "WRITE_STATUS", "READ_ENABLED_CAP", \
-                           "READ_DISABLED_CAP", "READ_STATUS", "READ_LOCK_CAP", \
-                           "READ_LOCK_STATUS", "WRITE_LOCK_CAP", "WRITE_LOCK_STATUS", \
-                           "WRITE_POLICY_RELIABLE"):
-                self.__UndoToken()
-                return
-
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):
-                raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)
-            
-            FvObj.FvAttributeDict[name] = self.__Token
-
-        return
-    
-    ## __GetFvNameGuid() method
-    #
-    #   Get FV GUID for FV
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom GUID is got
-    #   @retval None
-    #
-    def __GetFvNameGuid(self, FvObj):
-
-        if not self.__IsKeyword( "FvNameGuid"):
-            return
-
-        if not self.__IsToken( "="):
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextGuid():
-            raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)
-
-        FvObj.FvNameGuid = self.__Token
-
-        return
-
-    ## __GetAprioriSection() method
-    #
-    #   Get token statements
-    #
-    #   @param  self        The object pointer
-    #   @param  FvObj       for whom apriori is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find apriori statement
-    #   @retval False       Not able to find apriori statement
-    #
-    def __GetAprioriSection(self, FvObj, MacroDict = {}):
-        
-        if not self.__IsKeyword( "APRIORI"):
-            return False
-        
-        if not self.__IsKeyword("PEI") and not self.__IsKeyword("DXE"):
-            raise Warning("expected Apriori file type At Line ", self.FileName, self.CurrentLineNumber)
-        AprType = self.__Token
-        
-        if not self.__IsToken( "{"):
-            raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        AprSectionObj = CommonDataClass.FdfClass.AprioriSectionClassObject()
-        AprSectionObj.AprioriType = AprType
-        
-        self.__GetDefineStatements(AprSectionObj)
-        MacroDict.update(AprSectionObj.DefineVarDict)
-        
-        while True:
-            IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)
-            IsFile = self.__GetFileStatement( AprSectionObj)
-            if not IsInf and not IsFile:
-                break
-        
-        if not self.__IsToken( "}"):
-            raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-
-        FvObj.AprioriSectionList.append(AprSectionObj)
-        return True
-
-    ## __GetInfStatement() method
-    #
-    #   Get INF statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom inf statement is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find inf statement
-    #   @retval False       Not able to find inf statement
-    #
-    def __GetInfStatement(self, Obj, ForCapsule = False, MacroDict = {}):
-
-        if not self.__IsKeyword( "INF"):
-            return False
-        
-        ffsInf = CommonDataClass.FdfClass.FfsInfStatementClassObject()
-        self.__GetInfOptions( ffsInf)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected INF file path At Line ", self.FileName, self.CurrentLineNumber)
-        ffsInf.InfFileName = self.__Token
-        
-#        if ffsInf.InfFileName.find('$') >= 0:
-#            ffsInf.InfFileName = GenFdsGlobalVariable.GenFdsGlobalVariable.MacroExtend(ffsInf.InfFileName, MacroDict)
-            
-        if not ffsInf.InfFileName in self.Profile.InfList:
-            self.Profile.InfList.append(ffsInf.InfFileName)
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            self.Profile.InfFileLineList.append(FileLineTuple)
-        
-        if self.__IsToken('|'):
-            if self.__IsKeyword('RELOCS_STRIPPED'):
-                ffsInf.KeepReloc = False
-            elif self.__IsKeyword('RELOCS_RETAINED'):
-                ffsInf.KeepReloc = True
-            else:
-                raise Warning("Unknown reloc strip flag At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if ForCapsule:
-            capsuleFfs = CapsuleData.CapsuleFfs()
-            capsuleFfs.Ffs = ffsInf
-            Obj.CapsuleDataList.append(capsuleFfs)
-        else:
-            Obj.FfsList.append(ffsInf)
-        return True
-    
-    ## __GetInfOptions() method
-    #
-    #   Get options for INF
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsInfObj   for whom option is got
-    #
-    def __GetInfOptions(self, FfsInfObj):
-        
-        if self.__IsKeyword( "RuleOverride"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected Rule name At Line ", self.FileName, self.CurrentLineNumber)
-            FfsInfObj.Rule = self.__Token
-            
-        if self.__IsKeyword( "VERSION"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected Version At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if self.__GetStringData():
-                FfsInfObj.Version = self.__Token
-        
-        if self.__IsKeyword( "UI"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected UI name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if self.__GetStringData():
-                FfsInfObj.Ui = self.__Token
-
-        if self.__IsKeyword( "USE"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)
-            FfsInfObj.UseArch = self.__Token
-
-                
-        if self.__GetNextToken():
-            if TokenFindPattern.match(self.__Token):
-                FfsInfObj.KeyStringList.append(self.__Token)
-                if not self.__IsToken(","):
-                    return
-            else:
-                self.__UndoToken()
-                return
-                
-            while self.__GetNextToken():
-                if not TokenFindPattern.match(self.__Token):
-                    raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)
-                FfsInfObj.KeyStringList.append(self.__Token)
-    
-                if not self.__IsToken(","):
-                    break
-                
-    ## __GetFileStatement() method
-    #
-    #   Get FILE statements
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom FILE statement is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find FILE statement
-    #   @retval False       Not able to find FILE statement
-    #
-    def __GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):
-
-        if not self.__IsKeyword( "FILE"):
-            return False
-        
-        FfsFileObj = CommonDataClass.FdfClass.FileStatementClassObject()
-        
-        if not self.__GetNextWord():
-            raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)
-        FfsFileObj.FvFileType = self.__Token
-        
-        if not self.__IsToken( "="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextGuid():
-            if not self.__GetNextWord():
-                raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)
-            if self.__Token == 'PCD':
-                if not self.__IsToken( "("):
-                    raise Warning("expected '('", self.FileName, self.CurrentLineNumber)
-                PcdPair = self.__GetNextPcdName()
-                if not self.__IsToken( ")"):
-                    raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)
-                self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'
-                
-        FfsFileObj.NameGuid = self.__Token
-    
-        self.__GetFilePart( FfsFileObj, MacroDict.copy())
-        
-        if ForCapsule:
-            capsuleFfs = CapsuleData.CapsuleFfs()
-            capsuleFfs.Ffs = FfsFileObj
-            Obj.CapsuleDataList.append(capsuleFfs)
-        else:
-            Obj.FfsList.append(FfsFileObj)
-                
-        return True
-    
-    ## __FileCouldHaveRelocFlag() method
-    #
-    #   Check whether reloc strip flag can be set for a file type.
-    #
-    #   @param  FileType    The file type to check with
-    #   @retval True        This type could have relocation strip flag
-    #   @retval False       No way to have it
-    #
-    @staticmethod
-    def __FileCouldHaveRelocFlag (FileType):
-        if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):
-            return True
-        else:
-            return False
-    
-    ## __SectionCouldHaveRelocFlag() method
-    #
-    #   Check whether reloc strip flag can be set for a section type.
-    #
-    #   @param  SectionType The section type to check with
-    #   @retval True        This type could have relocation strip flag
-    #   @retval False       No way to have it
-    #
-    @staticmethod
-    def __SectionCouldHaveRelocFlag (SectionType):
-        if SectionType in ('TE', 'PE32'):
-            return True
-        else:
-            return False
-        
-    ## __GetFilePart() method
-    #
-    #   Get components for FILE statement
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFileObj   for whom component is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #
-    def __GetFilePart(self, FfsFileObj, MacroDict = {}):
-        
-        self.__GetFileOpts( FfsFileObj)
-        
-        if not self.__IsToken("{"):
-#            if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-#                if self.__FileCouldHaveRelocFlag(FfsFileObj.FvFileType):
-#                    if self.__Token == 'RELOCS_STRIPPED':
-#                        FfsFileObj.KeepReloc = False
-#                    else:
-#                        FfsFileObj.KeepReloc = True
-#                else:
-#                    raise Warning("File type %s could not have reloc strip flag At Line %d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-#            
-#            if not self.__IsToken("{"):
-            raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        if not self.__GetNextToken():
-            raise Warning("expected File name or section data At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__Token == "FV":
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-            FfsFileObj.FvName = self.__Token
-            
-        elif self.__Token == "FD":
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected FD name At Line ", self.FileName, self.CurrentLineNumber)
-            FfsFileObj.FdName = self.__Token
-            
-        elif self.__Token in ("DEFINE", "APRIORI", "SECTION"):
-            self.__UndoToken()
-            self.__GetSectionData( FfsFileObj, MacroDict)
-        else:
-            FfsFileObj.FileName = self.__Token
-        
-        if not self.__IsToken( "}"):
-            raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-    
-    ## __GetFileOpts() method
-    #
-    #   Get options for FILE statement
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFileObj   for whom options is got
-    #
-    def __GetFileOpts(self, FfsFileObj):
-        
-        if self.__GetNextToken():
-            if TokenFindPattern.match(self.__Token):
-                FfsFileObj.KeyStringList.append(self.__Token)
-                if self.__IsToken(","):
-                    while self.__GetNextToken():
-                        if not TokenFindPattern.match(self.__Token):
-                            raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)
-                        FfsFileObj.KeyStringList.append(self.__Token)
-
-                        if not self.__IsToken(","):
-                            break
-                    
-            else:
-                self.__UndoToken()
-
-        if self.__IsKeyword( "FIXED", True):
-            FfsFileObj.Fixed = True
-            
-        if self.__IsKeyword( "CHECKSUM", True):
-            FfsFileObj.CheckSum = True
-            
-        if self.__GetAlignment():
-            FfsFileObj.Alignment = self.__Token
-            
-        
-    
-    ## __GetAlignment() method
-    #
-    #   Return the alignment value
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find alignment
-    #   @retval False       Not able to find alignment
-    #
-    def __GetAlignment(self):
-        if self.__IsKeyword( "Align", True):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected alignment value At Line ", self.FileName, self.CurrentLineNumber)
-            return True
-            
-        return False
-    
-    ## __GetFilePart() method
-    #
-    #   Get section data for FILE statement
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFileObj   for whom section is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #
-    def __GetSectionData(self, FfsFileObj, MacroDict = {}):
-        Dict = {}
-        Dict.update(MacroDict)
-        
-        self.__GetDefineStatements(FfsFileObj)
-        
-        Dict.update(FfsFileObj.DefineVarDict)
-        self.__GetAprioriSection(FfsFileObj, Dict.copy())
-        self.__GetAprioriSection(FfsFileObj, Dict.copy())
-        
-        while True:
-            IsLeafSection = self.__GetLeafSection(FfsFileObj, Dict)
-            IsEncapSection = self.__GetEncapsulationSec(FfsFileObj)
-            if not IsLeafSection and not IsEncapSection:
-                break
-         
-    ## __GetLeafSection() method
-    #
-    #   Get leaf section for Obj
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom leaf section is got
-    #   @param  MacroDict   dictionary used to replace macro
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetLeafSection(self, Obj, MacroDict = {}):
-        
-        OldPos = self.GetFileBufferPos()
-        
-        if not self.__IsKeyword( "SECTION"):
-            if len(Obj.SectionList) == 0:
-                raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)
-            else:
-                return False
-        
-        AlignValue = None
-        if self.__GetAlignment():
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            AlignValue = self.__Token
-            
-        BuildNum = None
-        if self.__IsKeyword( "BUILD_NUM"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected Build number value At Line ", self.FileName, self.CurrentLineNumber)
-            
-            BuildNum = self.__Token
-            
-        if self.__IsKeyword( "VERSION"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected version At Line ", self.FileName, self.CurrentLineNumber)
-            VerSectionObj = CommonDataClass.FdfClass.VerSectionClassObject()
-            VerSectionObj.Alignment = AlignValue
-            VerSectionObj.BuildNum = BuildNum
-            if self.__GetStringData():
-                VerSectionObj.StringData = self.__Token
-            else:
-                VerSectionObj.FileName = self.__Token
-            Obj.SectionList.append(VerSectionObj)
-
-        elif self.__IsKeyword( "UI"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextToken():
-                raise Warning("expected UI At Line ", self.FileName, self.CurrentLineNumber)
-            UiSectionObj = CommonDataClass.FdfClass.UiSectionClassObject()
-            UiSectionObj.Alignment = AlignValue
-            if self.__GetStringData():
-                UiSectionObj.StringData = self.__Token
-            else:
-                UiSectionObj.FileName = self.__Token
-            Obj.SectionList.append(UiSectionObj)
-            
-        elif self.__IsKeyword( "FV_IMAGE"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__GetNextWord():
-                raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            FvName = self.__Token.upper()
-            FvObj = None
-
-            if self.__IsToken( "{"):
-                FvObj = Fv.FV()
-                FvObj.UiFvName = FvName
-                self.__GetDefineStatements(FvObj)
-                MacroDict.update(FvObj.DefineVarDict)
-                self.__GetBlockStatement(FvObj)
-                self.__GetSetStatements(FvObj)
-                self.__GetFvAlignment(FvObj)
-                self.__GetFvAttributes(FvObj)
-                self.__GetAprioriSection(FvObj, MacroDict.copy())
-                self.__GetAprioriSection(FvObj, MacroDict.copy())
-    
-                while True:
-                    IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())
-                    IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())
-                    if not IsInf and not IsFile:
-                        break
-    
-                if not self.__IsToken( "}"):
-                    raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            FvImageSectionObj = CommonDataClass.FdfClass.FvImageSectionClassObject()
-            FvImageSectionObj.Alignment = AlignValue
-            if FvObj is not None:
-                FvImageSectionObj.Fv = FvObj
-                FvImageSectionObj.FvName = None
-            else:
-                FvImageSectionObj.FvName = FvName
-                
-            Obj.SectionList.append(FvImageSectionObj) 
-           
-        elif self.__IsKeyword("PEI_DEPEX_EXP") or self.__IsKeyword("DXE_DEPEX_EXP") or self.__IsKeyword("SMM_DEPEX_EXP"):
-            if AlignValue == 'Auto':
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            DepexSectionObj = CommonDataClass.FdfClass.DepexSectionClassObject()
-            DepexSectionObj.Alignment = AlignValue
-            DepexSectionObj.DepexType = self.__Token
-            
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__IsToken( "{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            if not self.__SkipToToken( "}"):
-                raise Warning("expected Depex expression ending '}' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            DepexSectionObj.Expression = self.__SkippedChars.rstrip('}')
-            Obj.SectionList.append(DepexSectionObj)
-        
-        else:
-            
-            if not self.__GetNextWord():
-                raise Warning("expected section type At Line ", self.FileName, self.CurrentLineNumber)
-            
-            # Encapsulation section appear, UndoToken and return
-            if self.__Token == "COMPRESS" or self.__Token == "GUIDED":
-                self.SetFileBufferPos(OldPos)
-                return False
-            
-            if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                               "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):
-                raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            # DataSection
-            DataSectionObj = CommonDataClass.FdfClass.DataSectionClassObject()
-            DataSectionObj.Alignment = AlignValue
-            DataSectionObj.SecType = self.__Token
-            
-            if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-                if self.__FileCouldHaveRelocFlag(Obj.FvFileType) and self.__SectionCouldHaveRelocFlag(DataSectionObj.SecType):
-                    if self.__Token == 'RELOCS_STRIPPED':
-                        DataSectionObj.KeepReloc = False
-                    else:
-                        DataSectionObj.KeepReloc = True
-                else:
-                    raise Warning("File type %s, section type %s, could not have reloc strip flag At Line %d" % (Obj.FvFileType, DataSectionObj.SecType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            
-            if self.__IsToken("="):
-                if not self.__GetNextToken():
-                    raise Warning("expected section file path At Line ", self.FileName, self.CurrentLineNumber)
-                DataSectionObj.SectFileName = self.__Token
-            else:
-                if not self.__GetCglSection(DataSectionObj):
-                    return False
-            
-            Obj.SectionList.append(DataSectionObj)
-            
-        return True
-            
-    ## __GetCglSection() method
-    #
-    #   Get compressed or GUIDed section for Obj
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom leaf section is got
-    #   @param  AlignValue  alignment value for complex section
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetCglSection(self, Obj, AlignValue = None):
-        
-        if self.__IsKeyword( "COMPRESS"):
-            type = "PI_STD"
-            if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):
-                type = self.__Token
-                
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-
-            CompressSectionObj = CommonDataClass.FdfClass.CompressSectionClassObject()
-            CompressSectionObj.Alignment = AlignValue
-            CompressSectionObj.CompType = type
-            # Recursive sections...
-            while True:
-                IsLeafSection = self.__GetLeafSection(CompressSectionObj)
-                IsEncapSection = self.__GetEncapsulationSec(CompressSectionObj)
-                if not IsLeafSection and not IsEncapSection:
-                    break
-            
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Obj.SectionList.append(CompressSectionObj)
-                
-#            else:
-#               raise Warning("Compress type not known At Line ") 
-           
-            return True
-        
-        elif self.__IsKeyword( "GUIDED"):
-            GuidValue = None
-            if self.__GetNextGuid():
-                GuidValue = self.__Token
-
-            AttribDict = self.__GetGuidAttrib()
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            GuidSectionObj = CommonDataClass.FdfClass.GuidSectionClassObject()
-            GuidSectionObj.Alignment = AlignValue
-            GuidSectionObj.NameGuid = GuidValue
-            GuidSectionObj.SectionType = "GUIDED"
-            GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]
-            GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]
-            # Recursive sections...
-            while True:
-                IsLeafSection = self.__GetLeafSection(GuidSectionObj)
-                IsEncapSection = self.__GetEncapsulationSec(GuidSectionObj)
-                if not IsLeafSection and not IsEncapSection:
-                    break
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Obj.SectionList.append(GuidSectionObj)
-                
-            return True
-        
-        return False
-
-    ## __GetGuidAttri() method
-    #
-    #   Get attributes for GUID section
-    #
-    #   @param  self        The object pointer
-    #   @retval AttribDict  Dictionary of key-value pair of section attributes
-    #
-    def __GetGuidAttrib(self):
-        
-        AttribDict = {}
-        AttribDict["PROCESSING_REQUIRED"] = False
-        AttribDict["AUTH_STATUS_VALID"] = False
-        if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):
-            AttribKey = self.__Token
-
-            if not self.__IsToken("="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):
-                raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)
-            AttribDict[AttribKey] = self.__Token
-            
-        if self.__IsKeyword("PROCESSING_REQUIRED") or self.__IsKeyword("AUTH_STATUS_VALID"):
-            AttribKey = self.__Token
-
-            if not self.__IsToken("="):
-                raise Warning("expected '=' At Line ")
-
-            if not self.__GetNextToken() or self.__Token.upper() not in ("TRUE", "FALSE", "1", "0"):
-                raise Warning("expected TRUE/FALSE (1/0) At Line ", self.FileName, self.CurrentLineNumber)
-            AttribDict[AttribKey] = self.__Token
-            
-        return AttribDict
-            
-    ## __GetEncapsulationSec() method
-    #
-    #   Get encapsulation section for FILE
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFile     for whom section is got
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetEncapsulationSec(self, FfsFileObj):        
-        
-        OldPos = self.GetFileBufferPos()
-        if not self.__IsKeyword( "SECTION"):
-            if len(FfsFileObj.SectionList) == 0:
-                raise Warning("expected SECTION At Line ", self.FileName, self.CurrentLineNumber)
-            else:
-                return False
-        
-        AlignValue = None
-        if self.__GetAlignment():
-            if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            AlignValue = self.__Token
-            
-        if not self.__GetCglSection(FfsFileObj, AlignValue):
-            self.SetFileBufferPos(OldPos)
-            return False
-        else:
-            return True
-
-    ## __GetCapsule() method
-    #
-    #   Get capsule section contents and store its data into capsule list of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a capsule
-    #   @retval False       Not able to find a capsule
-    #
-    def __GetCapsule(self):
-        
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[CAPSULE."):
-            if not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[CAPSULE.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [Capsule.] At Line ", self.FileName, self.CurrentLineNumber)        
-            
-        CapsuleObj = CommonDataClass.FdfClass.CapsuleClassObject()
-
-        CapsuleName = self.__GetUiName()
-        if not CapsuleName:
-            raise Warning("expected capsule name At line ", self.FileName, self.CurrentLineNumber)
-        
-        CapsuleObj.UiCapsuleName = CapsuleName.upper()
-        
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__IsKeyword("CREATE_FILE"):
-            if not self.__IsToken( "="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected file name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            CapsuleObj.CreateFile = self.__Token
-        
-        self.__GetCapsuleStatements(CapsuleObj)
-        self.Profile.CapsuleList.append(CapsuleObj)
-        return True    
-            
-    ## __GetCapsuleStatements() method
-    #
-    #   Get statements for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom statements are got
-    #
-    def __GetCapsuleStatements(self, Obj):
-        self.__GetCapsuleTokens(Obj)
-        self.__GetDefineStatements(Obj)
-        self.__GetSetStatements(Obj)
-        
-        self.__GetCapsuleData(Obj)
-                
-    ## __GetCapsuleStatements() method
-    #
-    #   Get token statements for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom token statements are got
-    #
-    def __GetCapsuleTokens(self, Obj):
-        
-        if not self.__IsKeyword("CAPSULE_GUID"):
-            raise Warning("expected 'CAPSULE_GUID' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        while self.__CurrentLine().find("=") != -1:
-            NameValue = self.__CurrentLine().split("=")
-            Obj.TokensDict[NameValue[0].strip()] = NameValue[1].strip()
-            self.CurrentLineNumber += 1
-            self.CurrentOffsetWithinLine = 0
-    
-    ## __GetCapsuleData() method
-    #
-    #   Get capsule data for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom capsule data are got
-    #
-    def __GetCapsuleData(self, Obj):
-        
-        while True:
-            IsInf = self.__GetInfStatement(Obj, True)
-            IsFile = self.__GetFileStatement(Obj, True)
-            IsFv = self.__GetFvStatement(Obj)
-            if not IsInf and not IsFile and not IsFv:
-                break
-    
-    ## __GetFvStatement() method
-    #
-    #   Get FV for capsule
-    #
-    #   @param  self        The object pointer
-    #   @param  CapsuleObj  for whom FV is got
-    #   @retval True        Successfully find a FV statement
-    #   @retval False       Not able to find a FV statement
-    #
-    def __GetFvStatement(self, CapsuleObj):
-        
-        if not self.__IsKeyword("FV"):
-            return False
-        
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextToken():
-            raise Warning("expected FV name At Line ", self.FileName, self.CurrentLineNumber)
-        
-#        CapsuleFv = CapsuleData.CapsuleFv()
-#        CapsuleFv.FvName = self.__Token
-#        CapsuleObj.CapsuleDataList.append(CapsuleFv)
-        return True
-    
-    ## __GetRule() method
-    #
-    #   Get Rule section contents and store its data into rule list of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a Rule
-    #   @retval False       Not able to find a Rule
-    #
-    def __GetRule(self):
-        
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[RULE."):
-            if not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-        self.__UndoToken()
-        if not self.__IsToken("[Rule.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [Rule.] At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__SkipToToken("."):
-            raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        Arch = self.__SkippedChars.rstrip(".")
-        if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):
-            raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)
-        
-        ModuleType = self.__GetModuleType()
-        
-        TemplateName = ""
-        if self.__IsToken("."):
-            if not self.__GetNextWord():
-                raise Warning("expected template name At Line ", self.FileName, self.CurrentLineNumber)
-            TemplateName = self.__Token
-            
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        RuleObj = self.__GetRuleFileStatements()
-        RuleObj.Arch = Arch.upper()
-        RuleObj.ModuleType = ModuleType
-        RuleObj.TemplateName = TemplateName
-        if TemplateName == '' :
-            self.Profile.RuleDict['RULE'             + \
-                              '.'                    + \
-                              Arch.upper()           + \
-                              '.'                    + \
-                              ModuleType.upper()     ] = RuleObj
-        else :
-            self.Profile.RuleDict['RULE'             + \
-                              '.'                    + \
-                              Arch.upper()           + \
-                              '.'                    + \
-                              ModuleType.upper()     + \
-                              '.'                    + \
-                              TemplateName.upper() ] = RuleObj
-#        self.Profile.RuleList.append(rule)
-        return True
-    
-    ## __GetModuleType() method
-    #
-    #   Return the module type
-    #
-    #   @param  self        The object pointer
-    #   @retval string      module type
-    #
-    def __GetModuleType(self):
-        
-        if not self.__GetNextWord():
-            raise Warning("expected Module type At Line ", self.FileName, self.CurrentLineNumber)
-        if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \
-                             "DXE_DRIVER", "DXE_SAL_DRIVER", \
-                             "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \
-                             "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \
-                             "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \
-                             "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):
-            raise Warning("Unknown Module type At line ", self.FileName, self.CurrentLineNumber)
-        return self.__Token
-    
-    ## __GetFileExtension() method
-    #
-    #   Return the file extension
-    #
-    #   @param  self        The object pointer
-    #   @retval string      file name extension
-    #
-    def __GetFileExtension(self):
-        if not self.__IsToken("."):
-                raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)
-            
-        Ext = ""
-        if self.__GetNextToken():
-            if FileExtensionPattern.match(self.__Token):
-                Ext = self.__Token                            
-                return '.' + Ext    
-            else:
-                raise Warning("Unknown file extension At Line ", self.FileName, self.CurrentLineNumber)
-                
-        else:
-            raise Warning("expected file extension At Line ", self.FileName, self.CurrentLineNumber)
-        
-    ## __GetRuleFileStatement() method
-    #
-    #   Get rule contents
-    #
-    #   @param  self        The object pointer
-    #   @retval Rule        Rule object
-    #
-    def __GetRuleFileStatements(self):
-        
-        if not self.__IsKeyword("FILE"):
-            raise Warning("expected FILE At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__GetNextWord():
-            raise Warning("expected FFS type At Line ", self.FileName, self.CurrentLineNumber)
-        
-        Type = self.__Token.strip().upper()
-        if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\
-                             "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE"):
-            raise Warning("Unknown FV type At line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if not self.__IsKeyword("$(NAMED_GUID)"):
-            if not self.__GetNextWord():
-                raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)
-            if self.__Token == 'PCD':
-                if not self.__IsToken( "("):
-                    raise Warning("expected '('", self.FileName, self.CurrentLineNumber)
-                PcdPair = self.__GetNextPcdName()
-                if not self.__IsToken( ")"):
-                    raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)
-                self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'
-            
-        NameGuid = self.__Token
-
-        KeepReloc = None
-        if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-            if self.__FileCouldHaveRelocFlag(Type):
-                if self.__Token == 'RELOCS_STRIPPED':
-                    KeepReloc = False
-                else:
-                    KeepReloc = True
-            else:
-                raise Warning("File type %s could not have reloc strip flag At Line %d" % (Type, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-        
-        KeyStringList = []
-        if self.__GetNextToken():
-            if TokenFindPattern.match(self.__Token):
-                KeyStringList.append(self.__Token)
-                if self.__IsToken(","):
-                    while self.__GetNextToken():
-                        if not TokenFindPattern.match(self.__Token):
-                            raise Warning("expected KeyString \"Target_Tag_Arch\" At Line ", self.FileName, self.CurrentLineNumber)
-                        KeyStringList.append(self.__Token)
-
-                        if not self.__IsToken(","):
-                            break
-                    
-            else:
-                self.__UndoToken()
-
-        
-        Fixed = False
-        if self.__IsKeyword("Fixed", True):
-            Fixed = True
-            
-        CheckSum = False
-        if self.__IsKeyword("CheckSum", True):
-            CheckSum = True
-            
-        AlignValue = ""
-        if self.__GetAlignment():
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
-            AlignValue = self.__Token
-
-        if self.__IsToken("{"):
-            # Complex file rule expected
-            Rule = RuleComplexFile.RuleComplexFile()
-            Rule.FvFileType = Type
-            Rule.NameGuid = NameGuid
-            Rule.Alignment = AlignValue
-            Rule.CheckSum = CheckSum
-            Rule.Fixed = Fixed
-            Rule.KeyStringList = KeyStringList
-            if KeepReloc is not None:
-                Rule.KeepReloc = KeepReloc
-            
-            while True:
-                IsEncapsulate = self.__GetRuleEncapsulationSection(Rule)
-                IsLeaf = self.__GetEfiSection(Rule)
-                if not IsEncapsulate and not IsLeaf:
-                    break
-                
-            if not self.__IsToken("}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            return Rule
-        
-        elif self.__IsToken("|"):
-            # Ext rule expected
-            Ext = self.__GetFileExtension()
-            
-            Rule = RuleSimpleFile.RuleSimpleFile()
-
-            Rule.FvFileType = Type
-            Rule.NameGuid = NameGuid
-            Rule.Alignment = AlignValue
-            Rule.CheckSum = CheckSum
-            Rule.Fixed = Fixed
-            Rule.FileExtension = Ext
-            Rule.KeyStringList = KeyStringList
-            if KeepReloc is not None:
-                Rule.KeepReloc = KeepReloc
-            
-            return Rule
-            
-        else:
-            # Simple file rule expected
-            if not self.__GetNextWord():
-                raise Warning("expected leaf section type At Line ", self.FileName, self.CurrentLineNumber)
-
-            SectionName = self.__Token
-        
-            if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                                    "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):
-                raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)
-
-
-            if self.__IsKeyword("Fixed", True):
-                Fixed = True              
-    
-            if self.__IsKeyword("CheckSum", True):
-                CheckSum = True
-    
-            if self.__GetAlignment():
-                if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                        "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                    raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
-                if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
-                    raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-                AlignValue = self.__Token
-            
-            if not self.__GetNextToken():
-                raise Warning("expected File name At Line ", self.FileName, self.CurrentLineNumber)
-            
-            Rule = RuleSimpleFile.RuleSimpleFile()
-            Rule.SectionType = SectionName
-            Rule.FvFileType = Type
-            Rule.NameGuid = NameGuid
-            Rule.Alignment = AlignValue
-            Rule.CheckSum = CheckSum
-            Rule.Fixed = Fixed
-            Rule.FileName = self.__Token
-            Rule.KeyStringList = KeyStringList
-            if KeepReloc is not None:
-                Rule.KeepReloc = KeepReloc
-            return Rule
-        
-    ## __GetEfiSection() method
-    #
-    #   Get section list for Rule
-    #
-    #   @param  self        The object pointer
-    #   @param  Obj         for whom section is got
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetEfiSection(self, Obj):
-        
-        OldPos = self.GetFileBufferPos()
-        if not self.__GetNextWord():
-            return False
-        SectionName = self.__Token
-        
-        if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                               "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
-            self.__UndoToken()
-            return False
-        
-        if SectionName == "FV_IMAGE":
-            FvImageSectionObj = FvImageSection.FvImageSection()
-            if self.__IsKeyword("FV_IMAGE"):
-                pass
-            if self.__IsToken( "{"):
-                FvObj = Fv.FV()
-                self.__GetDefineStatements(FvObj)
-                self.__GetBlockStatement(FvObj)
-                self.__GetSetStatements(FvObj)
-                self.__GetFvAlignment(FvObj)
-                self.__GetFvAttributes(FvObj)
-                self.__GetAprioriSection(FvObj)
-                self.__GetAprioriSection(FvObj)
-    
-                while True:
-                    IsInf = self.__GetInfStatement(FvObj)
-                    IsFile = self.__GetFileStatement(FvObj)
-                    if not IsInf and not IsFile:
-                        break
-    
-                if not self.__IsToken( "}"):
-                    raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-                FvImageSectionObj.Fv = FvObj
-                FvImageSectionObj.FvName = None
-                
-            else:
-                if not self.__IsKeyword("FV"):
-                    raise Warning("expected 'FV' At Line ", self.FileName, self.CurrentLineNumber)
-                FvImageSectionObj.FvFileType = self.__Token
-                
-                if self.__GetAlignment():
-                    if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                            "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                        raise Warning("Incorrect alignment At Line ", self.FileName, self.CurrentLineNumber)
-                    FvImageSectionObj.Alignment = self.__Token
-                
-                if self.__IsToken('|'):
-                    FvImageSectionObj.FvFileExtension = self.__GetFileExtension()
-                elif self.__GetNextToken():
-                    if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                               "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
-                        FvImageSectionObj.FvFileName = self.__Token
-                    else:
-                        self.__UndoToken()
-                else:
-                    raise Warning("expected FV file name At Line ", self.FileName, self.CurrentLineNumber)
-                    
-            Obj.SectionList.append(FvImageSectionObj)
-            return True
-        
-        EfiSectionObj = EfiSection.EfiSection()
-        EfiSectionObj.SectionType = SectionName
-        
-        if not self.__GetNextToken():
-            raise Warning("expected file type At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__Token == "STRING":
-            if not self.__RuleSectionCouldHaveString(EfiSectionObj.SectionType):
-                raise Warning("%s section could NOT have string data At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            
-            if not self.__IsToken('='):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-            
-            if not self.__GetNextToken():
-                raise Warning("expected Quoted String At Line ", self.FileName, self.CurrentLineNumber)
-        
-            if self.__GetStringData():
-                EfiSectionObj.StringData = self.__Token
-            
-            if self.__IsKeyword("BUILD_NUM"):
-                if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):
-                    raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            
-                if not self.__IsToken("="):
-                    raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                if not self.__GetNextToken():
-                    raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)
-                EfiSectionObj.BuildNum = self.__Token
-                
-        else:
-            EfiSectionObj.FileType = self.__Token
-            self.__CheckRuleSectionFileType(EfiSectionObj.SectionType, EfiSectionObj.FileType)
-            
-        if self.__IsKeyword("Optional"):
-            if not self.__RuleSectionCouldBeOptional(EfiSectionObj.SectionType):
-                raise Warning("%s section could NOT be optional At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            EfiSectionObj.Optional = True
-        
-            if self.__IsKeyword("BUILD_NUM"):
-                if not self.__RuleSectionCouldHaveBuildNum(EfiSectionObj.SectionType):
-                    raise Warning("%s section could NOT have BUILD_NUM At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-                
-                if not self.__IsToken("="):
-                    raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-                if not self.__GetNextToken():
-                    raise Warning("expected Build number At Line ", self.FileName, self.CurrentLineNumber)
-                EfiSectionObj.BuildNum = self.__Token
-                
-        if self.__GetAlignment():
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",
-                                    "256K", "512K", "1M", "2M", "4M", "8M", "16M"):
-                raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)
-            if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):
-                raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)
-            EfiSectionObj.Alignment = self.__Token
-        
-        if self.__IsKeyword('RELOCS_STRIPPED') or self.__IsKeyword('RELOCS_RETAINED'):
-            if self.__SectionCouldHaveRelocFlag(EfiSectionObj.SectionType):
-                if self.__Token == 'RELOCS_STRIPPED':
-                    EfiSectionObj.KeepReloc = False
-                else:
-                    EfiSectionObj.KeepReloc = True
-                if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:
-                    raise Warning("Section type %s has reloc strip flag conflict with Rule At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-            else:
-                raise Warning("Section type %s could not have reloc strip flag At Line %d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)
-        
-        
-        if self.__IsToken('|'):
-            EfiSectionObj.FileExtension = self.__GetFileExtension()
-        elif self.__GetNextToken():
-            if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\
-                       "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):
-                
-                if self.__Token.startswith('PCD'):
-                    self.__UndoToken()
-                    self.__GetNextWord()
-                
-                    if self.__Token == 'PCD':
-                        if not self.__IsToken( "("):
-                            raise Warning("expected '('", self.FileName, self.CurrentLineNumber)
-                        PcdPair = self.__GetNextPcdName()
-                        if not self.__IsToken( ")"):
-                            raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)
-                        self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'
-                        
-                EfiSectionObj.FileName = self.__Token        
-                            
-            else:
-                self.__UndoToken()
-        else:
-            raise Warning("expected section file name At Line ", self.FileName, self.CurrentLineNumber)
-                
-        Obj.SectionList.append(EfiSectionObj)
-        return True
-        
-    ## __RuleSectionCouldBeOptional() method
-    #
-    #   Get whether a section could be optional
-    #
-    #   @param  SectionType The section type to check
-    #   @retval True        section could be optional
-    #   @retval False       section never optional
-    #
-    @staticmethod
-    def __RuleSectionCouldBeOptional(SectionType):
-        if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):
-            return True
-        else:
-            return False
-    
-    ## __RuleSectionCouldHaveBuildNum() method
-    #
-    #   Get whether a section could have build number information
-    #
-    #   @param  SectionType The section type to check
-    #   @retval True        section could have build number information
-    #   @retval False       section never have build number information
-    #
-    @staticmethod
-    def __RuleSectionCouldHaveBuildNum(SectionType):
-        if SectionType in ("VERSION"):
-            return True
-        else:
-            return False
-    
-    ## __RuleSectionCouldHaveString() method
-    #
-    #   Get whether a section could have string
-    #
-    #   @param  SectionType The section type to check
-    #   @retval True        section could have string
-    #   @retval False       section never have string
-    #
-    @staticmethod
-    def __RuleSectionCouldHaveString(SectionType):
-        if SectionType in ("UI", "VERSION"):
-            return True
-        else:
-            return False
-    
-    ## __CheckRuleSectionFileType() method
-    #
-    #   Get whether a section matches a file type
-    #
-    #   @param  self        The object pointer
-    #   @param  SectionType The section type to check
-    #   @param  FileType    The file type to check
-    #
-    def __CheckRuleSectionFileType(self, SectionType, FileType):
-        if SectionType == "COMPAT16":
-            if FileType not in ("COMPAT16", "SEC_COMPAT16"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "PE32":
-            if FileType not in ("PE32", "SEC_PE32"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "PIC":
-            if FileType not in ("PIC", "PIC"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "TE":
-            if FileType not in ("TE", "SEC_TE"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "RAW":
-            if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":
-            if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "UI":
-            if FileType not in ("UI", "SEC_UI"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "VERSION":
-            if FileType not in ("VERSION", "SEC_VERSION"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "PEI_DEPEX":
-            if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)
-        elif SectionType == "GUID":
-            if FileType not in ("PE32", "SEC_GUID"):
-                raise Warning("Incorrect section file type At Line ", self.FileName, self.CurrentLineNumber)    
-              
-    ## __GetRuleEncapsulationSection() method
-    #
-    #   Get encapsulation section for Rule
-    #
-    #   @param  self        The object pointer
-    #   @param  Rule        for whom section is got
-    #   @retval True        Successfully find section statement
-    #   @retval False       Not able to find section statement
-    #
-    def __GetRuleEncapsulationSection(self, Rule):
-
-        if self.__IsKeyword( "COMPRESS"):
-            Type = "PI_STD"
-            if self.__IsKeyword("PI_STD") or self.__IsKeyword("PI_NONE"):
-                Type = self.__Token
-                
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-
-            CompressSectionObj = CompressSection.CompressSection()
-            
-            CompressSectionObj.CompType = Type
-            # Recursive sections...
-            while True:
-                IsEncapsulate = self.__GetRuleEncapsulationSection(CompressSectionObj)
-                IsLeaf = self.__GetEfiSection(CompressSectionObj)
-                if not IsEncapsulate and not IsLeaf:
-                    break
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Rule.SectionList.append(CompressSectionObj)
-                
-            return True
-
-        elif self.__IsKeyword( "GUIDED"):
-            GuidValue = None
-            if self.__GetNextGuid():
-                GuidValue = self.__Token
-            
-            if self.__IsKeyword( "$(NAMED_GUID)"):
-                GuidValue = self.__Token
-                
-            AttribDict = self.__GetGuidAttrib()
-            
-            if not self.__IsToken("{"):
-                raise Warning("expected '{' At Line ", self.FileName, self.CurrentLineNumber)
-            GuidSectionObj = GuidSection.GuidSection()
-            GuidSectionObj.NameGuid = GuidValue
-            GuidSectionObj.SectionType = "GUIDED"
-            GuidSectionObj.ProcessRequired = AttribDict["PROCESSING_REQUIRED"]
-            GuidSectionObj.AuthStatusValid = AttribDict["AUTH_STATUS_VALID"]
-            
-            # Efi sections...
-            while True:
-                IsEncapsulate = self.__GetRuleEncapsulationSection(GuidSectionObj)
-                IsLeaf = self.__GetEfiSection(GuidSectionObj)
-                if not IsEncapsulate and not IsLeaf:
-                    break
-            
-            if not self.__IsToken( "}"):
-                raise Warning("expected '}' At Line ", self.FileName, self.CurrentLineNumber)
-            Rule.SectionList.append(GuidSectionObj)
-
-            return True
-
-        return False
-        
-    ## __GetVtf() method
-    #
-    #   Get VTF section contents and store its data into VTF list of self.Profile
-    #
-    #   @param  self        The object pointer
-    #   @retval True        Successfully find a VTF
-    #   @retval False       Not able to find a VTF
-    #
-    def __GetVtf(self):
-        
-        if not self.__GetNextToken():
-            return False
-
-        S = self.__Token.upper()
-        if S.startswith("[") and not S.startswith("[VTF."):
-            if not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):
-                raise Warning("Unknown section or section appear sequence error (The correct sequence should be [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.])", self.FileName, self.CurrentLineNumber)
-            self.__UndoToken()
-            return False
-
-        self.__UndoToken()
-        if not self.__IsToken("[VTF.", True):
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)
-            print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \
-                    % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine :], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)
-            raise Warning("expected [VTF.] At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__SkipToToken("."):
-            raise Warning("expected '.' At Line ", self.FileName, self.CurrentLineNumber)
-
-        Arch = self.__SkippedChars.rstrip(".").upper()
-        if Arch not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
-            raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextWord():
-            raise Warning("expected VTF name At Line ", self.FileName, self.CurrentLineNumber)
-        Name = self.__Token.upper()
-
-        VtfObj = Vtf.Vtf()
-        VtfObj.UiName = Name
-        VtfObj.KeyArch = Arch
-        
-        if self.__IsToken(","):
-            if not self.__GetNextWord():
-                raise Warning("expected Arch list At Line ", self.FileName, self.CurrentLineNumber)
-            if self.__Token.upper() not in ("IA32", "X64", "IPF", "ARM", "AARCH64"):
-                raise Warning("Unknown Arch At line ", self.FileName, self.CurrentLineNumber)
-            VtfObj.ArchList = self.__Token.upper()
-
-        if not self.__IsToken( "]"):
-            raise Warning("expected ']' At Line ", self.FileName, self.CurrentLineNumber)
-        
-        if self.__IsKeyword("IA32_RST_BIN"):
-            if not self.__IsToken("="):
-                raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-            if not self.__GetNextToken():
-                raise Warning("expected Reset file At Line ", self.FileName, self.CurrentLineNumber)
-
-            VtfObj.ResetBin = self.__Token
-            
-        while self.__GetComponentStatement(VtfObj):
-            pass
-        
-        self.Profile.VtfList.append(VtfObj)
-        return True
-    
-    ## __GetComponentStatement() method
-    #
-    #   Get components in VTF
-    #
-    #   @param  self        The object pointer
-    #   @param  VtfObj         for whom component is got
-    #   @retval True        Successfully find a component
-    #   @retval False       Not able to find a component
-    #
-    def __GetComponentStatement(self, VtfObj):
-        
-        if not self.__IsKeyword("COMP_NAME"):
-            return False
-        
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextWord():
-            raise Warning("expected Component Name At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj = ComponentStatement.ComponentStatement()
-        CompStatementObj.CompName = self.__Token
-        
-        if not self.__IsKeyword("COMP_LOC"):
-            raise Warning("expected COMP_LOC At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj.CompLoc = ""
-        if self.__GetNextWord():
-            CompStatementObj.CompLoc = self.__Token
-            if self.__IsToken('|'):
-                if not self.__GetNextWord():
-                    raise Warning("Expected Region Name At Line ", self.FileName, self.CurrentLineNumber)
-                
-                if self.__Token not in ("F", "N", "S"):    #, "H", "L", "PH", "PL"): not support
-                    raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)
-    
-                CompStatementObj.FilePos = self.__Token
-        else:
-            self.CurrentLineNumber += 1
-            self.CurrentOffsetWithinLine = 0
-        
-        if not self.__IsKeyword("COMP_TYPE"):
-            raise Warning("expected COMP_TYPE At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component type At Line ", self.FileName, self.CurrentLineNumber)
-        if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):
-            if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \
-                not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:
-                raise Warning("Unknown location type At line ", self.FileName, self.CurrentLineNumber)
-        CompStatementObj.CompType = self.__Token
-        
-        if not self.__IsKeyword("COMP_VER"):
-            raise Warning("expected COMP_VER At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component version At Line ", self.FileName, self.CurrentLineNumber)
-
-        Pattern = re.compile('-$|[0-9]{0,1}[0-9]{1}\.[0-9]{0,1}[0-9]{1}')
-        if Pattern.match(self.__Token) is None:
-            raise Warning("Unknown version format At line ", self.FileName, self.CurrentLineNumber)
-        CompStatementObj.CompVer = self.__Token
-        
-        if not self.__IsKeyword("COMP_CS"):
-            raise Warning("expected COMP_CS At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component CS At Line ", self.FileName, self.CurrentLineNumber)
-        if self.__Token not in ("1", "0"):
-            raise Warning("Unknown  Component CS At line ", self.FileName, self.CurrentLineNumber)
-        CompStatementObj.CompCs = self.__Token
-        
-        
-        if not self.__IsKeyword("COMP_BIN"):
-            raise Warning("expected COMP_BIN At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component file At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj.CompBin = self.__Token
-        
-        if not self.__IsKeyword("COMP_SYM"):
-            raise Warning("expected COMP_SYM At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__GetNextToken():
-            raise Warning("expected Component symbol file At Line ", self.FileName, self.CurrentLineNumber)
-
-        CompStatementObj.CompSym = self.__Token
-    
-        if not self.__IsKeyword("COMP_SIZE"):
-            raise Warning("expected COMP_SIZE At Line ", self.FileName, self.CurrentLineNumber)
-
-        if not self.__IsToken("="):
-            raise Warning("expected '=' At Line ", self.FileName, self.CurrentLineNumber)
-
-        if self.__IsToken("-"):
-            CompStatementObj.CompSize = self.__Token
-        elif self.__GetNextDecimalNumber():
-            CompStatementObj.CompSize = self.__Token
-        elif self.__GetNextHexNumber():
-            CompStatementObj.CompSize = self.__Token
-        else:
-            raise Warning("Unknown size At line ", self.FileName, self.CurrentLineNumber)
-        
-        VtfObj.ComponentStatementList.append(CompStatementObj)
-        return True
-    
-    ## __GetFvInFd() method
-    #
-    #   Get FV list contained in FD
-    #
-    #   @param  self        The object pointer
-    #   @param  FdName      FD name
-    #   @retval FvList      list of FV in FD
-    #
-    def __GetFvInFd (self, FdName):
-    
-        FvList = []
-        if FdName.upper() in self.Profile.FdDict.keys():
-            FdObj = self.Profile.FdDict[FdName.upper()]
-            for elementRegion in FdObj.RegionList:
-                if elementRegion.RegionType == 'FV':
-                    for elementRegionData in elementRegion.RegionDataList:
-                        if elementRegionData is not None and elementRegionData.upper() not in FvList:
-                            FvList.append(elementRegionData.upper())
-        return FvList
-    
-    ## __GetReferencedFdFvTuple() method
-    #
-    #   Get FD and FV list referenced by a FFS file
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFile     contains sections to be searched
-    #   @param  RefFdList   referenced FD by section
-    #   @param  RefFvList   referenced FV by section
-    #
-    def __GetReferencedFdFvTuple(self, FvObj, RefFdList = [], RefFvList = []):
-        
-        for FfsObj in FvObj.FfsList:
-            if isinstance(FfsObj, FfsFileStatement.FileStatement):
-                if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:
-                    RefFvList.append(FfsObj.FvName.upper())
-                elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:
-                    RefFdList.append(FfsObj.FdName.upper())
-                else:
-                    self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)    
-    
-    ## __GetReferencedFdFvTupleFromSection() method
-    #
-    #   Get FD and FV list referenced by a FFS section
-    #
-    #   @param  self        The object pointer
-    #   @param  FfsFile     contains sections to be searched
-    #   @param  FdList      referenced FD by section
-    #   @param  FvList      referenced FV by section
-    #
-    def __GetReferencedFdFvTupleFromSection(self, FfsFile, FdList = [], FvList = []):
-        
-        SectionStack = []
-        SectionStack.extend(FfsFile.SectionList)
-        while SectionStack != []:
-            SectionObj = SectionStack.pop()
-            if isinstance(SectionObj, FvImageSection.FvImageSection):
-                if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:
-                    FvList.append(SectionObj.FvName.upper())
-                if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:
-                    FvList.append(SectionObj.Fv.UiFvName.upper())
-                    self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)
-            
-            if isinstance(SectionObj, CompressSection.CompressSection) or isinstance(SectionObj, GuidSection.GuidSection):
-                SectionStack.extend(SectionObj.SectionList)
-                          
-    ## CycleReferenceCheck() method
-    #
-    #   Check whether cycle reference exists in FDF
-    #
-    #   @param  self        The object pointer
-    #   @retval True        cycle reference exists
-    #   @retval False       Not exists cycle reference
-    #
-    def CycleReferenceCheck(self):
-        
-        CycleRefExists = False
-        
-        try:
-            for FvName in self.Profile.FvDict.keys():
-                LogStr = "Cycle Reference Checking for FV: %s\n" % FvName
-                RefFvStack = []
-                RefFvStack.append(FvName)
-                FdAnalyzedList = []
-                
-                while RefFvStack != []:
-                    FvNameFromStack = RefFvStack.pop()
-                    if FvNameFromStack.upper() in self.Profile.FvDict.keys():
-                        FvObj = self.Profile.FvDict[FvNameFromStack.upper()]
-                    else:
-                        continue
-                    
-                    RefFdList = []
-                    RefFvList = []
-                    self.__GetReferencedFdFvTuple(FvObj, RefFdList, RefFvList)
-                    
-                    for RefFdName in RefFdList:
-                        if RefFdName in FdAnalyzedList:
-                            continue
-                        
-                        LogStr += "FD %s is referenced by FV %s\n" % (RefFdName, FvNameFromStack) 
-                        FvInFdList = self.__GetFvInFd(RefFdName)
-                        if FvInFdList != []:
-                            LogStr += "FD %s contains FV: " % RefFdName
-                            for FvObj in FvInFdList:
-                                LogStr += FvObj
-                                LogStr += ' \n'
-                                if FvObj not in RefFvStack:
-                                    RefFvStack.append(FvObj)
-                        
-                                if FvName in RefFvStack:
-                                    CycleRefExists = True
-                                    raise Warning(LogStr)
-                        FdAnalyzedList.append(RefFdName)
-                                   
-                    for RefFvName in RefFvList:
-                        LogStr += "FV %s is referenced by FV %s\n" % (RefFvName, FvNameFromStack)
-                        if RefFvName not in RefFvStack:
-                            RefFvStack.append(RefFvName)
-                            
-                        if FvName in RefFvStack:
-                            CycleRefExists = True
-                            raise Warning(LogStr)
-        
-        except Warning:
-            print LogStr
-        
-        finally:
-            return CycleRefExists
-        
-if __name__ == "__main__":
-    import sys
-    try:
-        test_file = sys.argv[1]
-    except IndexError, v:
-        print "Usage: %s filename" % sys.argv[0]
-        sys.exit(1)
-
-    parser = FdfParser(test_file)
-    try:
-        parser.ParseFile()
-        parser.CycleReferenceCheck()
-    except Warning, X:
-        print X.message
-    else:
-        print "Success!"
-
diff --git a/BaseTools/Source/Python/GenFds/FdfParser.py b/BaseTools/Source/Python/GenFds/FdfParser.py
index 9b7e898570..fd38b3d00d 100644
--- a/BaseTools/Source/Python/GenFds/FdfParser.py
+++ b/BaseTools/Source/Python/GenFds/FdfParser.py
@@ -59,11 +59,10 @@ from Common.MultipleWorkspace import MultipleWorkspace as mws
 import Common.LongFilePathOs as os
 from Common.LongFilePathSupport import OpenLongFilePath as open
 from Capsule import EFI_CERT_TYPE_PKCS7_GUID
 from Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID
 from Common.RangeExpression import RangeExpression
-from Common.FdfParserLite import FileExtensionPattern,TokenFindPattern
 
 ##define T_CHAR_SPACE                ' '
 ##define T_CHAR_NULL                 '\0'
 ##define T_CHAR_CR                   '\r'
 ##define T_CHAR_TAB                  '\t'
@@ -83,10 +82,12 @@ SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')
 
 RegionSizePattern = re.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")
 RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")
 RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*$")
 ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")
+FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')
+TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')
 
 AllIncludeFileList = []
 
 # Get the closest parent
 def GetParentAtLine (Line):
diff --git a/BaseTools/Source/Python/Makefile b/BaseTools/Source/Python/Makefile
index e1451e7fae..0b1721ca63 100644
--- a/BaseTools/Source/Python/Makefile
+++ b/BaseTools/Source/Python/Makefile
@@ -42,11 +42,10 @@ COMMON_PYTHON=$(BASE_TOOLS_PATH)\Source\Python\Common\BuildToolError.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\DscClassObject.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\EdkIIWorkspace.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\EdkLogger.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\Expression.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\FdfClassObject.py \
-              $(BASE_TOOLS_PATH)\Source\Python\Common\FdfParserLite.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\GlobalData.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\Identification.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\InfClassObject.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\LongFilePathOs.py \
               $(BASE_TOOLS_PATH)\Source\Python\Common\LongFilePathOsPath.py \
-- 
2.12.2.windows.2

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel