]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools: Move OverrideAttribs to OptRomInfStatement.py
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index 08429cd72affc0fe2af6335fdb5965e90603ec9f..4be790a819040ed8906b48dcecbfebf88dcf7691 100644 (file)
 ##\r
 # Import Modules\r
 #\r
 ##\r
 # Import Modules\r
 #\r
+from __future__ import print_function\r
+from __future__ import absolute_import\r
 import re\r
 \r
 import re\r
 \r
-import Fd\r
-import Region\r
-import Fv\r
-import AprioriSection\r
-import FfsInfStatement\r
-import FfsFileStatement\r
-import VerSection\r
-import UiSection\r
-import FvImageSection\r
-import DataSection\r
-import DepexSection\r
-import CompressSection\r
-import GuidSection\r
-import Capsule\r
-import CapsuleData\r
-import Rule\r
-import RuleComplexFile\r
-import RuleSimpleFile\r
-import EfiSection\r
-import Vtf\r
-import ComponentStatement\r
-import OptionRom\r
-import OptRomInfStatement\r
-import OptRomFileStatement\r
-\r
-from GenFdsGlobalVariable import GenFdsGlobalVariable\r
+from . import Fd\r
+from . import Region\r
+from . import Fv\r
+from . import AprioriSection\r
+from . import FfsInfStatement\r
+from . import FfsFileStatement\r
+from . import VerSection\r
+from . import UiSection\r
+from . import FvImageSection\r
+from . import DataSection\r
+from . import DepexSection\r
+from . import CompressSection\r
+from . import GuidSection\r
+from . import Capsule\r
+from . import CapsuleData\r
+from . import Rule\r
+from . import RuleComplexFile\r
+from . import RuleSimpleFile\r
+from . import EfiSection\r
+from . import Vtf\r
+from . import ComponentStatement\r
+from . import OptionRom\r
+from . import OptRomInfStatement\r
+from . import OptRomFileStatement\r
+import string\r
+\r
+from .GenFdsGlobalVariable import GenFdsGlobalVariable\r
 from Common.BuildToolError import *\r
 from Common import EdkLogger\r
 from Common.Misc import PathClass\r
 from Common.BuildToolError import *\r
 from Common import EdkLogger\r
 from Common.Misc import PathClass\r
-from Common.String import NormPath\r
+from Common.StringUtils import NormPath\r
 import Common.GlobalData as GlobalData\r
 from Common.Expression import *\r
 from Common import GlobalData\r
 import Common.GlobalData as GlobalData\r
 from Common.Expression import *\r
 from Common import GlobalData\r
-from Common.String import ReplaceMacro\r
+from Common.DataType import *\r
+from Common.StringUtils import ReplaceMacro\r
 import uuid\r
 from Common.Misc import tdict\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import Common.LongFilePathOs as os\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
 import uuid\r
 from Common.Misc import tdict\r
 from Common.MultipleWorkspace import MultipleWorkspace as mws\r
 import Common.LongFilePathOs as os\r
 from Common.LongFilePathSupport import OpenLongFilePath as open\r
-from Capsule import EFI_CERT_TYPE_PKCS7_GUID\r
-from Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID\r
+from .Capsule import EFI_CERT_TYPE_PKCS7_GUID\r
+from .Capsule import EFI_CERT_TYPE_RSA2048_SHA256_GUID\r
 from Common.RangeExpression import RangeExpression\r
 from Common.RangeExpression import RangeExpression\r
-from Common.FdfParserLite import FileExtensionPattern\r
 \r
 ##define T_CHAR_SPACE                ' '\r
 ##define T_CHAR_NULL                 '\0'\r
 \r
 ##define T_CHAR_SPACE                ' '\r
 ##define T_CHAR_NULL                 '\0'\r
@@ -81,10 +84,12 @@ T_CHAR_BACKSLASH, T_CHAR_DOUBLE_QUOTE, T_CHAR_SINGLE_QUOTE, T_CHAR_STAR, T_CHAR_
 SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')\r
 \r
 RegionSizePattern = re.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")\r
 SEPERATOR_TUPLE = ('=', '|', ',', '{', '}')\r
 \r
 RegionSizePattern = re.compile("\s*(?P<base>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<size>(?:0x|0X)?[a-fA-F0-9]+)\s*")\r
-RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*\|\s*(?P<size>\w+\.\w+)\s*")\r
-RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+)\s*$")\r
+RegionSizeGuidPattern = re.compile("\s*(?P<base>\w+\.\w+[\.\w\[\]]*)\s*\|\s*(?P<size>\w+\.\w+[\.\w\[\]]*)\s*")\r
+RegionOffsetPcdPattern = re.compile("\s*(?P<base>\w+\.\w+[\.\w\[\]]*)\s*$")\r
 ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")\r
 ShortcutPcdPattern = re.compile("\s*\w+\s*=\s*(?P<value>(?:0x|0X)?[a-fA-F0-9]+)\s*\|\s*(?P<name>\w+\.\w+)\s*")\r
-\r
+BaseAddrValuePattern = re.compile('^0[xX][0-9a-fA-F]+')\r
+FileExtensionPattern = re.compile(r'([a-zA-Z][a-zA-Z0-9]*)')\r
+TokenFindPattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
 AllIncludeFileList = []\r
 \r
 # Get the closest parent\r
 AllIncludeFileList = []\r
 \r
 # Get the closest parent\r
@@ -168,7 +173,7 @@ class IncludeFileProfile :
         self.InsertAdjust = 0\r
         self.IncludeFileList = []\r
         self.Level = 1 # first level include file\r
         self.InsertAdjust = 0\r
         self.IncludeFileList = []\r
         self.Level = 1 # first level include file\r
-    \r
+\r
     def GetTotalLines(self):\r
         TotalLines = self.InsertAdjust + len(self.FileLinesList)\r
 \r
     def GetTotalLines(self):\r
         TotalLines = self.InsertAdjust + len(self.FileLinesList)\r
 \r
@@ -186,7 +191,7 @@ class IncludeFileProfile :
     def GetLineInFile(self, Line):\r
         if not self.IsLineInFile (Line):\r
             return (self.FileName, -1)\r
     def GetLineInFile(self, Line):\r
         if not self.IsLineInFile (Line):\r
             return (self.FileName, -1)\r
-        \r
+\r
         InsertedLines = self.InsertStartLineNumber\r
 \r
         for Profile in self.IncludeFileList:\r
         InsertedLines = self.InsertStartLineNumber\r
 \r
         for Profile in self.IncludeFileList:\r
@@ -221,14 +226,15 @@ class FileProfile :
         except:\r
             EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName)\r
 \r
         except:\r
             EdkLogger.error("FdfParser", FILE_OPEN_FAILURE, ExtraData=FileName)\r
 \r
-\r
+        self.FileName = FileName\r
         self.PcdDict = {}\r
         self.PcdDict = {}\r
+        self.PcdLocalDict = {}\r
         self.InfList = []\r
         self.InfDict = {'ArchTBD':[]}\r
         # ECC will use this Dict and List information\r
         self.PcdFileLineDict = {}\r
         self.InfFileLineList = []\r
         self.InfList = []\r
         self.InfDict = {'ArchTBD':[]}\r
         # ECC will use this Dict and List information\r
         self.PcdFileLineDict = {}\r
         self.InfFileLineList = []\r
-        \r
+\r
         self.FdDict = {}\r
         self.FdNameNotSet = False\r
         self.FvDict = {}\r
         self.FdDict = {}\r
         self.FdNameNotSet = False\r
         self.FvDict = {}\r
@@ -274,21 +280,6 @@ class FdfParser:
         if GenFdsGlobalVariable.WorkSpaceDir == '':\r
             GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE")\r
 \r
         if GenFdsGlobalVariable.WorkSpaceDir == '':\r
             GenFdsGlobalVariable.WorkSpaceDir = os.getenv("WORKSPACE")\r
 \r
-    ## __IsWhiteSpace() method\r
-    #\r
-    #   Whether char at current FileBufferPos is whitespace\r
-    #\r
-    #   @param  self        The object pointer\r
-    #   @param  Char        The char to test\r
-    #   @retval True        The char is a kind of white space\r
-    #   @retval False       The char is NOT a kind of white space\r
-    #\r
-    def __IsWhiteSpace(self, Char):\r
-        if Char in (T_CHAR_NULL, T_CHAR_CR, T_CHAR_SPACE, T_CHAR_TAB, T_CHAR_LF):\r
-            return True\r
-        else:\r
-            return False\r
-\r
     ## __SkipWhiteSpace() method\r
     #\r
     #   Skip white spaces from current char, return number of chars skipped\r
     ## __SkipWhiteSpace() method\r
     #\r
     #   Skip white spaces from current char, return number of chars skipped\r
@@ -349,11 +340,11 @@ class FdfParser:
     #\r
     #   @param  self        The object pointer\r
     #   @param  DestLine    Optional new destination line number.\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  DestLine    Optional new destination line number.\r
-    #   @param  DestOffset  Optional new destination offset.     \r
+    #   @param  DestOffset  Optional new destination offset.\r
     #\r
     #\r
-    def Rewind(self, DestLine = 1, DestOffset = 0):  \r
-        self.CurrentLineNumber = DestLine           \r
-        self.CurrentOffsetWithinLine = DestOffset   \r
+    def Rewind(self, DestLine = 1, DestOffset = 0):\r
+        self.CurrentLineNumber = DestLine\r
+        self.CurrentOffsetWithinLine = DestOffset\r
 \r
     ## __UndoOneChar() method\r
     #\r
 \r
     ## __UndoOneChar() method\r
     #\r
@@ -469,7 +460,7 @@ class FdfParser:
         if MacroName.startswith('!'):\r
             NotFlag = True\r
             MacroName = MacroName[1:].strip()\r
         if MacroName.startswith('!'):\r
             NotFlag = True\r
             MacroName = MacroName[1:].strip()\r
-         \r
+\r
         if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
             raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
                           self.FileName, self.CurrentLineNumber)\r
         if not MacroName.startswith('$(') or not MacroName.endswith(')'):\r
             raise Warning("Macro name expected(Please use '$(%(Token)s)' if '%(Token)s' is a macro.)" % {"Token" : MacroName},\r
                           self.FileName, self.CurrentLineNumber)\r
@@ -523,8 +514,8 @@ class FdfParser:
         if Item == '' or Item == 'RULE':\r
             return\r
 \r
         if Item == '' or Item == 'RULE':\r
             return\r
 \r
-        if Item == 'DEFINES':\r
-            self.__CurSection = ['COMMON', 'COMMON', 'COMMON']\r
+        if Item == TAB_COMMON_DEFINES.upper():\r
+            self.__CurSection = [TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
         elif Item == 'VTF' and len(ItemList) == 3:\r
             UiName = ItemList[2]\r
             Pos = UiName.find(',')\r
         elif Item == 'VTF' and len(ItemList) == 3:\r
             UiName = ItemList[2]\r
             Pos = UiName.find(',')\r
@@ -532,9 +523,9 @@ class FdfParser:
                 UiName = UiName[:Pos]\r
             self.__CurSection = ['VTF', UiName, ItemList[1]]\r
         elif len(ItemList) > 1:\r
                 UiName = UiName[:Pos]\r
             self.__CurSection = ['VTF', UiName, ItemList[1]]\r
         elif len(ItemList) > 1:\r
-            self.__CurSection = [ItemList[0], ItemList[1], 'COMMON']\r
+            self.__CurSection = [ItemList[0], ItemList[1], TAB_COMMON]\r
         elif len(ItemList) > 0:\r
         elif len(ItemList) > 0:\r
-            self.__CurSection = [ItemList[0], 'DUMMY', 'COMMON']\r
+            self.__CurSection = [ItemList[0], 'DUMMY', TAB_COMMON]\r
 \r
     ## PreprocessFile() method\r
     #\r
 \r
     ## PreprocessFile() method\r
     #\r
@@ -609,7 +600,7 @@ class FdfParser:
     #   @param  self        The object pointer\r
     #\r
     def PreprocessIncludeFile(self):\r
     #   @param  self        The object pointer\r
     #\r
     def PreprocessIncludeFile(self):\r
-           # nested include support\r
+      # nested include support\r
         Processed = False\r
         MacroDict = {}\r
         while self.__GetNextToken():\r
         Processed = False\r
         MacroDict = {}\r
         while self.__GetNextToken():\r
@@ -639,7 +630,7 @@ class FdfParser:
                     if not MacroVal:\r
                         if Macro in MacroDict:\r
                             MacroVal = MacroDict[Macro]\r
                     if not MacroVal:\r
                         if Macro in MacroDict:\r
                             MacroVal = MacroDict[Macro]\r
-                    if MacroVal != None:\r
+                    if MacroVal is not None:\r
                         IncFileName = IncFileName.replace('$(' + Macro + ')', MacroVal, 1)\r
                         if MacroVal.find('$(') != -1:\r
                             PreIndex = StartPos\r
                         IncFileName = IncFileName.replace('$(' + Macro + ')', MacroVal, 1)\r
                         if MacroVal.find('$(') != -1:\r
                             PreIndex = StartPos\r
@@ -674,7 +665,7 @@ class FdfParser:
                         IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)\r
                         ErrorCode = IncludedFile1.Validate()[0]\r
                         if ErrorCode != 0:\r
                         IncludedFile1 = PathClass(IncludedFile, GlobalData.gWorkspace)\r
                         ErrorCode = IncludedFile1.Validate()[0]\r
                         if ErrorCode != 0:\r
-                            raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), PlatformDir, GlobalData.gWorkspace), \r
+                            raise Warning("The include file does not exist under below directories: \n%s\n%s\n%s\n"%(os.path.dirname(self.FileName), PlatformDir, GlobalData.gWorkspace),\r
                                           self.FileName, self.CurrentLineNumber)\r
 \r
                 if not IsValidInclude (IncludedFile1.Path, self.CurrentLineNumber):\r
                                           self.FileName, self.CurrentLineNumber)\r
 \r
                 if not IsValidInclude (IncludedFile1.Path, self.CurrentLineNumber):\r
@@ -687,7 +678,7 @@ class FdfParser:
                 # list index of the insertion, note that line number is 'CurrentLine + 1'\r
                 InsertAtLine = CurrentLine\r
                 ParentProfile = GetParentAtLine (CurrentLine)\r
                 # list index of the insertion, note that line number is 'CurrentLine + 1'\r
                 InsertAtLine = CurrentLine\r
                 ParentProfile = GetParentAtLine (CurrentLine)\r
-                if ParentProfile != None:\r
+                if ParentProfile is not None:\r
                     ParentProfile.IncludeFileList.insert(0, IncFileProfile)\r
                     IncFileProfile.Level = ParentProfile.Level + 1\r
                 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
                     ParentProfile.IncludeFileList.insert(0, IncFileProfile)\r
                     IncFileProfile.Level = ParentProfile.Level + 1\r
                 IncFileProfile.InsertStartLineNumber = InsertAtLine + 1\r
@@ -717,17 +708,18 @@ class FdfParser:
                 Processed = False\r
         # Preprocess done.\r
         self.Rewind()\r
                 Processed = False\r
         # Preprocess done.\r
         self.Rewind()\r
-        \r
-    def __GetIfListCurrentItemStat(self, IfList):\r
+\r
+    @staticmethod\r
+    def __GetIfListCurrentItemStat(IfList):\r
         if len(IfList) == 0:\r
             return True\r
         if len(IfList) == 0:\r
             return True\r
-        \r
+\r
         for Item in IfList:\r
             if Item[1] == False:\r
                 return False\r
         for Item in IfList:\r
             if Item[1] == False:\r
                 return False\r
-        \r
+\r
         return True\r
         return True\r
-    \r
+\r
     ## PreprocessConditionalStatement() method\r
     #\r
     #   Preprocess conditional statement.\r
     ## PreprocessConditionalStatement() method\r
     #\r
     #   Preprocess conditional statement.\r
@@ -763,7 +755,7 @@ class FdfParser:
                     while StartPos != -1 and EndPos != -1 and self.__Token not in ['!ifdef', '!ifndef', '!if', '!elseif']:\r
                         MacroName = CurLine[StartPos+2 : EndPos]\r
                         MacorValue = self.__GetMacroValue(MacroName)\r
                     while StartPos != -1 and EndPos != -1 and self.__Token not in ['!ifdef', '!ifndef', '!if', '!elseif']:\r
                         MacroName = CurLine[StartPos+2 : EndPos]\r
                         MacorValue = self.__GetMacroValue(MacroName)\r
-                        if MacorValue != None:\r
+                        if MacorValue is not None:\r
                             CurLine = CurLine.replace('$(' + MacroName + ')', MacorValue, 1)\r
                             if MacorValue.find('$(') != -1:\r
                                 PreIndex = StartPos\r
                             CurLine = CurLine.replace('$(' + MacroName + ')', MacorValue, 1)\r
                             if MacorValue.find('$(') != -1:\r
                                 PreIndex = StartPos\r
@@ -787,7 +779,7 @@ class FdfParser:
                     Macro = self.__Token\r
                     if not self.__IsToken( "="):\r
                         raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
                     Macro = self.__Token\r
                     if not self.__IsToken( "="):\r
                         raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
                     Value = self.__GetExpression()\r
                     self.__SetMacroValue(Macro, Value)\r
                     self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
                     Value = self.__GetExpression()\r
                     self.__SetMacroValue(Macro, Value)\r
                     self.__WipeOffArea.append(((DefineLine, DefineOffset), (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
@@ -796,7 +788,7 @@ class FdfParser:
                     continue\r
                 SetLine = self.CurrentLineNumber - 1\r
                 SetOffset = self.CurrentOffsetWithinLine - len('SET')\r
                     continue\r
                 SetLine = self.CurrentLineNumber - 1\r
                 SetOffset = self.CurrentOffsetWithinLine - len('SET')\r
-                PcdPair = self.__GetNextPcdName()\r
+                PcdPair = self.__GetNextPcdSettings()\r
                 PcdName = "%s.%s" % (PcdPair[1], PcdPair[0])\r
                 if not self.__IsToken( "="):\r
                     raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
                 PcdName = "%s.%s" % (PcdPair[1], PcdPair[0])\r
                 if not self.__IsToken( "="):\r
                     raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
@@ -807,6 +799,7 @@ class FdfParser:
                 self.__PcdDict[PcdName] = Value\r
 \r
                 self.Profile.PcdDict[PcdPair] = Value\r
                 self.__PcdDict[PcdName] = Value\r
 \r
                 self.Profile.PcdDict[PcdPair] = Value\r
+                self.SetPcdLocalation(PcdPair)\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
 \r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
 \r
@@ -817,7 +810,7 @@ class FdfParser:
 \r
                 CondLabel = self.__Token\r
                 Expression = self.__GetExpression()\r
 \r
                 CondLabel = self.__Token\r
                 Expression = self.__GetExpression()\r
-                \r
+\r
                 if CondLabel == '!if':\r
                     ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval')\r
                 else:\r
                 if CondLabel == '!if':\r
                     ConditionSatisfied = self.__EvaluateConditional(Expression, IfList[-1][0][0] + 1, 'eval')\r
                 else:\r
@@ -828,7 +821,7 @@ class FdfParser:
                 BranchDetermined = ConditionSatisfied\r
                 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
                 if ConditionSatisfied:\r
                 BranchDetermined = ConditionSatisfied\r
                 IfList[-1] = [IfList[-1][0], ConditionSatisfied, BranchDetermined]\r
                 if ConditionSatisfied:\r
-                    self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))                 \r
+                    self.__WipeOffArea.append((IfList[-1][0], (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - 1)))\r
             elif self.__Token in ('!elseif', '!else'):\r
                 ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
                 if len(IfList) <= 0:\r
             elif self.__Token in ('!elseif', '!else'):\r
                 ElseStartPos = (self.CurrentLineNumber - 1, self.CurrentOffsetWithinLine - len(self.__Token))\r
                 if len(IfList) <= 0:\r
@@ -897,10 +890,10 @@ class FdfParser:
 \r
         if self.__CurSection:\r
             # Defines macro\r
 \r
         if self.__CurSection:\r
             # Defines macro\r
-            ScopeMacro = self.__MacroDict['COMMON', 'COMMON', 'COMMON']\r
+            ScopeMacro = self.__MacroDict[TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
             if ScopeMacro:\r
                 MacroDict.update(ScopeMacro)\r
             if ScopeMacro:\r
                 MacroDict.update(ScopeMacro)\r
-    \r
+\r
             # Section macro\r
             ScopeMacro = self.__MacroDict[\r
                         self.__CurSection[0],\r
             # Section macro\r
             ScopeMacro = self.__MacroDict[\r
                         self.__CurSection[0],\r
@@ -914,7 +907,7 @@ class FdfParser:
         MacroDict.update(GlobalData.gCommandLineDefines)\r
         if GlobalData.BuildOptionPcd:\r
             for Item in GlobalData.BuildOptionPcd:\r
         MacroDict.update(GlobalData.gCommandLineDefines)\r
         if GlobalData.BuildOptionPcd:\r
             for Item in GlobalData.BuildOptionPcd:\r
-                if type(Item) is tuple:\r
+                if isinstance(Item, tuple):\r
                     continue\r
                 PcdName, TmpValue = Item.split("=")\r
                 TmpValue = BuildOptionValue(TmpValue, {})\r
                     continue\r
                 PcdName, TmpValue = Item.split("=")\r
                 TmpValue = BuildOptionValue(TmpValue, {})\r
@@ -924,7 +917,6 @@ class FdfParser:
         return MacroDict\r
 \r
     def __EvaluateConditional(self, Expression, Line, Op = None, Value = None):\r
         return MacroDict\r
 \r
     def __EvaluateConditional(self, Expression, Line, Op = None, Value = None):\r
-        FileLineTuple = GetRealFileLine(self.FileName, Line)\r
         MacroPcdDict = self.__CollectMacroPcd()\r
         if Op == 'eval':\r
             try:\r
         MacroPcdDict = self.__CollectMacroPcd()\r
         if Op == 'eval':\r
             try:\r
@@ -932,16 +924,16 @@ class FdfParser:
                     return ValueExpression(Expression, MacroPcdDict)(True)\r
                 else:\r
                     return ValueExpression(Expression, MacroPcdDict)()\r
                     return ValueExpression(Expression, MacroPcdDict)(True)\r
                 else:\r
                     return ValueExpression(Expression, MacroPcdDict)()\r
-            except WrnExpression, Excpt:\r
-                # \r
+            except WrnExpression as Excpt:\r
+                #\r
                 # Catch expression evaluation warning here. We need to report\r
                 # the precise number of line and return the evaluation result\r
                 #\r
                 EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt),\r
                 # Catch expression evaluation warning here. We need to report\r
                 # the precise number of line and return the evaluation result\r
                 #\r
                 EdkLogger.warn('Parser', "Suspicious expression: %s" % str(Excpt),\r
-                                File=self.FileName, ExtraData=self.__CurrentLine(), \r
+                                File=self.FileName, ExtraData=self.__CurrentLine(),\r
                                 Line=Line)\r
                 return Excpt.result\r
                                 Line=Line)\r
                 return Excpt.result\r
-            except Exception, Excpt:\r
+            except Exception as Excpt:\r
                 if hasattr(Excpt, 'Pcd'):\r
                     if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
                         Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd]\r
                 if hasattr(Excpt, 'Pcd'):\r
                     if Excpt.Pcd in GlobalData.gPlatformOtherPcds:\r
                         Info = GlobalData.gPlatformOtherPcds[Excpt.Pcd]\r
@@ -949,15 +941,15 @@ class FdfParser:
                                       " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
                                       " of the DSC file (%s), and it is currently defined in this section:"\r
                                       " %s, line #: %d." % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE'], Info[0], Info[1]),\r
                                       " it must be defined in a [PcdsFixedAtBuild] or [PcdsFeatureFlag] section"\r
                                       " of the DSC file (%s), and it is currently defined in this section:"\r
                                       " %s, line #: %d." % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE'], Info[0], Info[1]),\r
-                                      *FileLineTuple)\r
+                                      self.FileName, Line)\r
                     else:\r
                         raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE']),\r
                     else:\r
                         raise Warning("PCD (%s) is not defined in DSC file (%s)" % (Excpt.Pcd, GlobalData.gPlatformOtherPcds['DSCFILE']),\r
-                                      *FileLineTuple)\r
+                                      self.FileName, Line)\r
                 else:\r
                 else:\r
-                    raise Warning(str(Excpt), *FileLineTuple)\r
+                    raise Warning(str(Excpt), self.FileName, Line)\r
         else:\r
             if Expression.startswith('$(') and Expression[-1] == ')':\r
         else:\r
             if Expression.startswith('$(') and Expression[-1] == ')':\r
-                Expression = Expression[2:-1]            \r
+                Expression = Expression[2:-1]\r
             return Expression in MacroPcdDict\r
 \r
     ## __IsToken() method\r
             return Expression in MacroPcdDict\r
 \r
     ## __IsToken() method\r
@@ -1059,6 +1051,29 @@ class FdfParser:
 \r
         return False\r
 \r
 \r
         return False\r
 \r
+    def __GetNextPcdWord(self):\r
+        self.__SkipWhiteSpace()\r
+        if self.__EndOfFile():\r
+            return False\r
+\r
+        TempChar = self.__CurrentChar()\r
+        StartPos = self.CurrentOffsetWithinLine\r
+        if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') or TempChar == '_' or TempChar == '[' or TempChar == ']':\r
+            self.__GetOneChar()\r
+            while not self.__EndOfLine():\r
+                TempChar = self.__CurrentChar()\r
+                if (TempChar >= 'a' and TempChar <= 'z') or (TempChar >= 'A' and TempChar <= 'Z') \\r
+                or (TempChar >= '0' and TempChar <= '9') or TempChar == '_' or TempChar == '-' or TempChar == '[' or TempChar == ']':\r
+                    self.__GetOneChar()\r
+\r
+                else:\r
+                    break\r
+\r
+            self.__Token = self.__CurrentLine()[StartPos : self.CurrentOffsetWithinLine]\r
+            return True\r
+\r
+        return False\r
+\r
     ## __GetNextToken() method\r
     #\r
     #   Get next token unit before a seperator\r
     ## __GetNextToken() method\r
     #\r
     #   Get next token unit before a seperator\r
@@ -1136,31 +1151,28 @@ class FdfParser:
 \r
         if not self.__GetNextToken():\r
             return False\r
 \r
         if not self.__GetNextToken():\r
             return False\r
-        if RangeExpression.RegGuidPattern.match(self.__Token) != None:\r
+        if gGuidPattern.match(self.__Token) is not None:\r
             return True\r
         else:\r
             self.__UndoToken()\r
             return False\r
 \r
             return True\r
         else:\r
             self.__UndoToken()\r
             return False\r
 \r
-    def __Verify(self, Name, Value, Scope):\r
-        if Scope in ['UINT64', 'UINT8']:\r
-            ValueNumber = 0\r
-            try:\r
-                if Value.upper().startswith('0X'):\r
-                    ValueNumber = int (Value, 16)\r
-                else:\r
-                    ValueNumber = int (Value)\r
-            except:\r
-                EdkLogger.error("FdfParser", FORMAT_INVALID, "The value is not valid dec or hex number for %s." % Name)\r
-            if ValueNumber < 0:\r
-                EdkLogger.error("FdfParser", FORMAT_INVALID, "The value can't be set to negative value for %s." % Name)\r
-            if Scope == 'UINT64':\r
-                if ValueNumber >= 0x10000000000000000:\r
-                    EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
-            if Scope == 'UINT8':\r
-                if ValueNumber >= 0x100:\r
-                    EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
-            return True\r
+    @staticmethod\r
+    def __Verify(Name, Value, Scope):\r
+        # value verification only applies to numeric values.\r
+        if Scope not in TAB_PCD_NUMERIC_TYPES:\r
+            return\r
+\r
+        ValueNumber = 0\r
+        try:\r
+            ValueNumber = int(Value, 0)\r
+        except:\r
+            EdkLogger.error("FdfParser", FORMAT_INVALID, "The value is not valid dec or hex number for %s." % Name)\r
+        if ValueNumber < 0:\r
+            EdkLogger.error("FdfParser", FORMAT_INVALID, "The value can't be set to negative value for %s." % Name)\r
+        if ValueNumber > MAX_VAL_TYPE[Scope]:\r
+            EdkLogger.error("FdfParser", FORMAT_INVALID, "Too large value for %s." % Name)\r
+        return True\r
 \r
     ## __UndoToken() method\r
     #\r
 \r
     ## __UndoToken() method\r
     #\r
@@ -1195,32 +1207,6 @@ class FdfParser:
 \r
         self.__GetOneChar()\r
 \r
 \r
         self.__GetOneChar()\r
 \r
-    ## __HexDigit() method\r
-    #\r
-    #   Whether char input is a Hex data bit\r
-    #\r
-    #   @param  self        The object pointer\r
-    #   @param  TempChar    The char to test\r
-    #   @retval True        The char is a Hex data bit\r
-    #   @retval False       The char is NOT a Hex data bit\r
-    #\r
-    def __HexDigit(self, TempChar):\r
-        if (TempChar >= 'a' and TempChar <= 'f') or (TempChar >= 'A' and TempChar <= 'F') \\r
-                or (TempChar >= '0' and TempChar <= '9'):\r
-                    return True\r
-        else:\r
-            return False\r
-\r
-    def __IsHex(self, HexStr):\r
-        if not HexStr.upper().startswith("0X"):\r
-            return False\r
-        if len(self.__Token) <= 2:\r
-            return False\r
-        charList = [c for c in HexStr[2 : ] if not self.__HexDigit( c)]\r
-        if len(charList) == 0:\r
-            return True\r
-        else:\r
-            return False\r
     ## __GetNextHexNumber() method\r
     #\r
     #   Get next HEX data before a seperator\r
     ## __GetNextHexNumber() method\r
     #\r
     #   Get next HEX data before a seperator\r
@@ -1233,7 +1219,7 @@ class FdfParser:
     def __GetNextHexNumber(self):\r
         if not self.__GetNextToken():\r
             return False\r
     def __GetNextHexNumber(self):\r
         if not self.__GetNextToken():\r
             return False\r
-        if self.__IsHex(self.__Token):\r
+        if gHexPatternAll.match(self.__Token):\r
             return True\r
         else:\r
             self.__UndoToken()\r
             return True\r
         else:\r
             self.__UndoToken()\r
@@ -1279,6 +1265,26 @@ class FdfParser:
 \r
         return (pcdCName, pcdTokenSpaceCName)\r
 \r
 \r
         return (pcdCName, pcdTokenSpaceCName)\r
 \r
+    def __GetNextPcdSettings(self):\r
+        if not self.__GetNextWord():\r
+            raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+        pcdTokenSpaceCName = self.__Token\r
+\r
+        if not self.__IsToken( "."):\r
+            raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+\r
+        if not self.__GetNextWord():\r
+            raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+        pcdCName = self.__Token\r
+\r
+        Fields = []\r
+        while self.__IsToken("."):\r
+            if not self.__GetNextPcdWord():\r
+                raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+            Fields.append(self.__Token)\r
+\r
+        return (pcdCName, pcdTokenSpaceCName,".".join(Fields))\r
+\r
     ## __GetStringData() method\r
     #\r
     #   Get string contents quoted in ""\r
     ## __GetStringData() method\r
     #\r
     #   Get string contents quoted in ""\r
@@ -1401,18 +1407,19 @@ class FdfParser:
 \r
         try:\r
             self.Preprocess()\r
 \r
         try:\r
             self.Preprocess()\r
+            self.__GetError()\r
             #\r
             # Keep processing sections of the FDF until no new sections or a syntax error is found\r
             #\r
             while self.__GetFd() or self.__GetFv() or self.__GetFmp() or self.__GetCapsule() or self.__GetVtf() or self.__GetRule() or self.__GetOptionRom():\r
                 pass\r
 \r
             #\r
             # Keep processing sections of the FDF until no new sections or a syntax error is found\r
             #\r
             while self.__GetFd() or self.__GetFv() or self.__GetFmp() or self.__GetCapsule() or self.__GetVtf() or self.__GetRule() or self.__GetOptionRom():\r
                 pass\r
 \r
-        except Warning, X:\r
+        except Warning as X:\r
             self.__UndoToken()\r
             #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
             # At this point, the closest parent would be the included file itself\r
             Profile = GetParentAtLine(X.OriginalLineNumber)\r
             self.__UndoToken()\r
             #'\n\tGot Token: \"%s\" from File %s\n' % (self.__Token, FileLineTuple[0]) + \\r
             # At this point, the closest parent would be the included file itself\r
             Profile = GetParentAtLine(X.OriginalLineNumber)\r
-            if Profile != None:\r
+            if Profile is not None:\r
                 X.Message += ' near line %d, column %d: %s' \\r
                 % (X.LineNumber, 0, Profile.FileLinesList[X.LineNumber-1])\r
             else:\r
                 X.Message += ' near line %d, column %d: %s' \\r
                 % (X.LineNumber, 0, Profile.FileLinesList[X.LineNumber-1])\r
             else:\r
@@ -1470,9 +1477,9 @@ class FdfParser:
                 self.__UndoToken()\r
                 self.__GetSetStatement(None)\r
                 continue\r
                 self.__UndoToken()\r
                 self.__GetSetStatement(None)\r
                 continue\r
-            \r
+\r
             Macro = self.__Token\r
             Macro = self.__Token\r
-            \r
+\r
             if not self.__IsToken("="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken() or self.__Token.startswith('['):\r
             if not self.__IsToken("="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken() or self.__Token.startswith('['):\r
@@ -1481,6 +1488,17 @@ class FdfParser:
 \r
         return False\r
 \r
 \r
         return False\r
 \r
+    ##__GetError() method\r
+    def __GetError(self):\r
+        #save the Current information\r
+        CurrentLine = self.CurrentLineNumber\r
+        CurrentOffset = self.CurrentOffsetWithinLine\r
+        while self.__GetNextToken():\r
+            if self.__Token == TAB_ERROR:\r
+                EdkLogger.error('FdfParser', ERROR_STATEMENT, self.__CurrentLine().replace(TAB_ERROR, '', 1), File=self.FileName, Line=self.CurrentLineNumber)\r
+        self.CurrentLineNumber = CurrentLine\r
+        self.CurrentOffsetWithinLine = CurrentOffset\r
+\r
     ## __GetFd() method\r
     #\r
     #   Get FD section contents and store its data into FD dictionary of self.Profile\r
     ## __GetFd() method\r
     #\r
     #   Get FD section contents and store its data into FD dictionary of self.Profile\r
@@ -1519,7 +1537,7 @@ class FdfParser:
             else:\r
                 raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
         self.CurrentFdName = FdName.upper()\r
             else:\r
                 raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
         self.CurrentFdName = FdName.upper()\r
-        \r
+\r
         if self.CurrentFdName in self.Profile.FdDict:\r
             raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
 \r
         if self.CurrentFdName in self.Profile.FdDict:\r
             raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
 \r
@@ -1540,7 +1558,7 @@ class FdfParser:
         while self.__GetTokenStatements(FdObj):\r
             pass\r
         for Attr in ("BaseAddress", "Size", "ErasePolarity"):\r
         while self.__GetTokenStatements(FdObj):\r
             pass\r
         for Attr in ("BaseAddress", "Size", "ErasePolarity"):\r
-            if getattr(FdObj, Attr) == None:\r
+            if getattr(FdObj, Attr) is None:\r
                 self.__GetNextToken()\r
                 raise Warning("Keyword %s missing" % Attr, self.FileName, self.CurrentLineNumber)\r
 \r
                 self.__GetNextToken()\r
                 raise Warning("Keyword %s missing" % Attr, self.FileName, self.CurrentLineNumber)\r
 \r
@@ -1594,6 +1612,9 @@ class FdfParser:
 \r
         return True\r
 \r
 \r
         return True\r
 \r
+    def SetPcdLocalation(self,pcdpair):\r
+        self.Profile.PcdLocalDict[pcdpair] = (self.Profile.FileName,self.CurrentLineNumber)\r
+\r
     ## __GetTokenStatements() method\r
     #\r
     #   Get token statements\r
     ## __GetTokenStatements() method\r
     #\r
     #   Get token statements\r
@@ -1605,16 +1626,17 @@ class FdfParser:
         if self.__IsKeyword( "BaseAddress"):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
         if self.__IsKeyword( "BaseAddress"):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
             if not self.__GetNextHexNumber():\r
                 raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextHexNumber():\r
                 raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
             Obj.BaseAddress = self.__Token\r
             Obj.BaseAddress = self.__Token\r
-    \r
+\r
             if self.__IsToken( "|"):\r
             if self.__IsToken( "|"):\r
-                pcdPair = self.__GetNextPcdName()\r
+                pcdPair = self.__GetNextPcdSettings()\r
                 Obj.BaseAddressPcd = pcdPair\r
                 self.Profile.PcdDict[pcdPair] = Obj.BaseAddress\r
                 Obj.BaseAddressPcd = pcdPair\r
                 self.Profile.PcdDict[pcdPair] = Obj.BaseAddress\r
+                self.SetPcdLocalation(pcdPair)\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
             return True\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
             return True\r
@@ -1622,15 +1644,16 @@ class FdfParser:
         if self.__IsKeyword( "Size"):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
         if self.__IsKeyword( "Size"):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
             if not self.__GetNextHexNumber():\r
                 raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
 \r
             Size = self.__Token\r
             if self.__IsToken( "|"):\r
             if not self.__GetNextHexNumber():\r
                 raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
 \r
             Size = self.__Token\r
             if self.__IsToken( "|"):\r
-                pcdPair = self.__GetNextPcdName()\r
+                pcdPair = self.__GetNextPcdSettings()\r
                 Obj.SizePcd = pcdPair\r
                 self.Profile.PcdDict[pcdPair] = Size\r
                 Obj.SizePcd = pcdPair\r
                 self.Profile.PcdDict[pcdPair] = Size\r
+                self.SetPcdLocalation(pcdPair)\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
             Obj.Size = long(Size, 0)\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
             Obj.Size = long(Size, 0)\r
@@ -1639,13 +1662,13 @@ class FdfParser:
         if self.__IsKeyword( "ErasePolarity"):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
         if self.__IsKeyword( "ErasePolarity"):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
             if not self.__GetNextToken():\r
                 raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken():\r
                 raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
             if self.__Token != "1" and self.__Token != "0":\r
                 raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
             if self.__Token != "1" and self.__Token != "0":\r
                 raise Warning("expected 1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
-    \r
+\r
             Obj.ErasePolarity = self.__Token\r
             return True\r
 \r
             Obj.ErasePolarity = self.__Token\r
             return True\r
 \r
@@ -1693,9 +1716,9 @@ class FdfParser:
         IsBlock = False\r
         while self.__GetBlockStatement(Obj):\r
             IsBlock = True\r
         IsBlock = False\r
         while self.__GetBlockStatement(Obj):\r
             IsBlock = True\r
-        \r
+\r
             Item = Obj.BlockSizeList[-1]\r
             Item = Obj.BlockSizeList[-1]\r
-            if Item[0] == None or Item[1] == None:\r
+            if Item[0] is None or Item[1] is None:\r
                 raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
         return IsBlock\r
 \r
                 raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
         return IsBlock\r
 \r
@@ -1721,9 +1744,10 @@ class FdfParser:
         BlockSize = self.__Token\r
         BlockSizePcd = None\r
         if self.__IsToken( "|"):\r
         BlockSize = self.__Token\r
         BlockSizePcd = None\r
         if self.__IsToken( "|"):\r
-            PcdPair = self.__GetNextPcdName()\r
+            PcdPair = self.__GetNextPcdSettings()\r
             BlockSizePcd = PcdPair\r
             self.Profile.PcdDict[PcdPair] = BlockSize\r
             BlockSizePcd = PcdPair\r
             self.Profile.PcdDict[PcdPair] = BlockSize\r
+            self.SetPcdLocalation(PcdPair)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
         BlockSize = long(BlockSize, 0)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
         BlockSize = long(BlockSize, 0)\r
@@ -1804,7 +1828,7 @@ class FdfParser:
     #\r
     def __GetSetStatement(self, Obj):\r
         if self.__IsKeyword("SET"):\r
     #\r
     def __GetSetStatement(self, Obj):\r
         if self.__IsKeyword("SET"):\r
-            PcdPair = self.__GetNextPcdName()\r
+            PcdPair = self.__GetNextPcdSettings()\r
 \r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
@@ -1815,6 +1839,7 @@ class FdfParser:
             if Obj:\r
                 Obj.SetVarDict[PcdPair] = Value\r
             self.Profile.PcdDict[PcdPair] = Value\r
             if Obj:\r
                 Obj.SetVarDict[PcdPair] = Value\r
             self.Profile.PcdDict[PcdPair] = Value\r
+            self.SetPcdLocalation(PcdPair)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
             return True\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
             return True\r
@@ -1847,7 +1872,7 @@ class FdfParser:
             return long(\r
                 ValueExpression(Expr,\r
                                 self.__CollectMacroPcd()\r
             return long(\r
                 ValueExpression(Expr,\r
                                 self.__CollectMacroPcd()\r
-                                )(True),0)\r
+                                )(True), 0)\r
         except Exception:\r
             self.SetFileBufferPos(StartPos)\r
             return None\r
         except Exception:\r
             self.SetFileBufferPos(StartPos)\r
             return None\r
@@ -1862,8 +1887,8 @@ class FdfParser:
     #   @retval False       Not able to find\r
     #\r
     def __GetRegionLayout(self, Fd):\r
     #   @retval False       Not able to find\r
     #\r
     def __GetRegionLayout(self, Fd):\r
-        Offset = self.__CalcRegionExpr() \r
-        if Offset == None:\r
+        Offset = self.__CalcRegionExpr()\r
+        if Offset is None:\r
             return False\r
 \r
         RegionObj = Region.Region()\r
             return False\r
 \r
         RegionObj = Region.Region()\r
@@ -1874,14 +1899,14 @@ class FdfParser:
             raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
 \r
         Size = self.__CalcRegionExpr()\r
             raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
 \r
         Size = self.__CalcRegionExpr()\r
-        if Size == None:\r
+        if Size is None:\r
             raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
         RegionObj.Size = Size\r
 \r
         if not self.__GetNextWord():\r
             return True\r
 \r
             raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
         RegionObj.Size = Size\r
 \r
         if not self.__GetNextWord():\r
             return True\r
 \r
-        if not self.__Token in ("SET", "FV", "FILE", "DATA", "CAPSULE", "INF"):\r
+        if not self.__Token in ("SET", BINARY_FILE_TYPE_FV, "FILE", "DATA", "CAPSULE", "INF"):\r
             #\r
             # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]\r
             # Or it might be next region's offset described by an expression which starts with a PCD.\r
             #\r
             # If next token is a word which is not a valid FV type, it might be part of [PcdOffset[|PcdSize]]\r
             # Or it might be next region's offset described by an expression which starts with a PCD.\r
@@ -1891,14 +1916,16 @@ class FdfParser:
             IsRegionPcd = (RegionSizeGuidPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]) or\r
                            RegionOffsetPcdPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]))\r
             if IsRegionPcd:\r
             IsRegionPcd = (RegionSizeGuidPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]) or\r
                            RegionOffsetPcdPattern.match(self.__CurrentLine()[self.CurrentOffsetWithinLine:]))\r
             if IsRegionPcd:\r
-                RegionObj.PcdOffset = self.__GetNextPcdName()\r
+                RegionObj.PcdOffset = self.__GetNextPcdSettings()\r
                 self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0))\r
                 self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(Fd.BaseAddress, 0))\r
+                self.SetPcdLocalation(RegionObj.PcdOffset)\r
                 self.__PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionObj.PcdOffset[0])] = "0x%x" % RegionObj.Offset\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple\r
                 if self.__IsToken( "|"):\r
                 self.__PcdDict['%s.%s' % (RegionObj.PcdOffset[1], RegionObj.PcdOffset[0])] = "0x%x" % RegionObj.Offset\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[RegionObj.PcdOffset] = FileLineTuple\r
                 if self.__IsToken( "|"):\r
-                    RegionObj.PcdSize = self.__GetNextPcdName()\r
+                    RegionObj.PcdSize = self.__GetNextPcdSettings()\r
                     self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size\r
                     self.Profile.PcdDict[RegionObj.PcdSize] = "0x%08X" % RegionObj.Size\r
+                    self.SetPcdLocalation(RegionObj.PcdSize)\r
                     self.__PcdDict['%s.%s' % (RegionObj.PcdSize[1], RegionObj.PcdSize[0])] = "0x%x" % RegionObj.Size\r
                     FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                     self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple\r
                     self.__PcdDict['%s.%s' % (RegionObj.PcdSize[1], RegionObj.PcdSize[0])] = "0x%x" % RegionObj.Size\r
                     FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                     self.Profile.PcdFileLineDict[RegionObj.PcdSize] = FileLineTuple\r
@@ -1912,7 +1939,7 @@ class FdfParser:
             if not self.__GetNextWord():\r
                 return True\r
 \r
             if not self.__GetNextWord():\r
                 return True\r
 \r
-        elif self.__Token == "FV":\r
+        elif self.__Token == BINARY_FILE_TYPE_FV:\r
             self.__UndoToken()\r
             self.__GetRegionFvType( RegionObj)\r
 \r
             self.__UndoToken()\r
             self.__GetRegionFvType( RegionObj)\r
 \r
@@ -1956,8 +1983,8 @@ class FdfParser:
     #\r
     def __GetRegionFvType(self, RegionObj):\r
 \r
     #\r
     def __GetRegionFvType(self, RegionObj):\r
 \r
-        if not self.__IsKeyword( "FV"):\r
-            raise Warning("expected Keyword 'FV'", self.FileName, self.CurrentLineNumber)\r
+        if not self.__IsKeyword( BINARY_FILE_TYPE_FV):\r
+            raise Warning("expected Keyword BINARY_FILE_TYPE_FV", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsToken( "="):\r
             raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsToken( "="):\r
             raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
@@ -1965,10 +1992,10 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
 \r
-        RegionObj.RegionType = "FV"\r
+        RegionObj.RegionType = BINARY_FILE_TYPE_FV\r
         RegionObj.RegionDataList.append((self.__Token).upper())\r
 \r
         RegionObj.RegionDataList.append((self.__Token).upper())\r
 \r
-        while self.__IsKeyword( "FV"):\r
+        while self.__IsKeyword( BINARY_FILE_TYPE_FV):\r
 \r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
@@ -2178,9 +2205,9 @@ class FdfParser:
         while True:\r
             self.__GetSetStatements(FvObj)\r
 \r
         while True:\r
             self.__GetSetStatements(FvObj)\r
 \r
-            if not (self.__GetBlockStatement(FvObj) or self.__GetFvBaseAddress(FvObj) or \r
-                self.__GetFvForceRebase(FvObj) or self.__GetFvAlignment(FvObj) or \r
-                self.__GetFvAttributes(FvObj) or self.__GetFvNameGuid(FvObj) or \r
+            if not (self.__GetBlockStatement(FvObj) or self.__GetFvBaseAddress(FvObj) or\r
+                self.__GetFvForceRebase(FvObj) or self.__GetFvAlignment(FvObj) or\r
+                self.__GetFvAttributes(FvObj) or self.__GetFvNameGuid(FvObj) or\r
                 self.__GetFvExtEntryStatement(FvObj) or self.__GetFvNameString(FvObj)):\r
                 break\r
 \r
                 self.__GetFvExtEntryStatement(FvObj) or self.__GetFvNameString(FvObj)):\r
                 break\r
 \r
@@ -2191,7 +2218,7 @@ class FdfParser:
         self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
 \r
         while True:\r
         self.__GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
 \r
         while True:\r
-            isInf = self.__GetInfStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
+            isInf = self.__GetInfStatement(FvObj)\r
             isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
             if not isInf and not isFile:\r
                 break\r
             isFile = self.__GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
             if not isInf and not isFile:\r
                 break\r
@@ -2225,7 +2252,7 @@ class FdfParser:
             raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         Obj.FvAlignment = self.__Token\r
         return True\r
             raise Warning("Unknown alignment value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         Obj.FvAlignment = self.__Token\r
         return True\r
-    \r
+\r
     ## __GetFvBaseAddress() method\r
     #\r
     #   Get BaseAddress for FV\r
     ## __GetFvBaseAddress() method\r
     #\r
     #   Get BaseAddress for FV\r
@@ -2246,13 +2273,11 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
 \r
-        IsValidBaseAddrValue = re.compile('^0[x|X][0-9a-fA-F]+')\r
-\r
-        if not IsValidBaseAddrValue.match(self.__Token.upper()):\r
+        if not BaseAddrValuePattern.match(self.__Token.upper()):\r
             raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         Obj.FvBaseAddress = self.__Token\r
             raise Warning("Unknown FV base address value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         Obj.FvBaseAddress = self.__Token\r
-        return True  \r
-      \r
+        return True\r
+\r
     ## __GetFvForceRebase() method\r
     #\r
     #   Get FvForceRebase for FV\r
     ## __GetFvForceRebase() method\r
     #\r
     #   Get FvForceRebase for FV\r
@@ -2275,14 +2300,14 @@ class FdfParser:
 \r
         if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:\r
             raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
 \r
         if self.__Token.upper() not in ["TRUE", "FALSE", "0", "0X0", "0X00", "1", "0X1", "0X01"]:\r
             raise Warning("Unknown FvForceRebase value '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
-        \r
+\r
         if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]:\r
             Obj.FvForceRebase = True\r
         elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]:\r
             Obj.FvForceRebase = False\r
         else:\r
             Obj.FvForceRebase = None\r
         if self.__Token.upper() in ["TRUE", "1", "0X1", "0X01"]:\r
             Obj.FvForceRebase = True\r
         elif self.__Token.upper() in ["FALSE", "0", "0X0", "0X00"]:\r
             Obj.FvForceRebase = False\r
         else:\r
             Obj.FvForceRebase = None\r
-           \r
+\r
         return True\r
 \r
 \r
         return True\r
 \r
 \r
@@ -2317,7 +2342,7 @@ class FdfParser:
             FvObj.FvAttributeDict[name] = self.__Token\r
 \r
         return IsWordToken\r
             FvObj.FvAttributeDict[name] = self.__Token\r
 \r
         return IsWordToken\r
-    \r
+\r
     ## __GetFvNameGuid() method\r
     #\r
     #   Get FV GUID for FV\r
     ## __GetFvNameGuid() method\r
     #\r
     #   Get FV GUID for FV\r
@@ -2363,14 +2388,14 @@ class FdfParser:
 \r
         if not self.__IsKeyword ("TYPE"):\r
             raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsKeyword ("TYPE"):\r
             raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
-            \r
+\r
         if not self.__IsToken( "="):\r
             raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
             raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsToken( "="):\r
             raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextHexNumber() and not self.__GetNextDecimalNumber():\r
             raise Warning("expected Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
 \r
-        FvObj.FvExtEntryTypeValue += [self.__Token]\r
+        FvObj.FvExtEntryTypeValue.append(self.__Token)\r
 \r
         if not self.__IsToken( "{"):\r
             raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsToken( "{"):\r
             raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
@@ -2378,13 +2403,13 @@ class FdfParser:
         if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
             raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsKeyword ("FILE") and not self.__IsKeyword ("DATA"):\r
             raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
 \r
-        FvObj.FvExtEntryType += [self.__Token]\r
+        FvObj.FvExtEntryType.append(self.__Token)\r
 \r
         if self.__Token == 'DATA':\r
 \r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
 \r
         if self.__Token == 'DATA':\r
 \r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-                \r
+\r
             if not self.__IsToken( "{"):\r
                 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
 \r
             if not self.__IsToken( "{"):\r
                 raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
 \r
@@ -2412,17 +2437,17 @@ class FdfParser:
                 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
 \r
             DataString = DataString.rstrip(",")\r
                 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
 \r
             DataString = DataString.rstrip(",")\r
-            FvObj.FvExtEntryData += [DataString]\r
+            FvObj.FvExtEntryData.append(DataString)\r
 \r
         if self.__Token == 'FILE':\r
 \r
         if self.__Token == 'FILE':\r
-        \r
+\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-                \r
+\r
             if not self.__GetNextToken():\r
                 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken():\r
                 raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
-                \r
-            FvObj.FvExtEntryData += [self.__Token]\r
+\r
+            FvObj.FvExtEntryData.append(self.__Token)\r
 \r
             if not self.__IsToken( "}"):\r
                 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
 \r
             if not self.__IsToken( "}"):\r
                 raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
@@ -2458,7 +2483,7 @@ class FdfParser:
         MacroDict.update(AprSectionObj.DefineVarDict)\r
 \r
         while True:\r
         MacroDict.update(AprSectionObj.DefineVarDict)\r
 \r
         while True:\r
-            IsInf = self.__GetInfStatement( AprSectionObj, MacroDict = MacroDict)\r
+            IsInf = self.__GetInfStatement(AprSectionObj)\r
             IsFile = self.__GetFileStatement( AprSectionObj)\r
             if not IsInf and not IsFile:\r
                 break\r
             IsFile = self.__GetFileStatement( AprSectionObj)\r
             if not IsInf and not IsFile:\r
                 break\r
@@ -2521,11 +2546,10 @@ class FdfParser:
     #\r
     #   @param  self        The object pointer\r
     #   @param  Obj         for whom inf statement is got\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  Obj         for whom inf statement is got\r
-    #   @param  MacroDict   dictionary used to replace macro\r
     #   @retval True        Successfully find inf statement\r
     #   @retval False       Not able to find inf statement\r
     #\r
     #   @retval True        Successfully find inf statement\r
     #   @retval False       Not able to find inf statement\r
     #\r
-    def __GetInfStatement(self, Obj, ForCapsule=False, MacroDict={}):\r
+    def __GetInfStatement(self, Obj, ForCapsule=False):\r
         ffsInf = self.__ParseInfStatement()\r
         if not ffsInf:\r
             return False\r
         ffsInf = self.__ParseInfStatement()\r
         if not ffsInf:\r
             return False\r
@@ -2569,7 +2593,7 @@ class FdfParser:
             if self.__GetStringData():\r
                 FfsInfObj.Version = self.__Token\r
 \r
             if self.__GetStringData():\r
                 FfsInfObj.Version = self.__Token\r
 \r
-        if self.__IsKeyword( "UI"):\r
+        if self.__IsKeyword( BINARY_FILE_TYPE_UI):\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken():\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken():\r
@@ -2585,7 +2609,7 @@ class FdfParser:
                 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
             FfsInfObj.UseArch = self.__Token\r
 \r
                 raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
             FfsInfObj.UseArch = self.__Token\r
 \r
-                \r
+\r
         if self.__GetNextToken():\r
             p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')\r
             if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token):\r
         if self.__GetNextToken():\r
             p = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\))')\r
             if p.match(self.__Token) and p.match(self.__Token).span()[1] == len(self.__Token):\r
@@ -2626,7 +2650,7 @@ class FdfParser:
             self.__UndoToken()\r
             self.__UndoToken()\r
             return False\r
             self.__UndoToken()\r
             self.__UndoToken()\r
             return False\r
-        \r
+\r
         FfsFileObj = FfsFileStatement.FileStatement()\r
         FfsFileObj.FvFileType = self.__Token\r
 \r
         FfsFileObj = FfsFileStatement.FileStatement()\r
         FfsFileObj.FvFileType = self.__Token\r
 \r
@@ -2639,13 +2663,13 @@ class FdfParser:
             if self.__Token == 'PCD':\r
                 if not self.__IsToken( "("):\r
                     raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
             if self.__Token == 'PCD':\r
                 if not self.__IsToken( "("):\r
                     raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
-                PcdPair = self.__GetNextPcdName()\r
+                PcdPair = self.__GetNextPcdSettings()\r
                 if not self.__IsToken( ")"):\r
                     raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
                 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
                 if not self.__IsToken( ")"):\r
                     raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
                 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
-                \r
+\r
         FfsFileObj.NameGuid = self.__Token\r
         FfsFileObj.NameGuid = self.__Token\r
-        \r
+\r
         self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
 \r
         if ForCapsule:\r
         self.__GetFilePart( FfsFileObj, MacroDict.copy())\r
 \r
         if ForCapsule:\r
@@ -2661,14 +2685,13 @@ class FdfParser:
     #\r
     #   Check whether reloc strip flag can be set for a file type.\r
     #\r
     #\r
     #   Check whether reloc strip flag can be set for a file type.\r
     #\r
-    #   @param  self        The object pointer\r
     #   @param  FileType    The file type to check with\r
     #   @retval True        This type could have relocation strip flag\r
     #   @retval False       No way to have it\r
     #\r
     #   @param  FileType    The file type to check with\r
     #   @retval True        This type could have relocation strip flag\r
     #   @retval False       No way to have it\r
     #\r
-\r
-    def __FileCouldHaveRelocFlag (self, FileType):\r
-        if FileType in ('SEC', 'PEI_CORE', 'PEIM', 'PEI_DXE_COMBO'):\r
+    @staticmethod\r
+    def __FileCouldHaveRelocFlag (FileType):\r
+        if FileType in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, 'PEI_DXE_COMBO'):\r
             return True\r
         else:\r
             return False\r
             return True\r
         else:\r
             return False\r
@@ -2677,14 +2700,13 @@ class FdfParser:
     #\r
     #   Check whether reloc strip flag can be set for a section type.\r
     #\r
     #\r
     #   Check whether reloc strip flag can be set for a section type.\r
     #\r
-    #   @param  self        The object pointer\r
     #   @param  SectionType The section type to check with\r
     #   @retval True        This type could have relocation strip flag\r
     #   @retval False       No way to have it\r
     #\r
     #   @param  SectionType The section type to check with\r
     #   @retval True        This type could have relocation strip flag\r
     #   @retval False       No way to have it\r
     #\r
-\r
-    def __SectionCouldHaveRelocFlag (self, SectionType):\r
-        if SectionType in ('TE', 'PE32'):\r
+    @staticmethod\r
+    def __SectionCouldHaveRelocFlag (SectionType):\r
+        if SectionType in (BINARY_FILE_TYPE_TE, BINARY_FILE_TYPE_PE32):\r
             return True\r
         else:\r
             return False\r
             return True\r
         else:\r
             return False\r
@@ -2717,7 +2739,7 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
 \r
-        if self.__Token == "FV":\r
+        if self.__Token == BINARY_FILE_TYPE_FV:\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken():\r
             if not self.__IsToken( "="):\r
                 raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
             if not self.__GetNextToken():\r
@@ -2762,7 +2784,7 @@ class FdfParser:
         while True:\r
             AlignValue = None\r
             if self.__GetAlignment():\r
         while True:\r
             AlignValue = None\r
             if self.__GetAlignment():\r
-                if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+                if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                         "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                     raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                 #For FFS, Auto is default option same to ""\r
                                         "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                     raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                 #For FFS, Auto is default option same to ""\r
@@ -2800,12 +2822,11 @@ class FdfParser:
     def __GetFileOpts(self, FfsFileObj):\r
 \r
         if self.__GetNextToken():\r
     def __GetFileOpts(self, FfsFileObj):\r
 \r
         if self.__GetNextToken():\r
-            Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
-            if Pattern.match(self.__Token):\r
+            if TokenFindPattern.match(self.__Token):\r
                 FfsFileObj.KeyStringList.append(self.__Token)\r
                 if self.__IsToken(","):\r
                     while self.__GetNextToken():\r
                 FfsFileObj.KeyStringList.append(self.__Token)\r
                 if self.__IsToken(","):\r
                     while self.__GetNextToken():\r
-                        if not Pattern.match(self.__Token):\r
+                        if not TokenFindPattern.match(self.__Token):\r
                             raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                         FfsFileObj.KeyStringList.append(self.__Token)\r
 \r
                             raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                         FfsFileObj.KeyStringList.append(self.__Token)\r
 \r
@@ -2822,7 +2843,7 @@ class FdfParser:
             FfsFileObj.CheckSum = True\r
 \r
         if self.__GetAlignment():\r
             FfsFileObj.CheckSum = True\r
 \r
         if self.__GetAlignment():\r
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             #For FFS, Auto is default option same to ""\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             #For FFS, Auto is default option same to ""\r
@@ -2894,7 +2915,7 @@ class FdfParser:
 \r
         AlignValue = None\r
         if self.__GetAlignment():\r
 \r
         AlignValue = None\r
         if self.__GetAlignment():\r
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             AlignValue = self.__Token\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             AlignValue = self.__Token\r
@@ -2924,8 +2945,8 @@ class FdfParser:
             else:\r
                 VerSectionObj.FileName = self.__Token\r
             Obj.SectionList.append(VerSectionObj)\r
             else:\r
                 VerSectionObj.FileName = self.__Token\r
             Obj.SectionList.append(VerSectionObj)\r
-            \r
-        elif self.__IsKeyword( "UI"):\r
+\r
+        elif self.__IsKeyword( BINARY_FILE_TYPE_UI):\r
             if AlignValue == 'Auto':\r
                 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
             if not self.__IsToken( "="):\r
             if AlignValue == 'Auto':\r
                 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
             if not self.__IsToken( "="):\r
@@ -2964,7 +2985,7 @@ class FdfParser:
                 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
 \r
                 while True:\r
                 self.__GetAprioriSection(FvObj, MacroDict.copy())\r
 \r
                 while True:\r
-                    IsInf = self.__GetInfStatement(FvObj, MacroDict.copy())\r
+                    IsInf = self.__GetInfStatement(FvObj)\r
                     IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
                     if not IsInf and not IsFile:\r
                         break\r
                     IsFile = self.__GetFileStatement(FvObj, MacroDict.copy())\r
                     if not IsInf and not IsFile:\r
                         break\r
@@ -2974,7 +2995,7 @@ class FdfParser:
 \r
             FvImageSectionObj = FvImageSection.FvImageSection()\r
             FvImageSectionObj.Alignment = AlignValue\r
 \r
             FvImageSectionObj = FvImageSection.FvImageSection()\r
             FvImageSectionObj.Alignment = AlignValue\r
-            if FvObj != None:\r
+            if FvObj is not None:\r
                 FvImageSectionObj.Fv = FvObj\r
                 FvImageSectionObj.FvName = None\r
             else:\r
                 FvImageSectionObj.Fv = FvObj\r
                 FvImageSectionObj.FvName = None\r
             else:\r
@@ -3009,10 +3030,10 @@ class FdfParser:
                 self.SetFileBufferPos(OldPos)\r
                 return False\r
 \r
                 self.SetFileBufferPos(OldPos)\r
                 return False\r
 \r
-            if self.__Token not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
-                               "UI", "VERSION", "PEI_DEPEX", "SUBTYPE_GUID", "SMM_DEPEX"):\r
+            if self.__Token not in ("COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
+                               BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX):\r
                 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Unknown section type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
-            if AlignValue == 'Auto'and (not self.__Token == 'PE32') and (not self.__Token == 'TE'):\r
+            if AlignValue == 'Auto'and (not self.__Token == BINARY_FILE_TYPE_PE32) and (not self.__Token == BINARY_FILE_TYPE_TE):\r
                 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
 \r
             # DataSection\r
                 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
 \r
             # DataSection\r
@@ -3184,7 +3205,7 @@ class FdfParser:
 \r
         AlignValue = None\r
         if self.__GetAlignment():\r
 \r
         AlignValue = None\r
         if self.__GetAlignment():\r
-            if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+            if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             AlignValue = self.__Token\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             AlignValue = self.__Token\r
@@ -3239,16 +3260,16 @@ class FdfParser:
                     raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
                 Value = self.__Token\r
                 if Name == 'IMAGE_HEADER_INIT_VERSION':\r
                     raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\r
                 Value = self.__Token\r
                 if Name == 'IMAGE_HEADER_INIT_VERSION':\r
-                    if self.__Verify(Name, Value, 'UINT8'):\r
+                    if FdfParser.__Verify(Name, Value, 'UINT8'):\r
                         FmpData.Version = Value\r
                 elif Name == 'IMAGE_INDEX':\r
                         FmpData.Version = Value\r
                 elif Name == 'IMAGE_INDEX':\r
-                    if self.__Verify(Name, Value, 'UINT8'):\r
+                    if FdfParser.__Verify(Name, Value, 'UINT8'):\r
                         FmpData.ImageIndex = Value\r
                 elif Name == 'HARDWARE_INSTANCE':\r
                         FmpData.ImageIndex = Value\r
                 elif Name == 'HARDWARE_INSTANCE':\r
-                    if self.__Verify(Name, Value, 'UINT8'):\r
+                    if FdfParser.__Verify(Name, Value, 'UINT8'):\r
                         FmpData.HardwareInstance = Value\r
                 elif Name == 'MONOTONIC_COUNT':\r
                         FmpData.HardwareInstance = Value\r
                 elif Name == 'MONOTONIC_COUNT':\r
-                    if self.__Verify(Name, Value, 'UINT64'):\r
+                    if FdfParser.__Verify(Name, Value, 'UINT64'):\r
                         FmpData.MonotonicCount = Value\r
                         if FmpData.MonotonicCount.upper().startswith('0X'):\r
                             FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
                         FmpData.MonotonicCount = Value\r
                         if FmpData.MonotonicCount.upper().startswith('0X'):\r
                             FmpData.MonotonicCount = (long)(FmpData.MonotonicCount, 16)\r
@@ -3378,7 +3399,7 @@ class FdfParser:
                 Value = self.__Token.strip()\r
             else:\r
                 Value = self.__Token.strip()\r
                 Value = self.__Token.strip()\r
             else:\r
                 Value = self.__Token.strip()\r
-            Obj.TokensDict[Name] = Value  \r
+            Obj.TokensDict[Name] = Value\r
             if not self.__GetNextToken():\r
                 return False\r
         self.__UndoToken()\r
             if not self.__GetNextToken():\r
                 return False\r
         self.__UndoToken()\r
@@ -3430,7 +3451,7 @@ class FdfParser:
     #\r
     def __GetFvStatement(self, CapsuleObj, FMPCapsule = False):\r
 \r
     #\r
     def __GetFvStatement(self, CapsuleObj, FMPCapsule = False):\r
 \r
-        if not self.__IsKeyword("FV"):\r
+        if not self.__IsKeyword(BINARY_FILE_TYPE_FV):\r
             return False\r
 \r
         if not self.__IsToken("="):\r
             return False\r
 \r
         if not self.__IsToken("="):\r
@@ -3439,7 +3460,7 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
 \r
-        if self.__Token.upper() not in self.Profile.FvDict.keys():\r
+        if self.__Token.upper() not in self.Profile.FvDict:\r
             raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
 \r
         CapsuleFv = CapsuleData.CapsuleFv()\r
             raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
 \r
         CapsuleFv = CapsuleData.CapsuleFv()\r
@@ -3473,7 +3494,7 @@ class FdfParser:
         if not self.__GetNextToken():\r
             raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
 \r
-        if self.__Token.upper() not in self.Profile.FdDict.keys():\r
+        if self.__Token.upper() not in self.Profile.FdDict:\r
             raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
 \r
         CapsuleFd = CapsuleData.CapsuleFd()\r
             raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
 \r
         CapsuleFd = CapsuleData.CapsuleFd()\r
@@ -3520,7 +3541,7 @@ class FdfParser:
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
-        \r
+\r
         AnyFileName = self.__Token\r
         self.__VerifyFile(AnyFileName)\r
 \r
         AnyFileName = self.__Token\r
         self.__VerifyFile(AnyFileName)\r
 \r
@@ -3553,7 +3574,7 @@ class FdfParser:
         else:\r
             CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
         return True\r
         else:\r
             CapsuleObj.CapsuleDataList.append(CapsuleAnyFile)\r
         return True\r
-    \r
+\r
     ## __GetAfileStatement() method\r
     #\r
     #   Get Afile for capsule\r
     ## __GetAfileStatement() method\r
     #\r
     #   Get Afile for capsule\r
@@ -3573,14 +3594,14 @@ class FdfParser:
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextToken():\r
             raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber)\r
-        \r
+\r
         AfileName = self.__Token\r
         AfileBaseName = os.path.basename(AfileName)\r
         AfileName = self.__Token\r
         AfileBaseName = os.path.basename(AfileName)\r
-        \r
-        if os.path.splitext(AfileBaseName)[1]  not in [".bin",".BIN",".Bin",".dat",".DAT",".Dat",".data",".DATA",".Data"]:\r
-            raise Warning('invalid binary file type, should be one of "bin","BIN","Bin","dat","DAT","Dat","data","DATA","Data"', \\r
+\r
+        if os.path.splitext(AfileBaseName)[1]  not in [".bin", ".BIN", ".Bin", ".dat", ".DAT", ".Dat", ".data", ".DATA", ".Data"]:\r
+            raise Warning('invalid binary file type, should be one of "bin",BINARY_FILE_TYPE_BIN,"Bin","dat","DAT","Dat","data","DATA","Data"', \\r
                           self.FileName, self.CurrentLineNumber)\r
                           self.FileName, self.CurrentLineNumber)\r
-        \r
+\r
         if not os.path.isabs(AfileName):\r
             AfileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AfileName)\r
             self.__VerifyFile(AfileName)\r
         if not os.path.isabs(AfileName):\r
             AfileName = GenFdsGlobalVariable.ReplaceWorkspaceMacro(AfileName)\r
             self.__VerifyFile(AfileName)\r
@@ -3624,7 +3645,7 @@ class FdfParser:
             raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
 \r
         Arch = self.__SkippedChars.rstrip(".")\r
             raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
 \r
         Arch = self.__SkippedChars.rstrip(".")\r
-        if Arch.upper() not in ("IA32", "X64", "IPF", "EBC", "ARM", "AARCH64", "COMMON"):\r
+        if Arch.upper() not in ARCH_SET_FULL:\r
             raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
 \r
         ModuleType = self.__GetModuleType()\r
             raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
 \r
         ModuleType = self.__GetModuleType()\r
@@ -3670,12 +3691,12 @@ class FdfParser:
 \r
         if not self.__GetNextWord():\r
             raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__GetNextWord():\r
             raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
-        if self.__Token.upper() not in ("SEC", "PEI_CORE", "PEIM", "DXE_CORE", \\r
-                             "DXE_DRIVER", "DXE_SAL_DRIVER", \\r
-                             "DXE_SMM_DRIVER", "DXE_RUNTIME_DRIVER", \\r
-                             "UEFI_DRIVER", "UEFI_APPLICATION", "USER_DEFINED", "DEFAULT", "BASE", \\r
-                             "SECURITY_CORE", "COMBINED_PEIM_DRIVER", "PIC_PEIM", "RELOCATABLE_PEIM", \\r
-                                        "PE32_PEIM", "BS_DRIVER", "RT_DRIVER", "SAL_RT_DRIVER", "APPLICATION", "ACPITABLE", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
+        if self.__Token.upper() not in (SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_DXE_CORE, \\r
+                             SUP_MODULE_DXE_DRIVER, SUP_MODULE_DXE_SAL_DRIVER, \\r
+                             SUP_MODULE_DXE_SMM_DRIVER, SUP_MODULE_DXE_RUNTIME_DRIVER, \\r
+                             SUP_MODULE_UEFI_DRIVER, SUP_MODULE_UEFI_APPLICATION, SUP_MODULE_USER_DEFINED, "DEFAULT", SUP_MODULE_BASE, \\r
+                             EDK_COMPONENT_TYPE_SECURITY_CORE, EDK_COMPONENT_TYPE_COMBINED_PEIM_DRIVER, EDK_COMPONENT_TYPE_PIC_PEIM, EDK_COMPONENT_TYPE_RELOCATABLE_PEIM, \\r
+                                        "PE32_PEIM", EDK_COMPONENT_TYPE_BS_DRIVER, EDK_COMPONENT_TYPE_RT_DRIVER, EDK_COMPONENT_TYPE_SAL_RT_DRIVER, EDK_COMPONENT_TYPE_APPLICATION, "ACPITABLE", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE):\r
             raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         return self.__Token\r
 \r
             raise Warning("Unknown Module type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         return self.__Token\r
 \r
@@ -3717,8 +3738,8 @@ class FdfParser:
             raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
 \r
         Type = self.__Token.strip().upper()\r
             raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
 \r
         Type = self.__Token.strip().upper()\r
-        if Type not in ("RAW", "FREEFORM", "SEC", "PEI_CORE", "PEIM",\\r
-                             "PEI_DXE_COMBO", "DRIVER", "DXE_CORE", "APPLICATION", "FV_IMAGE", "SMM", "SMM_CORE", "MM_STANDALONE", "MM_CORE_STANDALONE"):\r
+        if Type not in ("RAW", "FREEFORM", SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\\r
+                             "PEI_DXE_COMBO", "DRIVER", SUP_MODULE_DXE_CORE, EDK_COMPONENT_TYPE_APPLICATION, "FV_IMAGE", "SMM", SUP_MODULE_SMM_CORE, SUP_MODULE_MM_STANDALONE, SUP_MODULE_MM_CORE_STANDALONE):\r
             raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsToken("="):\r
             raise Warning("Unknown FV type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
 \r
         if not self.__IsToken("="):\r
@@ -3730,11 +3751,11 @@ class FdfParser:
             if self.__Token == 'PCD':\r
                 if not self.__IsToken( "("):\r
                     raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
             if self.__Token == 'PCD':\r
                 if not self.__IsToken( "("):\r
                     raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
-                PcdPair = self.__GetNextPcdName()\r
+                PcdPair = self.__GetNextPcdSettings()\r
                 if not self.__IsToken( ")"):\r
                     raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
                 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
                 if not self.__IsToken( ")"):\r
                     raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
                 self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
-            \r
+\r
         NameGuid = self.__Token\r
 \r
         KeepReloc = None\r
         NameGuid = self.__Token\r
 \r
         KeepReloc = None\r
@@ -3749,12 +3770,11 @@ class FdfParser:
 \r
         KeyStringList = []\r
         if self.__GetNextToken():\r
 \r
         KeyStringList = []\r
         if self.__GetNextToken():\r
-            Pattern = re.compile(r'([a-zA-Z0-9\-]+|\$\(TARGET\)|\*)_([a-zA-Z0-9\-]+|\$\(TOOL_CHAIN_TAG\)|\*)_([a-zA-Z0-9\-]+|\$\(ARCH\)|\*)')\r
-            if Pattern.match(self.__Token):\r
+            if TokenFindPattern.match(self.__Token):\r
                 KeyStringList.append(self.__Token)\r
                 if self.__IsToken(","):\r
                     while self.__GetNextToken():\r
                 KeyStringList.append(self.__Token)\r
                 if self.__IsToken(","):\r
                     while self.__GetNextToken():\r
-                        if not Pattern.match(self.__Token):\r
+                        if not TokenFindPattern.match(self.__Token):\r
                             raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                         KeyStringList.append(self.__Token)\r
 \r
                             raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                         KeyStringList.append(self.__Token)\r
 \r
@@ -3775,7 +3795,7 @@ class FdfParser:
 \r
         AlignValue = ""\r
         if self.__GetAlignment():\r
 \r
         AlignValue = ""\r
         if self.__GetAlignment():\r
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             #For FFS, Auto is default option same to ""\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
             #For FFS, Auto is default option same to ""\r
@@ -3791,7 +3811,7 @@ class FdfParser:
             Rule.CheckSum = CheckSum\r
             Rule.Fixed = Fixed\r
             Rule.KeyStringList = KeyStringList\r
             Rule.CheckSum = CheckSum\r
             Rule.Fixed = Fixed\r
             Rule.KeyStringList = KeyStringList\r
-            if KeepReloc != None:\r
+            if KeepReloc is not None:\r
                 Rule.KeepReloc = KeepReloc\r
 \r
             while True:\r
                 Rule.KeepReloc = KeepReloc\r
 \r
             while True:\r
@@ -3812,8 +3832,8 @@ class FdfParser:
 \r
             SectionName = self.__Token\r
 \r
 \r
             SectionName = self.__Token\r
 \r
-            if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
-                                    "UI", "PEI_DEPEX", "VERSION", "SUBTYPE_GUID", "SMM_DEPEX"):\r
+            if SectionName not in ("COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
+                                    BINARY_FILE_TYPE_UI, BINARY_FILE_TYPE_PEI_DEPEX, "VERSION", "SUBTYPE_GUID", BINARY_FILE_TYPE_SMM_DEPEX):\r
                 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
 \r
 \r
                 raise Warning("Unknown leaf section name '%s'" % SectionName, self.FileName, self.CurrentLineNumber)\r
 \r
 \r
@@ -3825,10 +3845,10 @@ class FdfParser:
 \r
             SectAlignment = ""\r
             if self.__GetAlignment():\r
 \r
             SectAlignment = ""\r
             if self.__GetAlignment():\r
-                if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+                if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                         "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                     raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                                         "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                     raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
-                if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
+                if self.__Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE):\r
                     raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
                 SectAlignment = self.__Token\r
 \r
                     raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
                 SectAlignment = self.__Token\r
 \r
@@ -3847,7 +3867,7 @@ class FdfParser:
             Rule.CheckSum = CheckSum\r
             Rule.Fixed = Fixed\r
             Rule.KeyStringList = KeyStringList\r
             Rule.CheckSum = CheckSum\r
             Rule.Fixed = Fixed\r
             Rule.KeyStringList = KeyStringList\r
-            if KeepReloc != None:\r
+            if KeepReloc is not None:\r
                 Rule.KeepReloc = KeepReloc\r
             Rule.FileExtension = Ext\r
             Rule.FileName = self.__Token\r
                 Rule.KeepReloc = KeepReloc\r
             Rule.FileExtension = Ext\r
             Rule.FileName = self.__Token\r
@@ -3869,8 +3889,8 @@ class FdfParser:
             return False\r
         SectionName = self.__Token\r
 \r
             return False\r
         SectionName = self.__Token\r
 \r
-        if SectionName not in ("COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
-                               "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
+        if SectionName not in ("COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
+                               BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_SMM_DEPEX):\r
             self.__UndoToken()\r
             return False\r
 \r
             self.__UndoToken()\r
             return False\r
 \r
@@ -3900,12 +3920,12 @@ class FdfParser:
                 FvImageSectionObj.FvName = None\r
 \r
             else:\r
                 FvImageSectionObj.FvName = None\r
 \r
             else:\r
-                if not self.__IsKeyword("FV"):\r
-                    raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
+                if not self.__IsKeyword(BINARY_FILE_TYPE_FV):\r
+                    raise Warning("expected BINARY_FILE_TYPE_FV", self.FileName, self.CurrentLineNumber)\r
                 FvImageSectionObj.FvFileType = self.__Token\r
 \r
                 if self.__GetAlignment():\r
                 FvImageSectionObj.FvFileType = self.__Token\r
 \r
                 if self.__GetAlignment():\r
-                    if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+                    if self.__Token not in ("8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                             "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                         raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                     FvImageSectionObj.Alignment = self.__Token\r
                                             "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                         raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                     FvImageSectionObj.Alignment = self.__Token\r
@@ -3913,8 +3933,8 @@ class FdfParser:
                 if self.__IsToken('|'):\r
                     FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
                 elif self.__GetNextToken():\r
                 if self.__IsToken('|'):\r
                     FvImageSectionObj.FvFileExtension = self.__GetFileExtension()\r
                 elif self.__GetNextToken():\r
-                    if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
-                               "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
+                    if self.__Token not in ("}", "COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
+                               BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_SMM_DEPEX):\r
                         FvImageSectionObj.FvFileName = self.__Token\r
                     else:\r
                         self.__UndoToken()\r
                         FvImageSectionObj.FvFileName = self.__Token\r
                     else:\r
                         self.__UndoToken()\r
@@ -3973,10 +3993,10 @@ class FdfParser:
                 EfiSectionObj.BuildNum = self.__Token\r
 \r
         if self.__GetAlignment():\r
                 EfiSectionObj.BuildNum = self.__Token\r
 \r
         if self.__GetAlignment():\r
-            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K" ,"64K", "128K",\r
+            if self.__Token not in ("Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K""64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"):\r
                 raise Warning("Incorrect alignment '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
-            if self.__Token == 'Auto' and (not SectionName == 'PE32') and (not SectionName == 'TE'):\r
+            if self.__Token == 'Auto' and (not SectionName == BINARY_FILE_TYPE_PE32) and (not SectionName == BINARY_FILE_TYPE_TE):\r
                 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
             EfiSectionObj.Alignment = self.__Token\r
 \r
                 raise Warning("Auto alignment can only be used in PE32 or TE section ", self.FileName, self.CurrentLineNumber)\r
             EfiSectionObj.Alignment = self.__Token\r
 \r
@@ -3986,7 +4006,7 @@ class FdfParser:
                     EfiSectionObj.KeepReloc = False\r
                 else:\r
                     EfiSectionObj.KeepReloc = True\r
                     EfiSectionObj.KeepReloc = False\r
                 else:\r
                     EfiSectionObj.KeepReloc = True\r
-                if Obj.KeepReloc != None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
+                if Obj.KeepReloc is not None and Obj.KeepReloc != EfiSectionObj.KeepReloc:\r
                     raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
             else:\r
                 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
                     raise Warning("Section type %s has reloc strip flag conflict with Rule" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
             else:\r
                 raise Warning("Section type %s could not have reloc strip flag" % EfiSectionObj.SectionType, self.FileName, self.CurrentLineNumber)\r
@@ -3995,23 +4015,23 @@ class FdfParser:
         if self.__IsToken('|'):\r
             EfiSectionObj.FileExtension = self.__GetFileExtension()\r
         elif self.__GetNextToken():\r
         if self.__IsToken('|'):\r
             EfiSectionObj.FileExtension = self.__GetFileExtension()\r
         elif self.__GetNextToken():\r
-            if self.__Token not in ("}", "COMPAT16", "PE32", "PIC", "TE", "FV_IMAGE", "RAW", "DXE_DEPEX",\\r
-                       "UI", "VERSION", "PEI_DEPEX", "GUID", "SMM_DEPEX"):\r
-                \r
+            if self.__Token not in ("}", "COMPAT16", BINARY_FILE_TYPE_PE32, BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE, "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\\r
+                       BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, BINARY_FILE_TYPE_GUID, BINARY_FILE_TYPE_SMM_DEPEX):\r
+\r
                 if self.__Token.startswith('PCD'):\r
                     self.__UndoToken()\r
                     self.__GetNextWord()\r
                 if self.__Token.startswith('PCD'):\r
                     self.__UndoToken()\r
                     self.__GetNextWord()\r
-                \r
+\r
                     if self.__Token == 'PCD':\r
                         if not self.__IsToken( "("):\r
                             raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
                     if self.__Token == 'PCD':\r
                         if not self.__IsToken( "("):\r
                             raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
-                        PcdPair = self.__GetNextPcdName()\r
+                        PcdPair = self.__GetNextPcdSettings()\r
                         if not self.__IsToken( ")"):\r
                             raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
                         self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
                         if not self.__IsToken( ")"):\r
                             raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
                         self.__Token = 'PCD('+PcdPair[1]+'.'+PcdPair[0]+')'\r
-                        \r
-                EfiSectionObj.FileName = self.__Token        \r
-                            \r
+\r
+                EfiSectionObj.FileName = self.__Token\r
+\r
             else:\r
                 self.__UndoToken()\r
         else:\r
             else:\r
                 self.__UndoToken()\r
         else:\r
@@ -4024,13 +4044,13 @@ class FdfParser:
     #\r
     #   Get whether a section could be optional\r
     #\r
     #\r
     #   Get whether a section could be optional\r
     #\r
-    #   @param  self        The object pointer\r
     #   @param  SectionType The section type to check\r
     #   @retval True        section could be optional\r
     #   @retval False       section never optional\r
     #\r
     #   @param  SectionType The section type to check\r
     #   @retval True        section could be optional\r
     #   @retval False       section never optional\r
     #\r
-    def __RuleSectionCouldBeOptional(self, SectionType):\r
-        if SectionType in ("DXE_DEPEX", "UI", "VERSION", "PEI_DEPEX", "RAW", "SMM_DEPEX"):\r
+    @staticmethod\r
+    def __RuleSectionCouldBeOptional(SectionType):\r
+        if SectionType in (BINARY_FILE_TYPE_DXE_DEPEX, BINARY_FILE_TYPE_UI, "VERSION", BINARY_FILE_TYPE_PEI_DEPEX, "RAW", BINARY_FILE_TYPE_SMM_DEPEX):\r
             return True\r
         else:\r
             return False\r
             return True\r
         else:\r
             return False\r
@@ -4039,12 +4059,12 @@ class FdfParser:
     #\r
     #   Get whether a section could have build number information\r
     #\r
     #\r
     #   Get whether a section could have build number information\r
     #\r
-    #   @param  self        The object pointer\r
     #   @param  SectionType The section type to check\r
     #   @retval True        section could have build number information\r
     #   @retval False       section never have build number information\r
     #\r
     #   @param  SectionType The section type to check\r
     #   @retval True        section could have build number information\r
     #   @retval False       section never have build number information\r
     #\r
-    def __RuleSectionCouldHaveBuildNum(self, SectionType):\r
+    @staticmethod\r
+    def __RuleSectionCouldHaveBuildNum(SectionType):\r
         if SectionType in ("VERSION"):\r
             return True\r
         else:\r
         if SectionType in ("VERSION"):\r
             return True\r
         else:\r
@@ -4054,13 +4074,13 @@ class FdfParser:
     #\r
     #   Get whether a section could have string\r
     #\r
     #\r
     #   Get whether a section could have string\r
     #\r
-    #   @param  self        The object pointer\r
     #   @param  SectionType The section type to check\r
     #   @retval True        section could have string\r
     #   @retval False       section never have string\r
     #\r
     #   @param  SectionType The section type to check\r
     #   @retval True        section could have string\r
     #   @retval False       section never have string\r
     #\r
-    def __RuleSectionCouldHaveString(self, SectionType):\r
-        if SectionType in ("UI", "VERSION"):\r
+    @staticmethod\r
+    def __RuleSectionCouldHaveString(SectionType):\r
+        if SectionType in (BINARY_FILE_TYPE_UI, "VERSION"):\r
             return True\r
         else:\r
             return False\r
             return True\r
         else:\r
             return False\r
@@ -4077,32 +4097,32 @@ class FdfParser:
         if SectionType == "COMPAT16":\r
             if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
         if SectionType == "COMPAT16":\r
             if FileType not in ("COMPAT16", "SEC_COMPAT16"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "PE32":\r
-            if FileType not in ("PE32", "SEC_PE32"):\r
+        elif SectionType == BINARY_FILE_TYPE_PE32:\r
+            if FileType not in (BINARY_FILE_TYPE_PE32, "SEC_PE32"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "PIC":\r
-            if FileType not in ("PIC", "PIC"):\r
+        elif SectionType == BINARY_FILE_TYPE_PIC:\r
+            if FileType not in (BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_PIC):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "TE":\r
-            if FileType not in ("TE", "SEC_TE"):\r
+        elif SectionType == BINARY_FILE_TYPE_TE:\r
+            if FileType not in (BINARY_FILE_TYPE_TE, "SEC_TE"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == "RAW":\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == "RAW":\r
-            if FileType not in ("BIN", "SEC_BIN", "RAW", "ASL", "ACPI"):\r
+            if FileType not in (BINARY_FILE_TYPE_BIN, "SEC_BIN", "RAW", "ASL", "ACPI"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "DXE_DEPEX" or SectionType == "SMM_DEPEX":\r
-            if FileType not in ("DXE_DEPEX", "SEC_DXE_DEPEX", "SMM_DEPEX"):\r
+        elif SectionType == BINARY_FILE_TYPE_DXE_DEPEX or SectionType == BINARY_FILE_TYPE_SMM_DEPEX:\r
+            if FileType not in (BINARY_FILE_TYPE_DXE_DEPEX, "SEC_DXE_DEPEX", BINARY_FILE_TYPE_SMM_DEPEX):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "UI":\r
-            if FileType not in ("UI", "SEC_UI"):\r
+        elif SectionType == BINARY_FILE_TYPE_UI:\r
+            if FileType not in (BINARY_FILE_TYPE_UI, "SEC_UI"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == "VERSION":\r
             if FileType not in ("VERSION", "SEC_VERSION"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == "VERSION":\r
             if FileType not in ("VERSION", "SEC_VERSION"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "PEI_DEPEX":\r
-            if FileType not in ("PEI_DEPEX", "SEC_PEI_DEPEX"):\r
+        elif SectionType == BINARY_FILE_TYPE_PEI_DEPEX:\r
+            if FileType not in (BINARY_FILE_TYPE_PEI_DEPEX, "SEC_PEI_DEPEX"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
-        elif SectionType == "GUID":\r
-            if FileType not in ("PE32", "SEC_GUID"):\r
+        elif SectionType == BINARY_FILE_TYPE_GUID:\r
+            if FileType not in (BINARY_FILE_TYPE_PE32, "SEC_GUID"):\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
 \r
     ## __GetRuleEncapsulationSection() method\r
                 raise Warning("Incorrect section file type '%s'" % FileType, self.FileName, self.CurrentLineNumber)\r
 \r
     ## __GetRuleEncapsulationSection() method\r
@@ -4299,7 +4319,7 @@ class FdfParser:
             raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
         if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
             if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
             raise Warning("expected Component type", self.FileName, self.CurrentLineNumber)\r
         if self.__Token not in ("FIT", "PAL_B", "PAL_A", "OEM"):\r
             if not self.__Token.startswith("0x") or len(self.__Token) < 3 or len(self.__Token) > 4 or \\r
-                not self.__HexDigit(self.__Token[2]) or not self.__HexDigit(self.__Token[-1]):\r
+                not self.__Token[2] in string.hexdigits or not self.__Token[-1] in string.hexdigits:\r
                 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         CompStatementObj.CompType = self.__Token\r
 \r
                 raise Warning("Unknown location type '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         CompStatementObj.CompType = self.__Token\r
 \r
@@ -4313,7 +4333,7 @@ class FdfParser:
             raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
 \r
         Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
             raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
 \r
         Pattern = re.compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', re.DOTALL)\r
-        if Pattern.match(self.__Token) == None:\r
+        if Pattern.match(self.__Token) is None:\r
             raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         CompStatementObj.CompVer = self.__Token\r
 \r
             raise Warning("Unknown version format '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         CompStatementObj.CompVer = self.__Token\r
 \r
@@ -4398,7 +4418,7 @@ class FdfParser:
             self.SectionParser(S)\r
             self.__UndoToken()\r
             return False\r
             self.SectionParser(S)\r
             self.__UndoToken()\r
             return False\r
-        \r
+\r
         self.__UndoToken()\r
         if not self.__IsToken("[OptionRom.", True):\r
             raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
         self.__UndoToken()\r
         if not self.__IsToken("[OptionRom.", True):\r
             raise Warning("Unknown Keyword '%s'" % self.__Token, self.FileName, self.CurrentLineNumber)\r
@@ -4417,7 +4437,7 @@ class FdfParser:
             isFile = self.__GetOptRomFileStatement(OptRomObj)\r
             if not isInf and not isFile:\r
                 break\r
             isFile = self.__GetOptRomFileStatement(OptRomObj)\r
             if not isInf and not isFile:\r
                 break\r
-            \r
+\r
         return True\r
 \r
     ## __GetOptRomInfStatement() method\r
         return True\r
 \r
     ## __GetOptRomInfStatement() method\r
@@ -4458,9 +4478,9 @@ class FdfParser:
             else:\r
                 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
 \r
             else:\r
                 self.Profile.InfDict['ArchTBD'].append(ffsInf.InfFileName)\r
 \r
-        \r
+\r
         self.__GetOptRomOverrides (ffsInf)\r
         self.__GetOptRomOverrides (ffsInf)\r
-            \r
+\r
         Obj.FfsList.append(ffsInf)\r
         return True\r
 \r
         Obj.FfsList.append(ffsInf)\r
         return True\r
 \r
@@ -4473,7 +4493,7 @@ class FdfParser:
     #\r
     def __GetOptRomOverrides(self, Obj):\r
         if self.__IsToken('{'):\r
     #\r
     def __GetOptRomOverrides(self, Obj):\r
         if self.__IsToken('{'):\r
-            Overrides = OptionRom.OverrideAttribs()\r
+            Overrides = OptRomInfStatement.OverrideAttribs()\r
             while True:\r
                 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
                     if not self.__IsToken( "="):\r
             while True:\r
                 if self.__IsKeyword( "PCI_VENDOR_ID"):\r
                     if not self.__IsToken( "="):\r
@@ -4522,7 +4542,7 @@ class FdfParser:
                     EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
 \r
             Obj.OverrideAttribs = Overrides\r
                     EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
 \r
             Obj.OverrideAttribs = Overrides\r
-            \r
+\r
     ## __GetOptRomFileStatement() method\r
     #\r
     #   Get FILE statements\r
     ## __GetOptRomFileStatement() method\r
     #\r
     #   Get FILE statements\r
@@ -4539,7 +4559,7 @@ class FdfParser:
 \r
         FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
 \r
 \r
         FfsFileObj = OptRomFileStatement.OptRomFileStatement()\r
 \r
-        if not self.__IsKeyword("EFI") and not self.__IsKeyword("BIN"):\r
+        if not self.__IsKeyword("EFI") and not self.__IsKeyword(BINARY_FILE_TYPE_BIN):\r
             raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
         FfsFileObj.FileType = self.__Token\r
 \r
             raise Warning("expected Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
         FfsFileObj.FileType = self.__Token\r
 \r
@@ -4554,7 +4574,7 @@ class FdfParser:
 \r
         if FfsFileObj.FileType == 'EFI':\r
             self.__GetOptRomOverrides(FfsFileObj)\r
 \r
         if FfsFileObj.FileType == 'EFI':\r
             self.__GetOptRomOverrides(FfsFileObj)\r
-        \r
+\r
         Obj.FfsList.append(FfsFileObj)\r
 \r
         return True\r
         Obj.FfsList.append(FfsFileObj)\r
 \r
         return True\r
@@ -4570,14 +4590,14 @@ class FdfParser:
     def __GetCapInFd (self, FdName):\r
 \r
         CapList = []\r
     def __GetCapInFd (self, FdName):\r
 \r
         CapList = []\r
-        if FdName.upper() in self.Profile.FdDict.keys():\r
+        if FdName.upper() in self.Profile.FdDict:\r
             FdObj = self.Profile.FdDict[FdName.upper()]\r
             for elementRegion in FdObj.RegionList:\r
                 if elementRegion.RegionType == 'CAPSULE':\r
                     for elementRegionData in elementRegion.RegionDataList:\r
                         if elementRegionData.endswith(".cap"):\r
                             continue\r
             FdObj = self.Profile.FdDict[FdName.upper()]\r
             for elementRegion in FdObj.RegionList:\r
                 if elementRegion.RegionType == 'CAPSULE':\r
                     for elementRegionData in elementRegion.RegionDataList:\r
                         if elementRegionData.endswith(".cap"):\r
                             continue\r
-                        if elementRegionData != None and elementRegionData.upper() not in CapList:\r
+                        if elementRegionData is not None and elementRegionData.upper() not in CapList:\r
                             CapList.append(elementRegionData.upper())\r
         return CapList\r
 \r
                             CapList.append(elementRegionData.upper())\r
         return CapList\r
 \r
@@ -4593,15 +4613,15 @@ class FdfParser:
     def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
 \r
         for CapsuleDataObj in CapObj.CapsuleDataList :\r
     def __GetReferencedFdCapTuple(self, CapObj, RefFdList = [], RefFvList = []):\r
 \r
         for CapsuleDataObj in CapObj.CapsuleDataList :\r
-            if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName != None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
+            if hasattr(CapsuleDataObj, 'FvName') and CapsuleDataObj.FvName is not None and CapsuleDataObj.FvName.upper() not in RefFvList:\r
                 RefFvList.append (CapsuleDataObj.FvName.upper())\r
                 RefFvList.append (CapsuleDataObj.FvName.upper())\r
-            elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName != None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
-                RefFdList.append (CapsuleDataObj.FdName.upper())            \r
-            elif CapsuleDataObj.Ffs != None:\r
+            elif hasattr(CapsuleDataObj, 'FdName') and CapsuleDataObj.FdName is not None and CapsuleDataObj.FdName.upper() not in RefFdList:\r
+                RefFdList.append (CapsuleDataObj.FdName.upper())\r
+            elif CapsuleDataObj.Ffs is not None:\r
                 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
                 if isinstance(CapsuleDataObj.Ffs, FfsFileStatement.FileStatement):\r
-                    if CapsuleDataObj.Ffs.FvName != None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
+                    if CapsuleDataObj.Ffs.FvName is not None and CapsuleDataObj.Ffs.FvName.upper() not in RefFvList:\r
                         RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
                         RefFvList.append(CapsuleDataObj.Ffs.FvName.upper())\r
-                    elif CapsuleDataObj.Ffs.FdName != None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
+                    elif CapsuleDataObj.Ffs.FdName is not None and CapsuleDataObj.Ffs.FdName.upper() not in RefFdList:\r
                         RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
                     else:\r
                         self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
                         RefFdList.append(CapsuleDataObj.Ffs.FdName.upper())\r
                     else:\r
                         self.__GetReferencedFdFvTupleFromSection(CapsuleDataObj.Ffs, RefFdList, RefFvList)\r
@@ -4617,14 +4637,14 @@ class FdfParser:
     def __GetFvInFd (self, FdName):\r
 \r
         FvList = []\r
     def __GetFvInFd (self, FdName):\r
 \r
         FvList = []\r
-        if FdName.upper() in self.Profile.FdDict.keys():\r
+        if FdName.upper() in self.Profile.FdDict:\r
             FdObj = self.Profile.FdDict[FdName.upper()]\r
             for elementRegion in FdObj.RegionList:\r
             FdObj = self.Profile.FdDict[FdName.upper()]\r
             for elementRegion in FdObj.RegionList:\r
-                if elementRegion.RegionType == 'FV':\r
+                if elementRegion.RegionType == BINARY_FILE_TYPE_FV:\r
                     for elementRegionData in elementRegion.RegionDataList:\r
                         if elementRegionData.endswith(".fv"):\r
                             continue\r
                     for elementRegionData in elementRegion.RegionDataList:\r
                         if elementRegionData.endswith(".fv"):\r
                             continue\r
-                        if elementRegionData != None and elementRegionData.upper() not in FvList:\r
+                        if elementRegionData is not None and elementRegionData.upper() not in FvList:\r
                             FvList.append(elementRegionData.upper())\r
         return FvList\r
 \r
                             FvList.append(elementRegionData.upper())\r
         return FvList\r
 \r
@@ -4641,9 +4661,9 @@ class FdfParser:
 \r
         for FfsObj in FvObj.FfsList:\r
             if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
 \r
         for FfsObj in FvObj.FfsList:\r
             if isinstance(FfsObj, FfsFileStatement.FileStatement):\r
-                if FfsObj.FvName != None and FfsObj.FvName.upper() not in RefFvList:\r
+                if FfsObj.FvName is not None and FfsObj.FvName.upper() not in RefFvList:\r
                     RefFvList.append(FfsObj.FvName.upper())\r
                     RefFvList.append(FfsObj.FvName.upper())\r
-                elif FfsObj.FdName != None and FfsObj.FdName.upper() not in RefFdList:\r
+                elif FfsObj.FdName is not None and FfsObj.FdName.upper() not in RefFdList:\r
                     RefFdList.append(FfsObj.FdName.upper())\r
                 else:\r
                     self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
                     RefFdList.append(FfsObj.FdName.upper())\r
                 else:\r
                     self.__GetReferencedFdFvTupleFromSection(FfsObj, RefFdList, RefFvList)\r
@@ -4664,9 +4684,9 @@ class FdfParser:
         while SectionStack != []:\r
             SectionObj = SectionStack.pop()\r
             if isinstance(SectionObj, FvImageSection.FvImageSection):\r
         while SectionStack != []:\r
             SectionObj = SectionStack.pop()\r
             if isinstance(SectionObj, FvImageSection.FvImageSection):\r
-                if SectionObj.FvName != None and SectionObj.FvName.upper() not in FvList:\r
+                if SectionObj.FvName is not None and SectionObj.FvName.upper() not in FvList:\r
                     FvList.append(SectionObj.FvName.upper())\r
                     FvList.append(SectionObj.FvName.upper())\r
-                if SectionObj.Fv != None and SectionObj.Fv.UiFvName != None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
+                if SectionObj.Fv is not None and SectionObj.Fv.UiFvName is not None and SectionObj.Fv.UiFvName.upper() not in FvList:\r
                     FvList.append(SectionObj.Fv.UiFvName.upper())\r
                     self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
 \r
                     FvList.append(SectionObj.Fv.UiFvName.upper())\r
                     self.__GetReferencedFdFvTuple(SectionObj.Fv, FdList, FvList)\r
 \r
@@ -4686,17 +4706,17 @@ class FdfParser:
         # Check the cycle between FV and FD image\r
         #\r
         MaxLength = len (self.Profile.FvDict)\r
         # Check the cycle between FV and FD image\r
         #\r
         MaxLength = len (self.Profile.FvDict)\r
-        for FvName in self.Profile.FvDict.keys():\r
+        for FvName in self.Profile.FvDict:\r
             LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
             RefFvStack = []\r
             RefFvStack.append(FvName)\r
             FdAnalyzedList = []\r
             LogStr = "\nCycle Reference Checking for FV: %s\n" % FvName\r
             RefFvStack = []\r
             RefFvStack.append(FvName)\r
             FdAnalyzedList = []\r
-            \r
+\r
             Index = 0\r
             while RefFvStack != [] and Index < MaxLength:\r
                 Index = Index + 1\r
                 FvNameFromStack = RefFvStack.pop()\r
             Index = 0\r
             while RefFvStack != [] and Index < MaxLength:\r
                 Index = Index + 1\r
                 FvNameFromStack = RefFvStack.pop()\r
-                if FvNameFromStack.upper() in self.Profile.FvDict.keys():\r
+                if FvNameFromStack.upper() in self.Profile.FvDict:\r
                     FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
                 else:\r
                     continue\r
                     FvObj = self.Profile.FvDict[FvNameFromStack.upper()]\r
                 else:\r
                     continue\r
@@ -4713,7 +4733,7 @@ class FdfParser:
                     FvInFdList = self.__GetFvInFd(RefFdName)\r
                     if FvInFdList != []:\r
                         for FvNameInFd in FvInFdList:\r
                     FvInFdList = self.__GetFvInFd(RefFdName)\r
                     if FvInFdList != []:\r
                         for FvNameInFd in FvInFdList:\r
-                            LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
+                            LogStr += "FD %s contains FV %s\n" % (RefFdName, FvNameInFd)\r
                             if FvNameInFd not in RefFvStack:\r
                                 RefFvStack.append(FvNameInFd)\r
 \r
                             if FvNameInFd not in RefFvStack:\r
                                 RefFvStack.append(FvNameInFd)\r
 \r
@@ -4735,7 +4755,7 @@ class FdfParser:
         # Check the cycle between Capsule and FD image\r
         #\r
         MaxLength = len (self.Profile.CapsuleDict)\r
         # Check the cycle between Capsule and FD image\r
         #\r
         MaxLength = len (self.Profile.CapsuleDict)\r
-        for CapName in self.Profile.CapsuleDict.keys():\r
+        for CapName in self.Profile.CapsuleDict:\r
             #\r
             # Capsule image to be checked.\r
             #\r
             #\r
             # Capsule image to be checked.\r
             #\r
@@ -4744,12 +4764,12 @@ class FdfParser:
             RefCapStack.append(CapName)\r
             FdAnalyzedList = []\r
             FvAnalyzedList = []\r
             RefCapStack.append(CapName)\r
             FdAnalyzedList = []\r
             FvAnalyzedList = []\r
-            \r
+\r
             Index = 0\r
             while RefCapStack != [] and Index < MaxLength:\r
                 Index = Index + 1\r
                 CapNameFromStack = RefCapStack.pop()\r
             Index = 0\r
             while RefCapStack != [] and Index < MaxLength:\r
                 Index = Index + 1\r
                 CapNameFromStack = RefCapStack.pop()\r
-                if CapNameFromStack.upper() in self.Profile.CapsuleDict.keys():\r
+                if CapNameFromStack.upper() in self.Profile.CapsuleDict:\r
                     CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
                 else:\r
                     continue\r
                     CapObj = self.Profile.CapsuleDict[CapNameFromStack.upper()]\r
                 else:\r
                     continue\r
@@ -4769,7 +4789,7 @@ class FdfParser:
                         CapInFdList = self.__GetCapInFd(RefFdName)\r
                         if CapInFdList != []:\r
                             for CapNameInFd in CapInFdList:\r
                         CapInFdList = self.__GetCapInFd(RefFdName)\r
                         if CapInFdList != []:\r
                             for CapNameInFd in CapInFdList:\r
-                                LogStr += "FD %s contains Capsule %s\n" % (RefFdName,CapNameInFd)\r
+                                LogStr += "FD %s contains Capsule %s\n" % (RefFdName, CapNameInFd)\r
                                 if CapNameInFd not in RefCapStack:\r
                                     RefCapStack.append(CapNameInFd)\r
 \r
                                 if CapNameInFd not in RefCapStack:\r
                                     RefCapStack.append(CapNameInFd)\r
 \r
@@ -4780,7 +4800,7 @@ class FdfParser:
                         FvInFdList = self.__GetFvInFd(RefFdName)\r
                         if FvInFdList != []:\r
                             for FvNameInFd in FvInFdList:\r
                         FvInFdList = self.__GetFvInFd(RefFdName)\r
                         if FvInFdList != []:\r
                             for FvNameInFd in FvInFdList:\r
-                                LogStr += "FD %s contains FV %s\n" % (RefFdName,FvNameInFd)\r
+                                LogStr += "FD %s contains FV %s\n" % (RefFdName, FvNameInFd)\r
                                 if FvNameInFd not in RefFvList:\r
                                     RefFvList.append(FvNameInFd)\r
 \r
                                 if FvNameInFd not in RefFvList:\r
                                     RefFvList.append(FvNameInFd)\r
 \r
@@ -4794,7 +4814,7 @@ class FdfParser:
                         if RefFvName in FvAnalyzedList:\r
                             continue\r
                         LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
                         if RefFvName in FvAnalyzedList:\r
                             continue\r
                         LogStr += "Capsule %s contains FV %s\n" % (CapNameFromStack, RefFvName)\r
-                        if RefFvName.upper() in self.Profile.FvDict.keys():\r
+                        if RefFvName.upper() in self.Profile.FvDict:\r
                             FvObj = self.Profile.FvDict[RefFvName.upper()]\r
                         else:\r
                             continue\r
                             FvObj = self.Profile.FvDict[RefFvName.upper()]\r
                         else:\r
                             continue\r
@@ -4811,16 +4831,16 @@ if __name__ == "__main__":
     import sys\r
     try:\r
         test_file = sys.argv[1]\r
     import sys\r
     try:\r
         test_file = sys.argv[1]\r
-    except IndexError, v:\r
-        print "Usage: %s filename" % sys.argv[0]\r
+    except IndexError as v:\r
+        print("Usage: %s filename" % sys.argv[0])\r
         sys.exit(1)\r
 \r
     parser = FdfParser(test_file)\r
     try:\r
         parser.ParseFile()\r
         parser.CycleReferenceCheck()\r
         sys.exit(1)\r
 \r
     parser = FdfParser(test_file)\r
     try:\r
         parser.ParseFile()\r
         parser.CycleReferenceCheck()\r
-    except Warning, X:\r
-        print str(X)\r
+    except Warning as X:\r
+        print(str(X))\r
     else:\r
     else:\r
-        print "Success!"\r
+        print("Success!")\r
 \r
 \r