]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/GenFds/FdfParser.py
BaseTools:Make BaseTools support new rules to generate RAW FFS FILE
[mirror_edk2.git] / BaseTools / Source / Python / GenFds / FdfParser.py
index 9e806de0d294a6dea3a3cfc61eb576b7876d766b..fb5fd85e0a825ebf3341e2ca706af9b0b37b57c3 100644 (file)
@@ -4,13 +4,7 @@
 #  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 #  Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
 #\r
 #  Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
 #  Copyright (c) 2015, Hewlett Packard Enterprise Development, L.P.<BR>\r
 #\r
-#  This program and the accompanying materials\r
-#  are licensed and made available under the terms and conditions of the BSD License\r
-#  which accompanies this distribution.  The full text of the license may be found at\r
-#  http://opensource.org/licenses/bsd-license.php\r
-#\r
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 #\r
 \r
 ##\r
 #\r
 \r
 ##\r
@@ -24,7 +18,7 @@ from uuid import UUID
 \r
 from Common.BuildToolError import *\r
 from Common import EdkLogger\r
 \r
 from Common.BuildToolError import *\r
 from Common import EdkLogger\r
-from Common.Misc import PathClass, tdict\r
+from Common.Misc import PathClass, tdict, ProcessDuplicatedInf\r
 from Common.StringUtils import NormPath, ReplaceMacro\r
 from Common import GlobalData\r
 from Common.Expression import *\r
 from Common.StringUtils import NormPath, ReplaceMacro\r
 from Common import GlobalData\r
 from Common.Expression import *\r
@@ -53,8 +47,6 @@ from .CapsuleData import CapsuleFfs, CapsulePayload, CapsuleFv, CapsuleFd, Capsu
 from .RuleComplexFile import RuleComplexFile\r
 from .RuleSimpleFile import RuleSimpleFile\r
 from .EfiSection import EfiSection\r
 from .RuleComplexFile import RuleComplexFile\r
 from .RuleSimpleFile import RuleSimpleFile\r
 from .EfiSection import EfiSection\r
-from .Vtf import Vtf\r
-from .ComponentStatement import ComponentStatement\r
 from .OptionRom import OPTIONROM\r
 from .OptRomInfStatement import OptRomInfStatement, OverrideAttribs\r
 from .OptRomFileStatement import OptRomFileStatement\r
 from .OptionRom import OPTIONROM\r
 from .OptRomInfStatement import OptRomInfStatement, OverrideAttribs\r
 from .OptRomFileStatement import OptRomFileStatement\r
@@ -64,9 +56,9 @@ T_CHAR_CR = '\r'
 T_CHAR_TAB = '\t'\r
 T_CHAR_DOUBLE_QUOTE = '\"'\r
 T_CHAR_SINGLE_QUOTE = '\''\r
 T_CHAR_TAB = '\t'\r
 T_CHAR_DOUBLE_QUOTE = '\"'\r
 T_CHAR_SINGLE_QUOTE = '\''\r
-T_CHAR_STAR = '*'\r
+T_CHAR_BRACE_R = '}'\r
 \r
 \r
-SEPARATORS = {TAB_EQUAL_SPLIT, TAB_VALUE_SPLIT, TAB_COMMA_SPLIT, '{', '}'}\r
+SEPARATORS = {TAB_EQUAL_SPLIT, TAB_VALUE_SPLIT, TAB_COMMA_SPLIT, '{', T_CHAR_BRACE_R}\r
 ALIGNMENTS = {"Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"}\r
 ALIGNMENT_NOAUTO = ALIGNMENTS - {"Auto"}\r
 ALIGNMENTS = {"Auto", "8", "16", "32", "64", "128", "512", "1K", "4K", "32K", "64K", "128K",\r
                                     "256K", "512K", "1M", "2M", "4M", "8M", "16M"}\r
 ALIGNMENT_NOAUTO = ALIGNMENTS - {"Auto"}\r
@@ -129,6 +121,24 @@ class Warning (Exception):
     def __str__(self):\r
         return self.Message\r
 \r
     def __str__(self):\r
         return self.Message\r
 \r
+    # helper functions to facilitate consistency in warnings\r
+    # each function is for a different common warning\r
+    @staticmethod\r
+    def Expected(Str, File, Line):\r
+        return Warning("expected {}".format(Str), File, Line)\r
+    @staticmethod\r
+    def ExpectedEquals(File, Line):\r
+        return Warning.Expected("'='", File, Line)\r
+    @staticmethod\r
+    def ExpectedCurlyOpen(File, Line):\r
+        return Warning.Expected("'{'", File, Line)\r
+    @staticmethod\r
+    def ExpectedCurlyClose(File, Line):\r
+        return Warning.Expected("'}'", File, Line)\r
+    @staticmethod\r
+    def ExpectedBracketClose(File, Line):\r
+        return Warning.Expected("']'", File, Line)\r
+\r
 ## The Include file content class that used to record file data when parsing include file\r
 #\r
 # May raise Exception when opening file.\r
 ## The Include file content class that used to record file data when parsing include file\r
 #\r
 # May raise Exception when opening file.\r
@@ -143,7 +153,7 @@ class IncludeFileProfile:
         self.FileName = FileName\r
         self.FileLinesList = []\r
         try:\r
         self.FileName = FileName\r
         self.FileLinesList = []\r
         try:\r
-            with open(FileName, "rb", 0) as fsock:\r
+            with open(FileName, "r") as fsock:\r
                 self.FileLinesList = fsock.readlines()\r
                 for index, line in enumerate(self.FileLinesList):\r
                     if not line.endswith(TAB_LINE_BREAK):\r
                 self.FileLinesList = fsock.readlines()\r
                 for index, line in enumerate(self.FileLinesList):\r
                     if not line.endswith(TAB_LINE_BREAK):\r
@@ -184,8 +194,6 @@ class IncludeFileProfile:
 \r
         return (self.FileName, Line - InsertedLines + 1)\r
 \r
 \r
         return (self.FileName, Line - InsertedLines + 1)\r
 \r
-\r
-\r
 ## The FDF content class that used to record file data when parsing FDF\r
 #\r
 # May raise Exception when opening file.\r
 ## The FDF content class that used to record file data when parsing FDF\r
 #\r
 # May raise Exception when opening file.\r
@@ -199,7 +207,7 @@ class FileProfile:
     def __init__(self, FileName):\r
         self.FileLinesList = []\r
         try:\r
     def __init__(self, FileName):\r
         self.FileLinesList = []\r
         try:\r
-            with open(FileName, "rb", 0) as fsock:\r
+            with open(FileName, "r") as fsock:\r
                 self.FileLinesList = fsock.readlines()\r
 \r
         except:\r
                 self.FileLinesList = fsock.readlines()\r
 \r
         except:\r
@@ -218,7 +226,6 @@ class FileProfile:
         self.FdNameNotSet = False\r
         self.FvDict = {}\r
         self.CapsuleDict = {}\r
         self.FdNameNotSet = False\r
         self.FvDict = {}\r
         self.CapsuleDict = {}\r
-        self.VtfList = []\r
         self.RuleDict = {}\r
         self.OptRomDict = {}\r
         self.FmpPayloadDict = {}\r
         self.RuleDict = {}\r
         self.OptRomDict = {}\r
         self.FmpPayloadDict = {}\r
@@ -462,7 +469,6 @@ class FdfParser:
         # [FV.UiName]\r
         # [Capsule.UiName]\r
         # [Rule]: don't take rule section into account, macro is not allowed in this section\r
         # [FV.UiName]\r
         # [Capsule.UiName]\r
         # [Rule]: don't take rule section into account, macro is not allowed in this section\r
-        # [VTF.arch.UiName, arch]\r
         # [OptionRom.DriverName]\r
         self._CurSection = []\r
         Section = Section.strip()[1:-1].upper().replace(' ', '').strip(TAB_SPLIT)\r
         # [OptionRom.DriverName]\r
         self._CurSection = []\r
         Section = Section.strip()[1:-1].upper().replace(' ', '').strip(TAB_SPLIT)\r
@@ -473,12 +479,6 @@ class FdfParser:
 \r
         if Item == TAB_COMMON_DEFINES.upper():\r
             self._CurSection = [TAB_COMMON, TAB_COMMON, TAB_COMMON]\r
 \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(TAB_COMMA_SPLIT)\r
-            if Pos != -1:\r
-                UiName = UiName[:Pos]\r
-            self._CurSection = ['VTF', UiName, ItemList[1]]\r
         elif len(ItemList) > 1:\r
             self._CurSection = [ItemList[0], ItemList[1], TAB_COMMON]\r
         elif len(ItemList) > 0:\r
         elif len(ItemList) > 1:\r
             self._CurSection = [ItemList[0], ItemList[1], TAB_COMMON]\r
         elif len(ItemList) > 0:\r
@@ -516,7 +516,7 @@ class FdfParser:
                     InComment = False\r
                     HashComment = False\r
             # check for */ comment end\r
                     InComment = False\r
                     HashComment = False\r
             # check for */ comment end\r
-            elif InComment and not DoubleSlashComment and not HashComment and self._CurrentChar() == T_CHAR_STAR and self._NextChar() == TAB_BACK_SLASH:\r
+            elif InComment and not DoubleSlashComment and not HashComment and self._CurrentChar() == TAB_STAR and self._NextChar() == TAB_BACK_SLASH:\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
                 self._GetOneChar()\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
                 self._GetOneChar()\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
@@ -535,7 +535,7 @@ class FdfParser:
                 InComment = True\r
                 HashComment = True\r
             # check for /* comment start\r
                 InComment = True\r
                 HashComment = True\r
             # check for /* comment start\r
-            elif self._CurrentChar() == TAB_BACK_SLASH and self._NextChar() == T_CHAR_STAR:\r
+            elif self._CurrentChar() == TAB_BACK_SLASH and self._NextChar() == TAB_STAR:\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
                 self._GetOneChar()\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
                 self._GetOneChar()\r
                 self._SetCurrentCharValue(TAB_SPACE_SPLIT)\r
@@ -563,10 +563,10 @@ class FdfParser:
 \r
             if self._Token == TAB_DEFINE:\r
                 if not self._GetNextToken():\r
 \r
             if self._Token == TAB_DEFINE:\r
                 if not self._GetNextToken():\r
-                    raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("Macro name", self.FileName, self.CurrentLineNumber)\r
                 Macro = self._Token\r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
                 Macro = self._Token\r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                    raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                 Value = self._GetExpression()\r
                 MacroDict[Macro] = Value\r
 \r
                 Value = self._GetExpression()\r
                 MacroDict[Macro] = Value\r
 \r
@@ -575,7 +575,7 @@ class FdfParser:
                 IncludeLine = self.CurrentLineNumber\r
                 IncludeOffset = self.CurrentOffsetWithinLine - len(TAB_INCLUDE)\r
                 if not self._GetNextToken():\r
                 IncludeLine = self.CurrentLineNumber\r
                 IncludeOffset = self.CurrentOffsetWithinLine - len(TAB_INCLUDE)\r
                 if not self._GetNextToken():\r
-                    raise Warning("expected include file name", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("include file name", self.FileName, self.CurrentLineNumber)\r
                 IncFileName = self._Token\r
                 PreIndex = 0\r
                 StartPos = IncFileName.find('$(', PreIndex)\r
                 IncFileName = self._Token\r
                 PreIndex = 0\r
                 StartPos = IncFileName.find('$(', PreIndex)\r
@@ -710,13 +710,13 @@ class FdfParser:
                     EndPos = CurLine.find(')', StartPos+2)\r
                     while StartPos != -1 and EndPos != -1 and self._Token not in {TAB_IF_DEF, TAB_IF_N_DEF, TAB_IF, TAB_ELSE_IF}:\r
                         MacroName = CurLine[StartPos+2: EndPos]\r
                     EndPos = CurLine.find(')', StartPos+2)\r
                     while StartPos != -1 and EndPos != -1 and self._Token not in {TAB_IF_DEF, TAB_IF_N_DEF, TAB_IF, TAB_ELSE_IF}:\r
                         MacroName = CurLine[StartPos+2: EndPos]\r
-                        MacorValue = self._GetMacroValue(MacroName)\r
-                        if MacorValue is not None:\r
-                            CurLine = CurLine.replace('$(' + MacroName + ')', MacorValue, 1)\r
-                            if MacorValue.find('$(') != -1:\r
+                        MacroValue = self._GetMacroValue(MacroName)\r
+                        if MacroValue is not None:\r
+                            CurLine = CurLine.replace('$(' + MacroName + ')', MacroValue, 1)\r
+                            if MacroValue.find('$(') != -1:\r
                                 PreIndex = StartPos\r
                             else:\r
                                 PreIndex = StartPos\r
                             else:\r
-                                PreIndex = StartPos + len(MacorValue)\r
+                                PreIndex = StartPos + len(MacroValue)\r
                         else:\r
                             PreIndex = EndPos + 1\r
                         StartPos = CurLine.find('$(', PreIndex)\r
                         else:\r
                             PreIndex = EndPos + 1\r
                         StartPos = CurLine.find('$(', PreIndex)\r
@@ -731,10 +731,10 @@ class FdfParser:
                     DefineLine = self.CurrentLineNumber - 1\r
                     DefineOffset = self.CurrentOffsetWithinLine - len(TAB_DEFINE)\r
                     if not self._GetNextToken():\r
                     DefineLine = self.CurrentLineNumber - 1\r
                     DefineOffset = self.CurrentOffsetWithinLine - len(TAB_DEFINE)\r
                     if not self._GetNextToken():\r
-                        raise Warning("expected Macro name", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("Macro name", self.FileName, self.CurrentLineNumber)\r
                     Macro = self._Token\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     Macro = self._Token\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
                     Value = self._GetExpression()\r
                     self._SetMacroValue(Macro, Value)\r
 \r
                     Value = self._GetExpression()\r
                     self._SetMacroValue(Macro, Value)\r
@@ -747,7 +747,7 @@ class FdfParser:
                 PcdPair = self._GetNextPcdSettings()\r
                 PcdName = "%s.%s" % (PcdPair[1], PcdPair[0])\r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
                 PcdPair = self._GetNextPcdSettings()\r
                 PcdName = "%s.%s" % (PcdPair[1], PcdPair[0])\r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                    raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
                 Value = self._GetExpression()\r
                 Value = self._EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
 \r
                 Value = self._GetExpression()\r
                 Value = self._EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
@@ -1031,7 +1031,7 @@ class FdfParser:
 \r
     ## _GetNextToken() method\r
     #\r
 \r
     ## _GetNextToken() method\r
     #\r
-    #   Get next token unit before a seperator\r
+    #   Get next token unit before a separator\r
     #   If found, the string value is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
     #   If found, the string value is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
@@ -1048,12 +1048,12 @@ class FdfParser:
         StartLine = self.CurrentLineNumber\r
         while StartLine == self.CurrentLineNumber:\r
             TempChar = self._CurrentChar()\r
         StartLine = self.CurrentLineNumber\r
         while StartLine == self.CurrentLineNumber:\r
             TempChar = self._CurrentChar()\r
-            # Try to find the end char that is not a space and not in seperator tuple.\r
+            # Try to find the end char that is not a space and not in separator tuple.\r
             # That is, when we got a space or any char in the tuple, we got the end of token.\r
             if not str(TempChar).isspace() and TempChar not in SEPARATORS:\r
                 self._GetOneChar()\r
             # That is, when we got a space or any char in the tuple, we got the end of token.\r
             if not str(TempChar).isspace() and TempChar not in SEPARATORS:\r
                 self._GetOneChar()\r
-            # if we happen to meet a seperator as the first char, we must proceed to get it.\r
-            # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
+            # if we happen to meet a separator as the first char, we must proceed to get it.\r
+            # That is, we get a token that is a separator char. normally it is the boundary of other tokens.\r
             elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPARATORS:\r
                 self._GetOneChar()\r
                 break\r
             elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPARATORS:\r
                 self._GetOneChar()\r
                 break\r
@@ -1075,7 +1075,7 @@ class FdfParser:
 \r
     ## _GetNextGuid() method\r
     #\r
 \r
     ## _GetNextGuid() method\r
     #\r
-    #   Get next token unit before a seperator\r
+    #   Get next token unit before a separator\r
     #   If found, the GUID string is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
     #   If found, the GUID string is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
@@ -1085,7 +1085,7 @@ class FdfParser:
     def _GetNextGuid(self):\r
         if not self._GetNextToken():\r
             return False\r
     def _GetNextGuid(self):\r
         if not self._GetNextToken():\r
             return False\r
-        if gGuidPattern.match(self._Token) is not None:\r
+        if GlobalData.gGuidPattern.match(self._Token) is not None:\r
             return True\r
         else:\r
             self._UndoToken()\r
             return True\r
         else:\r
             self._UndoToken()\r
@@ -1127,13 +1127,13 @@ class FdfParser:
         while CurrentLine == self.CurrentLineNumber:\r
 \r
             TempChar = self._CurrentChar()\r
         while CurrentLine == self.CurrentLineNumber:\r
 \r
             TempChar = self._CurrentChar()\r
-            # Try to find the end char that is not a space and not in seperator tuple.\r
+            # Try to find the end char that is not a space and not in separator tuple.\r
             # That is, when we got a space or any char in the tuple, we got the end of token.\r
             if not str(TempChar).isspace() and not TempChar in SEPARATORS:\r
                 if not self._UndoOneChar():\r
                     return\r
             # That is, when we got a space or any char in the tuple, we got the end of token.\r
             if not str(TempChar).isspace() and not TempChar in SEPARATORS:\r
                 if not self._UndoOneChar():\r
                     return\r
-            # if we happen to meet a seperator as the first char, we must proceed to get it.\r
-            # That is, we get a token that is a seperator char. nomally it is the boundary of other tokens.\r
+            # if we happen to meet a separator as the first char, we must proceed to get it.\r
+            # That is, we get a token that is a separator char. normally it is the boundary of other tokens.\r
             elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPARATORS:\r
                 return\r
             else:\r
             elif StartPos == self.CurrentOffsetWithinLine and TempChar in SEPARATORS:\r
                 return\r
             else:\r
@@ -1143,7 +1143,7 @@ class FdfParser:
 \r
     ## _GetNextHexNumber() method\r
     #\r
 \r
     ## _GetNextHexNumber() method\r
     #\r
-    #   Get next HEX data before a seperator\r
+    #   Get next HEX data before a separator\r
     #   If found, the HEX data is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
     #   If found, the HEX data is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
@@ -1153,7 +1153,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 gHexPatternAll.match(self._Token):\r
+        if GlobalData.gHexPatternAll.match(self._Token):\r
             return True\r
         else:\r
             self._UndoToken()\r
             return True\r
         else:\r
             self._UndoToken()\r
@@ -1161,7 +1161,7 @@ class FdfParser:
 \r
     ## _GetNextDecimalNumber() method\r
     #\r
 \r
     ## _GetNextDecimalNumber() method\r
     #\r
-    #   Get next decimal data before a seperator\r
+    #   Get next decimal data before a separator\r
     #   If found, the decimal data is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
     #   If found, the decimal data is put into self._Token\r
     #\r
     #   @param  self        The object pointer\r
@@ -1179,20 +1179,20 @@ class FdfParser:
 \r
     def _GetNextPcdSettings(self):\r
         if not self._GetNextWord():\r
 \r
     def _GetNextPcdSettings(self):\r
         if not self._GetNextWord():\r
-            raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("<PcdTokenSpaceCName>", self.FileName, self.CurrentLineNumber)\r
         pcdTokenSpaceCName = self._Token\r
 \r
         if not self._IsToken(TAB_SPLIT):\r
         pcdTokenSpaceCName = self._Token\r
 \r
         if not self._IsToken(TAB_SPLIT):\r
-            raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected(".", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextWord():\r
 \r
         if not self._GetNextWord():\r
-            raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("<PcdCName>", self.FileName, self.CurrentLineNumber)\r
         pcdCName = self._Token\r
 \r
         Fields = []\r
         while self._IsToken(TAB_SPLIT):\r
             if not self._GetNextPcdWord():\r
         pcdCName = self._Token\r
 \r
         Fields = []\r
         while self._IsToken(TAB_SPLIT):\r
             if not self._GetNextPcdWord():\r
-                raise Warning("expected format of <PcdTokenSpaceCName>.<PcdCName>", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Pcd Fields", self.FileName, self.CurrentLineNumber)\r
             Fields.append(self._Token)\r
 \r
         return (pcdCName, pcdTokenSpaceCName,TAB_SPLIT.join(Fields))\r
             Fields.append(self._Token)\r
 \r
         return (pcdCName, pcdTokenSpaceCName,TAB_SPLIT.join(Fields))\r
@@ -1207,33 +1207,25 @@ class FdfParser:
     #   @retval False       Not able to find a string data, file buffer pointer not changed\r
     #\r
     def _GetStringData(self):\r
     #   @retval False       Not able to find a string data, file buffer pointer not changed\r
     #\r
     def _GetStringData(self):\r
+        QuoteToUse = None\r
         if self._Token.startswith(T_CHAR_DOUBLE_QUOTE) or self._Token.startswith("L\""):\r
         if self._Token.startswith(T_CHAR_DOUBLE_QUOTE) or self._Token.startswith("L\""):\r
-            self._UndoToken()\r
-            self._SkipToToken(T_CHAR_DOUBLE_QUOTE)\r
-            currentLineNumber = self.CurrentLineNumber\r
-\r
-            if not self._SkipToToken(T_CHAR_DOUBLE_QUOTE):\r
-                raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
-            if currentLineNumber != self.CurrentLineNumber:\r
-                raise Warning("Missing Quote \" for String", self.FileName, self.CurrentLineNumber)\r
-            self._Token = self._SkippedChars.rstrip(T_CHAR_DOUBLE_QUOTE)\r
-            return True\r
-\r
+            QuoteToUse = T_CHAR_DOUBLE_QUOTE\r
         elif self._Token.startswith(T_CHAR_SINGLE_QUOTE) or self._Token.startswith("L\'"):\r
         elif self._Token.startswith(T_CHAR_SINGLE_QUOTE) or self._Token.startswith("L\'"):\r
-            self._UndoToken()\r
-            self._SkipToToken(T_CHAR_SINGLE_QUOTE)\r
-            currentLineNumber = self.CurrentLineNumber\r
-\r
-            if not self._SkipToToken(T_CHAR_SINGLE_QUOTE):\r
-                raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
-            if currentLineNumber != self.CurrentLineNumber:\r
-                raise Warning("Missing Quote \' for String", self.FileName, self.CurrentLineNumber)\r
-            self._Token = self._SkippedChars.rstrip(T_CHAR_SINGLE_QUOTE)\r
-            return True\r
-\r
+            QuoteToUse = T_CHAR_SINGLE_QUOTE\r
         else:\r
             return False\r
 \r
         else:\r
             return False\r
 \r
+        self._UndoToken()\r
+        self._SkipToToken(QuoteToUse)\r
+        currentLineNumber = self.CurrentLineNumber\r
+\r
+        if not self._SkipToToken(QuoteToUse):\r
+            raise Warning(QuoteToUse, self.FileName, self.CurrentLineNumber)\r
+        if currentLineNumber != self.CurrentLineNumber:\r
+            raise Warning(QuoteToUse, self.FileName, self.CurrentLineNumber)\r
+        self._Token = self._SkippedChars.rstrip(QuoteToUse)\r
+        return True\r
+\r
     ## _SkipToToken() method\r
     #\r
     #   Search forward in file buffer for the string\r
     ## _SkipToToken() method\r
     #\r
     #   Search forward in file buffer for the string\r
@@ -1322,7 +1314,7 @@ class FdfParser:
             #\r
             # Keep processing sections of the FDF until no new sections or a syntax error is found\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
+            while self._GetFd() or self._GetFv() or self._GetFmp() or self._GetCapsule() or self._GetRule() or self._GetOptionRom():\r
                 pass\r
 \r
         except Warning as X:\r
                 pass\r
 \r
         except Warning as X:\r
@@ -1350,8 +1342,8 @@ class FdfParser:
     def SectionParser(self, section):\r
         S = section.upper()\r
         if not S.startswith("[DEFINES") and not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
     def SectionParser(self, section):\r
         S = section.upper()\r
         if not S.startswith("[DEFINES") and not S.startswith("[FD.") and not S.startswith("[FV.") and not S.startswith("[CAPSULE.") \\r
-            and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM.") and not S.startswith('[FMPPAYLOAD.'):\r
-            raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [VTF.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self.FileName, self.CurrentLineNumber)\r
+             and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM.") and not S.startswith('[FMPPAYLOAD.'):\r
+            raise Warning("Unknown section or section appear sequence error (The correct sequence should be [DEFINES], [FD.], [FV.], [Capsule.], [Rule.], [OptionRom.], [FMPPAYLOAD.])", self.FileName, self.CurrentLineNumber)\r
 \r
     ## _GetDefines() method\r
     #\r
 \r
     ## _GetDefines() method\r
     #\r
@@ -1376,10 +1368,10 @@ class FdfParser:
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
-            raise Warning("expected [DEFINES", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("[DEFINES", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         while self._GetNextWord():\r
             # handle the SET statement\r
 \r
         while self._GetNextWord():\r
             # handle the SET statement\r
@@ -1391,9 +1383,9 @@ class FdfParser:
             Macro = self._Token\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             Macro = self._Token\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken() or self._Token.startswith(TAB_SECTION_START):\r
             if not self._GetNextToken() or self._Token.startswith(TAB_SECTION_START):\r
-                raise Warning("expected MACRO value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("MACRO value", self.FileName, self.CurrentLineNumber)\r
             Value = self._Token\r
 \r
         return False\r
             Value = self._Token\r
 \r
         return False\r
@@ -1424,7 +1416,7 @@ class FdfParser:
         S = self._Token.upper()\r
         if S.startswith(TAB_SECTION_START) and not S.startswith("[FD."):\r
             if not S.startswith("[FV.") and not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \\r
         S = self._Token.upper()\r
         if S.startswith(TAB_SECTION_START) and not S.startswith("[FD."):\r
             if not S.startswith("[FV.") and not S.startswith('[FMPPAYLOAD.') and not S.startswith("[CAPSULE.") \\r
-                and not S.startswith("[VTF.") and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
+                and not S.startswith("[RULE.") and not S.startswith("[OPTIONROM."):\r
                 raise Warning("Unknown section", self.FileName, self.CurrentLineNumber)\r
             self._UndoToken()\r
             return False\r
                 raise Warning("Unknown section", self.FileName, self.CurrentLineNumber)\r
             self._UndoToken()\r
             return False\r
@@ -1434,7 +1426,7 @@ class FdfParser:
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
-            raise Warning("expected [FD.]", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("[FD.]", self.FileName, self.CurrentLineNumber)\r
 \r
         FdName = self._GetUiName()\r
         if FdName == "":\r
 \r
         FdName = self._GetUiName()\r
         if FdName == "":\r
@@ -1444,21 +1436,21 @@ class FdfParser:
                     FdName = GlobalData.gActivePlatform.PlatformName\r
                 self.Profile.FdNameNotSet = True\r
             else:\r
                     FdName = GlobalData.gActivePlatform.PlatformName\r
                 self.Profile.FdNameNotSet = True\r
             else:\r
-                raise Warning("expected FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FdName in [FD.] section", self.FileName, self.CurrentLineNumber)\r
         self.CurrentFdName = FdName.upper()\r
 \r
         if self.CurrentFdName in self.Profile.FdDict:\r
             raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
         self.CurrentFdName = FdName.upper()\r
 \r
         if self.CurrentFdName in self.Profile.FdDict:\r
             raise Warning("Unexpected the same FD name", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         FdObj = FD()\r
         FdObj.FdUiName = self.CurrentFdName\r
         self.Profile.FdDict[self.CurrentFdName] = FdObj\r
 \r
         if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet:\r
 \r
         FdObj = FD()\r
         FdObj.FdUiName = self.CurrentFdName\r
         self.Profile.FdDict[self.CurrentFdName] = FdObj\r
 \r
         if len (self.Profile.FdDict) > 1 and self.Profile.FdNameNotSet:\r
-            raise Warning("expected all FDs have their name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("all FDs have their name", self.FileName, self.CurrentLineNumber)\r
 \r
         Status = self._GetCreateFile(FdObj)\r
         if not Status:\r
 \r
         Status = self._GetCreateFile(FdObj)\r
         if not Status:\r
@@ -1479,7 +1471,7 @@ class FdfParser:
         self._GetSetStatements(FdObj)\r
 \r
         if not self._GetRegionLayout(FdObj):\r
         self._GetSetStatements(FdObj)\r
 \r
         if not self._GetRegionLayout(FdObj):\r
-            raise Warning("expected region layout", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("region layout", self.FileName, self.CurrentLineNumber)\r
 \r
         while self._GetRegionLayout(FdObj):\r
             pass\r
 \r
         while self._GetRegionLayout(FdObj):\r
             pass\r
@@ -1510,10 +1502,10 @@ class FdfParser:
     def _GetCreateFile(self, Obj):\r
         if self._IsKeyword("CREATE_FILE"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
     def _GetCreateFile(self, Obj):\r
         if self._IsKeyword("CREATE_FILE"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("file name", self.FileName, self.CurrentLineNumber)\r
 \r
             FileName = self._Token\r
             Obj.CreateFileName = FileName\r
 \r
             FileName = self._Token\r
             Obj.CreateFileName = FileName\r
@@ -1533,10 +1525,10 @@ class FdfParser:
     def _GetTokenStatements(self, Obj):\r
         if self._IsKeyword("BaseAddress"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
     def _GetTokenStatements(self, Obj):\r
         if self._IsKeyword("BaseAddress"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextHexNumber():\r
 \r
             if not self._GetNextHexNumber():\r
-                raise Warning("expected Hex base address", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Hex base address", self.FileName, self.CurrentLineNumber)\r
 \r
             Obj.BaseAddress = self._Token\r
 \r
 \r
             Obj.BaseAddress = self._Token\r
 \r
@@ -1551,10 +1543,10 @@ class FdfParser:
 \r
         if self._IsKeyword("Size"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if self._IsKeyword("Size"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextHexNumber():\r
 \r
             if not self._GetNextHexNumber():\r
-                raise Warning("expected Hex size", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Hex size", self.FileName, self.CurrentLineNumber)\r
 \r
             Size = self._Token\r
             if self._IsToken(TAB_VALUE_SPLIT):\r
 \r
             Size = self._Token\r
             if self._IsToken(TAB_VALUE_SPLIT):\r
@@ -1564,18 +1556,18 @@ class FdfParser:
                 self.SetPcdLocalation(pcdPair)\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
                 self.SetPcdLocalation(pcdPair)\r
                 FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
                 self.Profile.PcdFileLineDict[pcdPair] = FileLineTuple\r
-            Obj.Size = long(Size, 0)\r
+            Obj.Size = int(Size, 0)\r
             return True\r
 \r
         if self._IsKeyword("ErasePolarity"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return True\r
 \r
         if self._IsKeyword("ErasePolarity"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected Erase Polarity", self.FileName, self.CurrentLineNumber)\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 not self._Token in {"1", "0"}:\r
+                raise Warning.Expected("1 or 0 Erase Polarity", self.FileName, self.CurrentLineNumber)\r
 \r
             Obj.ErasePolarity = self._Token\r
             return True\r
 \r
             Obj.ErasePolarity = self._Token\r
             return True\r
@@ -1594,22 +1586,22 @@ class FdfParser:
     def _GetAddressStatements(self, Obj):\r
         if self._IsKeyword("BsBaseAddress"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
     def _GetAddressStatements(self, Obj):\r
         if self._IsKeyword("BsBaseAddress"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextDecimalNumber() and not self._GetNextHexNumber():\r
 \r
             if not self._GetNextDecimalNumber() and not self._GetNextHexNumber():\r
-                raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("address", self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-            BsAddress = long(self._Token, 0)\r
+            BsAddress = int(self._Token, 0)\r
             Obj.BsBaseAddress = BsAddress\r
 \r
         if self._IsKeyword("RtBaseAddress"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             Obj.BsBaseAddress = BsAddress\r
 \r
         if self._IsKeyword("RtBaseAddress"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextDecimalNumber() and not self._GetNextHexNumber():\r
 \r
             if not self._GetNextDecimalNumber() and not self._GetNextHexNumber():\r
-                raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("address", self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-            RtAddress = long(self._Token, 0)\r
+            RtAddress = int(self._Token, 0)\r
             Obj.RtBaseAddress = RtAddress\r
 \r
     ## _GetBlockStatements() method\r
             Obj.RtBaseAddress = RtAddress\r
 \r
     ## _GetBlockStatements() method\r
@@ -1626,7 +1618,7 @@ class FdfParser:
 \r
             Item = Obj.BlockSizeList[-1]\r
             if Item[0] is None or Item[1] is None:\r
 \r
             Item = Obj.BlockSizeList[-1]\r
             if Item[0] is None or Item[1] is None:\r
-                raise Warning("expected block statement", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("block statement", self.FileName, self.CurrentLineNumber)\r
         return IsBlock\r
 \r
     ## _GetBlockStatement() method\r
         return IsBlock\r
 \r
     ## _GetBlockStatement() method\r
@@ -1643,10 +1635,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextHexNumber() and not self._GetNextDecimalNumber():\r
 \r
         if not self._GetNextHexNumber() and not self._GetNextDecimalNumber():\r
-            raise Warning("expected Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Hex or Integer block size", self.FileName, self.CurrentLineNumber)\r
 \r
         BlockSize = self._Token\r
         BlockSizePcd = None\r
 \r
         BlockSize = self._Token\r
         BlockSizePcd = None\r
@@ -1657,17 +1649,17 @@ class FdfParser:
             self.SetPcdLocalation(PcdPair)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
             self.SetPcdLocalation(PcdPair)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.PcdFileLineDict[PcdPair] = FileLineTuple\r
-        BlockSize = long(BlockSize, 0)\r
+        BlockSize = int(BlockSize, 0)\r
 \r
         BlockNumber = None\r
         if self._IsKeyword("NumBlocks"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         BlockNumber = None\r
         if self._IsKeyword("NumBlocks"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextDecimalNumber() and not self._GetNextHexNumber():\r
 \r
             if not self._GetNextDecimalNumber() and not self._GetNextHexNumber():\r
-                raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("block numbers", self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-            BlockNumber = long(self._Token, 0)\r
+            BlockNumber = int(self._Token, 0)\r
 \r
         Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
         return True\r
 \r
         Obj.BlockSizeList.append((BlockSize, BlockNumber, BlockSizePcd))\r
         return True\r
@@ -1699,10 +1691,10 @@ class FdfParser:
             self._GetNextToken()\r
             Macro = self._Token\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             self._GetNextToken()\r
             Macro = self._Token\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("value", self.FileName, self.CurrentLineNumber)\r
 \r
             Value = self._Token\r
             Macro = '$(' + Macro + ')'\r
 \r
             Value = self._Token\r
             Macro = '$(' + Macro + ')'\r
@@ -1738,7 +1730,7 @@ class FdfParser:
             PcdPair = self._GetNextPcdSettings()\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             PcdPair = self._GetNextPcdSettings()\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             Value = self._GetExpression()\r
             Value = self._EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
 \r
             Value = self._GetExpression()\r
             Value = self._EvaluateConditional(Value, self.CurrentLineNumber, 'eval', True)\r
@@ -1776,7 +1768,7 @@ class FdfParser:
             Expr += CurCh\r
             self._GetOneChar()\r
         try:\r
             Expr += CurCh\r
             self._GetOneChar()\r
         try:\r
-            return long(\r
+            return int(\r
                 ValueExpression(Expr,\r
                                 self._CollectMacroPcd()\r
                                 )(True), 0)\r
                 ValueExpression(Expr,\r
                                 self._CollectMacroPcd()\r
                                 )(True), 0)\r
@@ -1803,11 +1795,11 @@ class FdfParser:
         theFd.RegionList.append(RegionObj)\r
 \r
         if not self._IsToken(TAB_VALUE_SPLIT):\r
         theFd.RegionList.append(RegionObj)\r
 \r
         if not self._IsToken(TAB_VALUE_SPLIT):\r
-            raise Warning("expected '|'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'|'", self.FileName, self.CurrentLineNumber)\r
 \r
         Size = self._CalcRegionExpr()\r
         if Size is None:\r
 \r
         Size = self._CalcRegionExpr()\r
         if Size is None:\r
-            raise Warning("expected Region Size", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Region Size", self.FileName, self.CurrentLineNumber)\r
         RegionObj.Size = Size\r
 \r
         if not self._GetNextWord():\r
         RegionObj.Size = Size\r
 \r
         if not self._GetNextWord():\r
@@ -1824,7 +1816,7 @@ class FdfParser:
                            RegionOffsetPcdPattern.match(self._CurrentLine()[self.CurrentOffsetWithinLine:]))\r
             if IsRegionPcd:\r
                 RegionObj.PcdOffset = self._GetNextPcdSettings()\r
                            RegionOffsetPcdPattern.match(self._CurrentLine()[self.CurrentOffsetWithinLine:]))\r
             if IsRegionPcd:\r
                 RegionObj.PcdOffset = self._GetNextPcdSettings()\r
-                self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + long(theFd.BaseAddress, 0))\r
+                self.Profile.PcdDict[RegionObj.PcdOffset] = "0x%08X" % (RegionObj.Offset + int(theFd.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.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
@@ -1890,13 +1882,13 @@ class FdfParser:
     #\r
     def _GetRegionFvType(self, RegionObj):\r
         if not self._IsKeyword(BINARY_FILE_TYPE_FV):\r
     #\r
     def _GetRegionFvType(self, RegionObj):\r
         if not self._IsKeyword(BINARY_FILE_TYPE_FV):\r
-            raise Warning("expected Keyword BINARY_FILE_TYPE_FV", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'FV'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber)\r
 \r
         RegionObj.RegionType = BINARY_FILE_TYPE_FV\r
         RegionObj.RegionDataList.append((self._Token).upper())\r
 \r
         RegionObj.RegionType = BINARY_FILE_TYPE_FV\r
         RegionObj.RegionDataList.append((self._Token).upper())\r
@@ -1904,10 +1896,10 @@ class FdfParser:
         while self._IsKeyword(BINARY_FILE_TYPE_FV):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
         while self._IsKeyword(BINARY_FILE_TYPE_FV):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber)\r
 \r
             RegionObj.RegionDataList.append((self._Token).upper())\r
 \r
 \r
             RegionObj.RegionDataList.append((self._Token).upper())\r
 \r
@@ -1920,13 +1912,13 @@ class FdfParser:
     #\r
     def _GetRegionCapType(self, RegionObj):\r
         if not self._IsKeyword("CAPSULE"):\r
     #\r
     def _GetRegionCapType(self, RegionObj):\r
         if not self._IsKeyword("CAPSULE"):\r
-            raise Warning("expected Keyword 'CAPSULE'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'CAPSULE'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("CAPSULE name", self.FileName, self.CurrentLineNumber)\r
 \r
         RegionObj.RegionType = "CAPSULE"\r
         RegionObj.RegionDataList.append(self._Token)\r
 \r
         RegionObj.RegionType = "CAPSULE"\r
         RegionObj.RegionDataList.append(self._Token)\r
@@ -1934,10 +1926,10 @@ class FdfParser:
         while self._IsKeyword("CAPSULE"):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
         while self._IsKeyword("CAPSULE"):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected CAPSULE name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("CAPSULE name", self.FileName, self.CurrentLineNumber)\r
 \r
             RegionObj.RegionDataList.append(self._Token)\r
 \r
 \r
             RegionObj.RegionDataList.append(self._Token)\r
 \r
@@ -1950,13 +1942,13 @@ class FdfParser:
     #\r
     def _GetRegionFileType(self, RegionObj):\r
         if not self._IsKeyword("FILE"):\r
     #\r
     def _GetRegionFileType(self, RegionObj):\r
         if not self._IsKeyword("FILE"):\r
-            raise Warning("expected Keyword 'FILE'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'FILE'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("File name", self.FileName, self.CurrentLineNumber)\r
 \r
         RegionObj.RegionType = "FILE"\r
         RegionObj.RegionDataList.append(self._Token)\r
 \r
         RegionObj.RegionType = "FILE"\r
         RegionObj.RegionDataList.append(self._Token)\r
@@ -1964,10 +1956,10 @@ class FdfParser:
         while self._IsKeyword("FILE"):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
         while self._IsKeyword("FILE"):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected FILE name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FILE name", self.FileName, self.CurrentLineNumber)\r
 \r
             RegionObj.RegionDataList.append(self._Token)\r
 \r
 \r
             RegionObj.RegionDataList.append(self._Token)\r
 \r
@@ -1980,16 +1972,16 @@ class FdfParser:
     #\r
     def _GetRegionDataType(self, RegionObj):\r
         if not self._IsKeyword("DATA"):\r
     #\r
     def _GetRegionDataType(self, RegionObj):\r
         if not self._IsKeyword("DATA"):\r
-            raise Warning("expected Region Data type", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Region Data type", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken("{"):\r
 \r
         if not self._IsToken("{"):\r
-            raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextHexNumber():\r
 \r
         if not self._GetNextHexNumber():\r
-            raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Hex byte", self.FileName, self.CurrentLineNumber)\r
 \r
         if len(self._Token) > 18:\r
             raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
 \r
         if len(self._Token) > 18:\r
             raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
@@ -2013,8 +2005,8 @@ class FdfParser:
                 DataString += self._Token\r
                 DataString += TAB_COMMA_SPLIT\r
 \r
                 DataString += self._Token\r
                 DataString += TAB_COMMA_SPLIT\r
 \r
-        if not self._IsToken("}"):\r
-            raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+        if not self._IsToken(T_CHAR_BRACE_R):\r
+            raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
         DataString = DataString.rstrip(TAB_COMMA_SPLIT)\r
         RegionObj.RegionType = "DATA"\r
 \r
         DataString = DataString.rstrip(TAB_COMMA_SPLIT)\r
         RegionObj.RegionType = "DATA"\r
@@ -2023,13 +2015,13 @@ class FdfParser:
         while self._IsKeyword("DATA"):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
         while self._IsKeyword("DATA"):\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._IsToken("{"):\r
 \r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextHexNumber():\r
 \r
             if not self._GetNextHexNumber():\r
-                raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Hex byte", self.FileName, self.CurrentLineNumber)\r
 \r
             if len(self._Token) > 18:\r
                 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
 \r
             if len(self._Token) > 18:\r
                 raise Warning("Hex string can't be converted to a valid UINT64 value", self.FileName, self.CurrentLineNumber)\r
@@ -2053,8 +2045,8 @@ class FdfParser:
                     DataString += self._Token\r
                     DataString += TAB_COMMA_SPLIT\r
 \r
                     DataString += self._Token\r
                     DataString += TAB_COMMA_SPLIT\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
             DataString = DataString.rstrip(TAB_COMMA_SPLIT)\r
             RegionObj.RegionDataList.append(DataString)\r
 \r
             DataString = DataString.rstrip(TAB_COMMA_SPLIT)\r
             RegionObj.RegionDataList.append(DataString)\r
@@ -2088,7 +2080,7 @@ class FdfParser:
         self.CurrentFvName = FvName.upper()\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
         self.CurrentFvName = FvName.upper()\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         FvObj = FV(Name=self.CurrentFvName)\r
         self.Profile.FvDict[self.CurrentFvName] = FvObj\r
 \r
         FvObj = FV(Name=self.CurrentFvName)\r
         self.Profile.FvDict[self.CurrentFvName] = FvObj\r
@@ -2113,12 +2105,12 @@ class FdfParser:
         if FvObj.FvNameString == 'TRUE' and not FvObj.FvNameGuid:\r
             raise Warning("FvNameString found but FvNameGuid was not found", self.FileName, self.CurrentLineNumber)\r
 \r
         if FvObj.FvNameString == 'TRUE' and not FvObj.FvNameGuid:\r
             raise Warning("FvNameString found but FvNameGuid was not found", self.FileName, self.CurrentLineNumber)\r
 \r
-        self._GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
-        self._GetAprioriSection(FvObj, FvObj.DefineVarDict.copy())\r
+        self._GetAprioriSection(FvObj)\r
+        self._GetAprioriSection(FvObj)\r
 \r
         while True:\r
             isInf = self._GetInfStatement(FvObj)\r
 \r
         while True:\r
             isInf = self._GetInfStatement(FvObj)\r
-            isFile = self._GetFileStatement(FvObj, MacroDict = FvObj.DefineVarDict.copy())\r
+            isFile = self._GetFileStatement(FvObj)\r
             if not isInf and not isFile:\r
                 break\r
 \r
             if not isInf and not isFile:\r
                 break\r
 \r
@@ -2138,10 +2130,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("alignment value", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token.upper() not in {"1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
                                         "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
 \r
         if self._Token.upper() not in {"1", "2", "4", "8", "16", "32", "64", "128", "256", "512", \\r
                                         "1K", "2K", "4K", "8K", "16K", "32K", "64K", "128K", "256K", "512K", \\r
@@ -2165,10 +2157,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected FV base address value", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FV base address value", self.FileName, self.CurrentLineNumber)\r
 \r
         if not BaseAddrValuePattern.match(self._Token.upper()):\r
             raise Warning("Unknown FV base address value '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
 \r
         if not BaseAddrValuePattern.match(self._Token.upper()):\r
             raise Warning("Unknown FV base address value '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
@@ -2189,10 +2181,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected FvForceRebase value", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FvForceRebase value", 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
         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
@@ -2230,10 +2222,10 @@ class FdfParser:
                 return False\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
                 return False\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken() or self._Token.upper() not in {"TRUE", "FALSE", "1", "0"}:\r
 \r
             if not self._GetNextToken() or self._Token.upper() not in {"TRUE", "FALSE", "1", "0"}:\r
-                raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
 \r
             FvObj.FvAttributeDict[name] = self._Token\r
 \r
 \r
             FvObj.FvAttributeDict[name] = self._Token\r
 \r
@@ -2252,10 +2244,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextGuid():\r
 \r
         if not self._GetNextGuid():\r
-            raise Warning("expected FV GUID value", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("GUID value", self.FileName, self.CurrentLineNumber)\r
 \r
         FvObj.FvNameGuid = self._Token\r
 \r
 \r
         FvObj.FvNameGuid = self._Token\r
 \r
@@ -2266,10 +2258,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-        if not self._GetNextToken() or self._Token not in {'TRUE', 'FALSE'}:\r
-            raise Warning("expected TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber)\r
+        if not self._GetNextToken() or self._Token.upper() not in {'TRUE', 'FALSE'}:\r
+            raise Warning.Expected("TRUE or FALSE for FvNameString", self.FileName, self.CurrentLineNumber)\r
 \r
         FvObj.FvNameString = self._Token\r
 \r
 \r
         FvObj.FvNameString = self._Token\r
 \r
@@ -2280,34 +2272,33 @@ class FdfParser:
             return False\r
 \r
         if not self._IsKeyword ("TYPE"):\r
             return False\r
 \r
         if not self._IsKeyword ("TYPE"):\r
-            raise Warning("expected 'TYPE'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'TYPE'", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextHexNumber() and not self._GetNextDecimalNumber():\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
+            raise Warning.Expected("Hex FV extension entry type value At Line ", self.FileName, self.CurrentLineNumber)\r
 \r
         FvObj.FvExtEntryTypeValue.append(self._Token)\r
 \r
         if not self._IsToken("{"):\r
 \r
         FvObj.FvExtEntryTypeValue.append(self._Token)\r
 \r
         if not self._IsToken("{"):\r
-            raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-        if not self._IsKeyword ("FILE") and not self._IsKeyword ("DATA"):\r
-            raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\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.append(self._Token)\r
 \r
         if self._Token == 'DATA':\r
 \r
         FvObj.FvExtEntryType.append(self._Token)\r
 \r
         if self._Token == 'DATA':\r
-\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._IsToken("{"):\r
 \r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextHexNumber():\r
 \r
             if not self._GetNextHexNumber():\r
-                raise Warning("expected Hex byte", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Hex byte", self.FileName, self.CurrentLineNumber)\r
 \r
             if len(self._Token) > 4:\r
                 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
 \r
             if len(self._Token) > 4:\r
                 raise Warning("Hex byte(must be 2 digits) too long", self.FileName, self.CurrentLineNumber)\r
@@ -2323,27 +2314,26 @@ class FdfParser:
                 DataString += self._Token\r
                 DataString += TAB_COMMA_SPLIT\r
 \r
                 DataString += self._Token\r
                 DataString += TAB_COMMA_SPLIT\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
             DataString = DataString.rstrip(TAB_COMMA_SPLIT)\r
             FvObj.FvExtEntryData.append(DataString)\r
 \r
         if self._Token == 'FILE':\r
 \r
             DataString = DataString.rstrip(TAB_COMMA_SPLIT)\r
             FvObj.FvExtEntryData.append(DataString)\r
 \r
         if self._Token == 'FILE':\r
-\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FV Extension Entry file path At Line ", self.FileName, self.CurrentLineNumber)\r
 \r
             FvObj.FvExtEntryData.append(self._Token)\r
 \r
 \r
             FvObj.FvExtEntryData.append(self._Token)\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
         return True\r
 \r
 \r
         return True\r
 \r
@@ -2353,26 +2343,24 @@ class FdfParser:
     #\r
     #   @param  self        The object pointer\r
     #   @param  FvObj       for whom apriori is got\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  FvObj       for whom apriori is got\r
-    #   @param  MacroDict   dictionary used to replace macro\r
     #   @retval True        Successfully find apriori statement\r
     #   @retval False       Not able to find apriori statement\r
     #\r
     #   @retval True        Successfully find apriori statement\r
     #   @retval False       Not able to find apriori statement\r
     #\r
-    def _GetAprioriSection(self, FvObj, MacroDict = {}):\r
+    def _GetAprioriSection(self, FvObj):\r
         if not self._IsKeyword("APRIORI"):\r
             return False\r
 \r
         if not self._IsKeyword("PEI") and not self._IsKeyword("DXE"):\r
         if not self._IsKeyword("APRIORI"):\r
             return False\r
 \r
         if not self._IsKeyword("PEI") and not self._IsKeyword("DXE"):\r
-            raise Warning("expected Apriori file type", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Apriori file type", self.FileName, self.CurrentLineNumber)\r
         AprType = self._Token\r
 \r
         if not self._IsToken("{"):\r
         AprType = self._Token\r
 \r
         if not self._IsToken("{"):\r
-            raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
         AprSectionObj = AprioriSection()\r
         AprSectionObj.AprioriType = AprType\r
 \r
         self._GetDefineStatements(AprSectionObj)\r
 \r
         AprSectionObj = AprioriSection()\r
         AprSectionObj.AprioriType = AprType\r
 \r
         self._GetDefineStatements(AprSectionObj)\r
-        MacroDict.update(AprSectionObj.DefineVarDict)\r
 \r
         while True:\r
             IsInf = self._GetInfStatement(AprSectionObj)\r
 \r
         while True:\r
             IsInf = self._GetInfStatement(AprSectionObj)\r
@@ -2380,8 +2368,8 @@ class FdfParser:
             if not IsInf and not IsFile:\r
                 break\r
 \r
             if not IsInf and not IsFile:\r
                 break\r
 \r
-        if not self._IsToken("}"):\r
-            raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+        if not self._IsToken(T_CHAR_BRACE_R):\r
+            raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
         FvObj.AprioriSectionList.append(AprSectionObj)\r
         return True\r
 \r
         FvObj.AprioriSectionList.append(AprSectionObj)\r
         return True\r
@@ -2394,10 +2382,10 @@ class FdfParser:
         self._GetInfOptions(ffsInf)\r
 \r
         if not self._GetNextToken():\r
         self._GetInfOptions(ffsInf)\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("INF file path", self.FileName, self.CurrentLineNumber)\r
         ffsInf.InfFileName = self._Token\r
         if not ffsInf.InfFileName.endswith('.inf'):\r
         ffsInf.InfFileName = self._Token\r
         if not ffsInf.InfFileName.endswith('.inf'):\r
-            raise Warning("expected .inf file path", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected(".inf file path", self.FileName, self.CurrentLineNumber)\r
 \r
         ffsInf.CurrentLineNum = self.CurrentLineNumber\r
         ffsInf.CurrentLineContent = self._CurrentLine()\r
 \r
         ffsInf.CurrentLineNum = self.CurrentLineNumber\r
         ffsInf.CurrentLineContent = self._CurrentLine()\r
@@ -2411,8 +2399,12 @@ class FdfParser:
             if ErrorCode != 0:\r
                 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
             if ErrorCode != 0:\r
                 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
-        if not ffsInf.InfFileName in self.Profile.InfList:\r
-            self.Profile.InfList.append(ffsInf.InfFileName)\r
+        NewFileName = ffsInf.InfFileName\r
+        if ffsInf.OverrideGuid:\r
+            NewFileName = ProcessDuplicatedInf(PathClass(ffsInf.InfFileName,GenFdsGlobalVariable.WorkSpaceDir), ffsInf.OverrideGuid, GenFdsGlobalVariable.WorkSpaceDir).Path\r
+\r
+        if not NewFileName in self.Profile.InfList:\r
+            self.Profile.InfList.append(NewFileName)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.InfFileLineList.append(FileLineTuple)\r
             if ffsInf.UseArch:\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.InfFileLineList.append(FileLineTuple)\r
             if ffsInf.UseArch:\r
@@ -2464,41 +2456,41 @@ class FdfParser:
     def _GetInfOptions(self, FfsInfObj):\r
         if self._IsKeyword("FILE_GUID"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
     def _GetInfOptions(self, FfsInfObj):\r
         if self._IsKeyword("FILE_GUID"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextGuid():\r
             if not self._GetNextGuid():\r
-                raise Warning("expected GUID value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("GUID value", self.FileName, self.CurrentLineNumber)\r
             FfsInfObj.OverrideGuid = self._Token\r
 \r
         if self._IsKeyword("RuleOverride"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             FfsInfObj.OverrideGuid = self._Token\r
 \r
         if self._IsKeyword("RuleOverride"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected Rule name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Rule name", self.FileName, self.CurrentLineNumber)\r
             FfsInfObj.Rule = self._Token\r
 \r
         if self._IsKeyword("VERSION"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             FfsInfObj.Rule = self._Token\r
 \r
         if self._IsKeyword("VERSION"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected Version", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Version", self.FileName, self.CurrentLineNumber)\r
 \r
             if self._GetStringData():\r
                 FfsInfObj.Version = self._Token\r
 \r
         if self._IsKeyword(BINARY_FILE_TYPE_UI):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
             if self._GetStringData():\r
                 FfsInfObj.Version = self._Token\r
 \r
         if self._IsKeyword(BINARY_FILE_TYPE_UI):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected UI name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("UI name", self.FileName, self.CurrentLineNumber)\r
 \r
             if self._GetStringData():\r
                 FfsInfObj.Ui = self._Token\r
 \r
         if self._IsKeyword("USE"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
             if self._GetStringData():\r
                 FfsInfObj.Ui = self._Token\r
 \r
         if self._IsKeyword("USE"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected ARCH name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("ARCH name", self.FileName, self.CurrentLineNumber)\r
             FfsInfObj.UseArch = self._Token\r
 \r
 \r
             FfsInfObj.UseArch = self._Token\r
 \r
 \r
@@ -2514,7 +2506,7 @@ class FdfParser:
 \r
             while self._GetNextToken():\r
                 if not p.match(self._Token):\r
 \r
             while self._GetNextToken():\r
                 if not p.match(self._Token):\r
-                    raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                 FfsInfObj.KeyStringList.append(self._Token)\r
 \r
                 if not self._IsToken(TAB_COMMA_SPLIT):\r
                 FfsInfObj.KeyStringList.append(self._Token)\r
 \r
                 if not self._IsToken(TAB_COMMA_SPLIT):\r
@@ -2526,16 +2518,15 @@ class FdfParser:
     #\r
     #   @param  self        The object pointer\r
     #   @param  Obj         for whom FILE statement is got\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  Obj         for whom FILE statement is got\r
-    #   @param  MacroDict   dictionary used to replace macro\r
     #   @retval True        Successfully find FILE statement\r
     #   @retval False       Not able to find FILE statement\r
     #\r
     #   @retval True        Successfully find FILE statement\r
     #   @retval False       Not able to find FILE statement\r
     #\r
-    def _GetFileStatement(self, Obj, ForCapsule = False, MacroDict = {}):\r
+    def _GetFileStatement(self, Obj, ForCapsule = False):\r
         if not self._IsKeyword("FILE"):\r
             return False\r
 \r
         if not self._GetNextWord():\r
         if not self._IsKeyword("FILE"):\r
             return False\r
 \r
         if not self._GetNextWord():\r
-            raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FFS type", self.FileName, self.CurrentLineNumber)\r
 \r
         if ForCapsule and self._Token == 'DATA':\r
             self._UndoToken()\r
 \r
         if ForCapsule and self._Token == 'DATA':\r
             self._UndoToken()\r
@@ -2546,22 +2537,22 @@ class FdfParser:
         FfsFileObj.FvFileType = self._Token\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
         FfsFileObj.FvFileType = self._Token\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextGuid():\r
             if not self._GetNextWord():\r
 \r
         if not self._GetNextGuid():\r
             if not self._GetNextWord():\r
-                raise Warning("expected File GUID", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("File GUID", self.FileName, self.CurrentLineNumber)\r
             if self._Token == 'PCD':\r
                 if not self._IsToken("("):\r
             if self._Token == 'PCD':\r
                 if not self._IsToken("("):\r
-                    raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("'('", self.FileName, self.CurrentLineNumber)\r
                 PcdPair = self._GetNextPcdSettings()\r
                 if not self._IsToken(")"):\r
                 PcdPair = self._GetNextPcdSettings()\r
                 if not self._IsToken(")"):\r
-                    raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("')'", self.FileName, self.CurrentLineNumber)\r
                 self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')'\r
 \r
         FfsFileObj.NameGuid = self._Token\r
 \r
                 self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')'\r
 \r
         FfsFileObj.NameGuid = self._Token\r
 \r
-        self._GetFilePart(FfsFileObj, MacroDict.copy())\r
+        self._GetFilePart(FfsFileObj)\r
 \r
         if ForCapsule:\r
             capsuleFfs = CapsuleFfs()\r
 \r
         if ForCapsule:\r
             capsuleFfs = CapsuleFfs()\r
@@ -2582,7 +2573,7 @@ class FdfParser:
     #\r
     @staticmethod\r
     def _FileCouldHaveRelocFlag (FileType):\r
     #\r
     @staticmethod\r
     def _FileCouldHaveRelocFlag (FileType):\r
-        if FileType in {SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, 'PEI_DXE_COMBO'}:\r
+        if FileType in {SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM, SUP_MODULE_MM_CORE_STANDALONE, 'PEI_DXE_COMBO'}:\r
             return True\r
         else:\r
             return False\r
             return True\r
         else:\r
             return False\r
@@ -2608,9 +2599,8 @@ class FdfParser:
     #\r
     #   @param  self        The object pointer\r
     #   @param  FfsFileObj   for whom component is got\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  FfsFileObj   for whom component is got\r
-    #   @param  MacroDict   dictionary used to replace macro\r
     #\r
     #\r
-    def _GetFilePart(self, FfsFileObj, MacroDict = {}):\r
+    def _GetFilePart(self, FfsFileObj):\r
         self._GetFileOpts(FfsFileObj)\r
 \r
         if not self._IsToken("{"):\r
         self._GetFileOpts(FfsFileObj)\r
 \r
         if not self._IsToken("{"):\r
@@ -2624,32 +2614,32 @@ class FdfParser:
                     raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._IsToken("{"):\r
                     raise Warning("File type %s could not have reloc strip flag%d" % (FfsFileObj.FvFileType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected File name or section data", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("File name or section data", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token == BINARY_FILE_TYPE_FV:\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if self._Token == BINARY_FILE_TYPE_FV:\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber)\r
             FfsFileObj.FvName = self._Token\r
 \r
         elif self._Token == "FD":\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             FfsFileObj.FvName = self._Token\r
 \r
         elif self._Token == "FD":\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FD name", self.FileName, self.CurrentLineNumber)\r
             FfsFileObj.FdName = self._Token\r
 \r
         elif self._Token in {TAB_DEFINE, "APRIORI", "SECTION"}:\r
             self._UndoToken()\r
             FfsFileObj.FdName = self._Token\r
 \r
         elif self._Token in {TAB_DEFINE, "APRIORI", "SECTION"}:\r
             self._UndoToken()\r
-            self._GetSectionData(FfsFileObj, MacroDict)\r
+            self._GetSectionData(FfsFileObj)\r
 \r
         elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':\r
             self._UndoToken()\r
 \r
         elif hasattr(FfsFileObj, 'FvFileType') and FfsFileObj.FvFileType == 'RAW':\r
             self._UndoToken()\r
-            self._GetRAWData(FfsFileObj, MacroDict)\r
+            self._GetRAWData(FfsFileObj)\r
 \r
         else:\r
             FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
 \r
         else:\r
             FfsFileObj.CurrentLineNum = self.CurrentLineNumber\r
@@ -2657,8 +2647,8 @@ class FdfParser:
             FfsFileObj.FileName = self._Token.replace('$(SPACE)', ' ')\r
             self._VerifyFile(FfsFileObj.FileName)\r
 \r
             FfsFileObj.FileName = self._Token.replace('$(SPACE)', ' ')\r
             self._VerifyFile(FfsFileObj.FileName)\r
 \r
-        if not self._IsToken("}"):\r
-            raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+        if not self._IsToken(T_CHAR_BRACE_R):\r
+            raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
     ## _GetRAWData() method\r
     #\r
 \r
     ## _GetRAWData() method\r
     #\r
@@ -2666,9 +2656,8 @@ class FdfParser:
     #\r
     #   @param  self         The object pointer\r
     #   @param  FfsFileObj   for whom section is got\r
     #\r
     #   @param  self         The object pointer\r
     #   @param  FfsFileObj   for whom section is got\r
-    #   @param  MacroDict    dictionary used to replace macro\r
     #\r
     #\r
-    def _GetRAWData(self, FfsFileObj, MacroDict = {}):\r
+    def _GetRAWData(self, FfsFileObj):\r
         FfsFileObj.FileName = []\r
         FfsFileObj.SubAlignment = []\r
         while True:\r
         FfsFileObj.FileName = []\r
         FfsFileObj.SubAlignment = []\r
         while True:\r
@@ -2680,19 +2669,19 @@ class FdfParser:
                 if not self._Token == "Auto":\r
                     AlignValue = self._Token\r
             if not self._GetNextToken():\r
                 if not self._Token == "Auto":\r
                     AlignValue = self._Token\r
             if not self._GetNextToken():\r
-                raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Filename value", self.FileName, self.CurrentLineNumber)\r
 \r
             FileName = self._Token.replace('$(SPACE)', ' ')\r
 \r
             FileName = self._Token.replace('$(SPACE)', ' ')\r
-            if FileName == '}':\r
+            if FileName == T_CHAR_BRACE_R:\r
                 self._UndoToken()\r
                 self._UndoToken()\r
-                raise Warning("expected Filename value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Filename value", self.FileName, self.CurrentLineNumber)\r
 \r
             self._VerifyFile(FileName)\r
             File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)\r
             FfsFileObj.FileName.append(File.Path)\r
             FfsFileObj.SubAlignment.append(AlignValue)\r
 \r
 \r
             self._VerifyFile(FileName)\r
             File = PathClass(NormPath(FileName), GenFdsGlobalVariable.WorkSpaceDir)\r
             FfsFileObj.FileName.append(File.Path)\r
             FfsFileObj.SubAlignment.append(AlignValue)\r
 \r
-            if self._IsToken("}"):\r
+            if self._IsToken(T_CHAR_BRACE_R):\r
                 self._UndoToken()\r
                 break\r
 \r
                 self._UndoToken()\r
                 break\r
 \r
@@ -2715,7 +2704,7 @@ class FdfParser:
                 if self._IsToken(TAB_COMMA_SPLIT):\r
                     while self._GetNextToken():\r
                         if not TokenFindPattern.match(self._Token):\r
                 if self._IsToken(TAB_COMMA_SPLIT):\r
                     while self._GetNextToken():\r
                         if not TokenFindPattern.match(self._Token):\r
-                            raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
+                            raise Warning.Expected("KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                         FfsFileObj.KeyStringList.append(self._Token)\r
 \r
                         if not self._IsToken(TAB_COMMA_SPLIT):\r
                         FfsFileObj.KeyStringList.append(self._Token)\r
 \r
                         if not self._IsToken(TAB_COMMA_SPLIT):\r
@@ -2748,34 +2737,26 @@ class FdfParser:
     def _GetAlignment(self):\r
         if self._IsKeyword("Align", True):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
     def _GetAlignment(self):\r
         if self._IsKeyword("Align", True):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected alignment value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("alignment value", self.FileName, self.CurrentLineNumber)\r
             return True\r
 \r
         return False\r
 \r
             return True\r
 \r
         return False\r
 \r
-    ## _GetFilePart() method\r
+    ## _GetSectionData() method\r
     #\r
     #   Get section data for FILE statement\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  FfsFileObj   for whom section is got\r
     #\r
     #   Get section data for FILE statement\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  FfsFileObj   for whom section is got\r
-    #   @param  MacroDict   dictionary used to replace macro\r
     #\r
     #\r
-    def _GetSectionData(self, FfsFileObj, MacroDict = {}):\r
-        Dict = {}\r
-        Dict.update(MacroDict)\r
-\r
+    def _GetSectionData(self, FfsFileObj):\r
         self._GetDefineStatements(FfsFileObj)\r
 \r
         self._GetDefineStatements(FfsFileObj)\r
 \r
-        Dict.update(FfsFileObj.DefineVarDict)\r
-        self._GetAprioriSection(FfsFileObj, Dict.copy())\r
-        self._GetAprioriSection(FfsFileObj, Dict.copy())\r
-\r
         while True:\r
         while True:\r
-            IsLeafSection = self._GetLeafSection(FfsFileObj, Dict)\r
+            IsLeafSection = self._GetLeafSection(FfsFileObj)\r
             IsEncapSection = self._GetEncapsulationSec(FfsFileObj)\r
             if not IsLeafSection and not IsEncapSection:\r
                 break\r
             IsEncapSection = self._GetEncapsulationSec(FfsFileObj)\r
             if not IsLeafSection and not IsEncapSection:\r
                 break\r
@@ -2786,16 +2767,15 @@ class FdfParser:
     #\r
     #   @param  self        The object pointer\r
     #   @param  Obj         for whom leaf section is got\r
     #\r
     #   @param  self        The object pointer\r
     #   @param  Obj         for whom leaf section is got\r
-    #   @param  MacroDict   dictionary used to replace macro\r
     #   @retval True        Successfully find section statement\r
     #   @retval False       Not able to find section statement\r
     #\r
     #   @retval True        Successfully find section statement\r
     #   @retval False       Not able to find section statement\r
     #\r
-    def _GetLeafSection(self, Obj, MacroDict = {}):\r
+    def _GetLeafSection(self, Obj):\r
         OldPos = self.GetFileBufferPos()\r
 \r
         if not self._IsKeyword("SECTION"):\r
             if len(Obj.SectionList) == 0:\r
         OldPos = self.GetFileBufferPos()\r
 \r
         if not self._IsKeyword("SECTION"):\r
             if len(Obj.SectionList) == 0:\r
-                raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("SECTION", self.FileName, self.CurrentLineNumber)\r
             else:\r
                 return False\r
 \r
             else:\r
                 return False\r
 \r
@@ -2808,10 +2788,10 @@ class FdfParser:
         BuildNum = None\r
         if self._IsKeyword("BUILD_NUM"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
         BuildNum = None\r
         if self._IsKeyword("BUILD_NUM"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected Build number value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Build number value", self.FileName, self.CurrentLineNumber)\r
 \r
             BuildNum = self._Token\r
 \r
 \r
             BuildNum = self._Token\r
 \r
@@ -2819,9 +2799,9 @@ class FdfParser:
             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(TAB_EQUAL_SPLIT):\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(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected version", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("version", self.FileName, self.CurrentLineNumber)\r
             VerSectionObj = VerSection()\r
             VerSectionObj.Alignment = AlignValue\r
             VerSectionObj.BuildNum = BuildNum\r
             VerSectionObj = VerSection()\r
             VerSectionObj.Alignment = AlignValue\r
             VerSectionObj.BuildNum = BuildNum\r
@@ -2835,9 +2815,9 @@ class FdfParser:
             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(TAB_EQUAL_SPLIT):\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(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected UI", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("UI", self.FileName, self.CurrentLineNumber)\r
             UiSectionObj = UiSection()\r
             UiSectionObj.Alignment = AlignValue\r
             if self._GetStringData():\r
             UiSectionObj = UiSection()\r
             UiSectionObj.Alignment = AlignValue\r
             if self._GetStringData():\r
@@ -2850,9 +2830,9 @@ class FdfParser:
             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(TAB_EQUAL_SPLIT):\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(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("FV name or FV file path", self.FileName, self.CurrentLineNumber)\r
 \r
             FvName = self._Token\r
             FvObj = None\r
 \r
             FvName = self._Token\r
             FvObj = None\r
@@ -2861,22 +2841,20 @@ class FdfParser:
                 FvObj = FV()\r
                 FvObj.UiFvName = FvName.upper()\r
                 self._GetDefineStatements(FvObj)\r
                 FvObj = FV()\r
                 FvObj.UiFvName = FvName.upper()\r
                 self._GetDefineStatements(FvObj)\r
-                MacroDict.update(FvObj.DefineVarDict)\r
+\r
                 self._GetBlockStatement(FvObj)\r
                 self._GetSetStatements(FvObj)\r
                 self._GetFvAlignment(FvObj)\r
                 self._GetFvAttributes(FvObj)\r
                 self._GetBlockStatement(FvObj)\r
                 self._GetSetStatements(FvObj)\r
                 self._GetFvAlignment(FvObj)\r
                 self._GetFvAttributes(FvObj)\r
-                self._GetAprioriSection(FvObj, MacroDict.copy())\r
-                self._GetAprioriSection(FvObj, MacroDict.copy())\r
 \r
                 while True:\r
                     IsInf = self._GetInfStatement(FvObj)\r
 \r
                 while True:\r
                     IsInf = self._GetInfStatement(FvObj)\r
-                    IsFile = self._GetFileStatement(FvObj, MacroDict.copy())\r
+                    IsFile = self._GetFileStatement(FvObj)\r
                     if not IsInf and not IsFile:\r
                         break\r
 \r
                     if not IsInf and not IsFile:\r
                         break\r
 \r
-                if not self._IsToken("}"):\r
-                    raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+                if not self._IsToken(T_CHAR_BRACE_R):\r
+                    raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
             FvImageSectionObj = FvImageSection()\r
             FvImageSectionObj.Alignment = AlignValue\r
 \r
             FvImageSectionObj = FvImageSection()\r
             FvImageSectionObj.Alignment = AlignValue\r
@@ -2897,18 +2875,18 @@ class FdfParser:
             DepexSectionObj.DepexType = self._Token\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             DepexSectionObj.DepexType = self._Token\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._IsToken("{"):\r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
-            if not self._SkipToToken("}"):\r
-                raise Warning("expected Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
+            if not self._SkipToToken(T_CHAR_BRACE_R):\r
+                raise Warning.Expected("Depex expression ending '}'", self.FileName, self.CurrentLineNumber)\r
 \r
 \r
-            DepexSectionObj.Expression = self._SkippedChars.rstrip('}')\r
+            DepexSectionObj.Expression = self._SkippedChars.rstrip(T_CHAR_BRACE_R)\r
             Obj.SectionList.append(DepexSectionObj)\r
 \r
         else:\r
             if not self._GetNextWord():\r
             Obj.SectionList.append(DepexSectionObj)\r
 \r
         else:\r
             if not self._GetNextWord():\r
-                raise Warning("expected section type", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("section type", self.FileName, self.CurrentLineNumber)\r
 \r
             # Encapsulation section appear, UndoToken and return\r
             if self._Token == "COMPRESS" or self._Token == "GUIDED":\r
 \r
             # Encapsulation section appear, UndoToken and return\r
             if self._Token == "COMPRESS" or self._Token == "GUIDED":\r
@@ -2937,7 +2915,7 @@ class FdfParser:
 \r
             if self._IsToken(TAB_EQUAL_SPLIT):\r
                 if not self._GetNextToken():\r
 \r
             if self._IsToken(TAB_EQUAL_SPLIT):\r
                 if not self._GetNextToken():\r
-                    raise Warning("expected section file path", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("section file path", self.FileName, self.CurrentLineNumber)\r
                 DataSectionObj.SectFileName = self._Token\r
                 self._VerifyFile(DataSectionObj.SectFileName)\r
             else:\r
                 DataSectionObj.SectFileName = self._Token\r
                 self._VerifyFile(DataSectionObj.SectFileName)\r
             else:\r
@@ -2981,7 +2959,7 @@ class FdfParser:
                 type = self._Token\r
 \r
             if not self._IsToken("{"):\r
                 type = self._Token\r
 \r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
             CompressSectionObj = CompressSection()\r
             CompressSectionObj.Alignment = AlignValue\r
 \r
             CompressSectionObj = CompressSection()\r
             CompressSectionObj.Alignment = AlignValue\r
@@ -2994,13 +2972,9 @@ class FdfParser:
                     break\r
 \r
 \r
                     break\r
 \r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
             Obj.SectionList.append(CompressSectionObj)\r
             Obj.SectionList.append(CompressSectionObj)\r
-\r
-#            else:\r
-#               raise Warning("Compress type not known")\r
-\r
             return True\r
 \r
         elif self._IsKeyword("GUIDED"):\r
             return True\r
 \r
         elif self._IsKeyword("GUIDED"):\r
@@ -3010,7 +2984,7 @@ class FdfParser:
 \r
             AttribDict = self._GetGuidAttrib()\r
             if not self._IsToken("{"):\r
 \r
             AttribDict = self._GetGuidAttrib()\r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
             GuidSectionObj = GuidSection()\r
             GuidSectionObj.Alignment = AlignValue\r
             GuidSectionObj.NameGuid = GuidValue\r
             GuidSectionObj = GuidSection()\r
             GuidSectionObj.Alignment = AlignValue\r
             GuidSectionObj.NameGuid = GuidValue\r
@@ -3025,8 +2999,8 @@ class FdfParser:
                 if not IsLeafSection and not IsEncapSection:\r
                     break\r
 \r
                 if not IsLeafSection and not IsEncapSection:\r
                     break\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
             Obj.SectionList.append(GuidSectionObj)\r
 \r
             return True\r
             Obj.SectionList.append(GuidSectionObj)\r
 \r
             return True\r
@@ -3050,10 +3024,10 @@ class FdfParser:
             AttribKey = self._Token\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             AttribKey = self._Token\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("TRUE(1)/FALSE(0)/Number", self.FileName, self.CurrentLineNumber)\r
             elif AttribKey == "EXTRA_HEADER_SIZE":\r
                 Base = 10\r
                 if self._Token[0:2].upper() == "0X":\r
             elif AttribKey == "EXTRA_HEADER_SIZE":\r
                 Base = 10\r
                 if self._Token[0:2].upper() == "0X":\r
@@ -3062,9 +3036,9 @@ class FdfParser:
                     AttribDict[AttribKey] = int(self._Token, Base)\r
                     continue\r
                 except ValueError:\r
                     AttribDict[AttribKey] = int(self._Token, Base)\r
                     continue\r
                 except ValueError:\r
-                    raise Warning("expected Number", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("Number", self.FileName, self.CurrentLineNumber)\r
             elif self._Token.upper() not in {"TRUE", "FALSE", "1", "0"}:\r
             elif self._Token.upper() not in {"TRUE", "FALSE", "1", "0"}:\r
-                raise Warning("expected TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("TRUE/FALSE (1/0)", self.FileName, self.CurrentLineNumber)\r
             AttribDict[AttribKey] = self._Token\r
 \r
         return AttribDict\r
             AttribDict[AttribKey] = self._Token\r
 \r
         return AttribDict\r
@@ -3082,7 +3056,7 @@ class FdfParser:
         OldPos = self.GetFileBufferPos()\r
         if not self._IsKeyword("SECTION"):\r
             if len(FfsFileObj.SectionList) == 0:\r
         OldPos = self.GetFileBufferPos()\r
         if not self._IsKeyword("SECTION"):\r
             if len(FfsFileObj.SectionList) == 0:\r
-                raise Warning("expected SECTION", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("SECTION", self.FileName, self.CurrentLineNumber)\r
             else:\r
                 return False\r
 \r
             else:\r
                 return False\r
 \r
@@ -3117,7 +3091,7 @@ class FdfParser:
         FmpData.UiName = FmpUiName\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
         FmpData.UiName = FmpUiName\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
             raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
             raise Warning("The FMP payload section is empty!", self.FileName, self.CurrentLineNumber)\r
@@ -3126,20 +3100,20 @@ class FdfParser:
             Name = self._Token\r
             FmpKeyList.remove(Name)\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
             Name = self._Token\r
             FmpKeyList.remove(Name)\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if Name == 'IMAGE_TYPE_ID':\r
                 if not self._GetNextGuid():\r
             if Name == 'IMAGE_TYPE_ID':\r
                 if not self._GetNextGuid():\r
-                    raise Warning("expected GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("GUID value for IMAGE_TYPE_ID.", self.FileName, self.CurrentLineNumber)\r
                 FmpData.ImageTypeId = self._Token\r
             elif Name == 'CERTIFICATE_GUID':\r
                 if not self._GetNextGuid():\r
                 FmpData.ImageTypeId = self._Token\r
             elif Name == 'CERTIFICATE_GUID':\r
                 if not self._GetNextGuid():\r
-                    raise Warning("expected GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("GUID value for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
                 FmpData.Certificate_Guid = self._Token\r
                 if UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID:\r
                     raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
             else:\r
                 if not self._GetNextToken():\r
                 FmpData.Certificate_Guid = self._Token\r
                 if UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_RSA2048_SHA256_GUID and UUID(FmpData.Certificate_Guid) != EFI_CERT_TYPE_PKCS7_GUID:\r
                     raise Warning("Only support EFI_CERT_TYPE_RSA2048_SHA256_GUID or EFI_CERT_TYPE_PKCS7_GUID for CERTIFICATE_GUID.", self.FileName, self.CurrentLineNumber)\r
             else:\r
                 if not self._GetNextToken():\r
-                    raise Warning("expected value of %s" % Name, self.FileName, self.CurrentLineNumber)\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 FdfParser._Verify(Name, Value, 'UINT8'):\r
                 Value = self._Token\r
                 if Name == 'IMAGE_HEADER_INIT_VERSION':\r
                     if FdfParser._Verify(Name, Value, 'UINT8'):\r
@@ -3154,9 +3128,9 @@ class FdfParser:
                     if FdfParser._Verify(Name, Value, 'UINT64'):\r
                         FmpData.MonotonicCount = Value\r
                         if FmpData.MonotonicCount.upper().startswith('0X'):\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 = int(FmpData.MonotonicCount, 16)\r
                         else:\r
                         else:\r
-                            FmpData.MonotonicCount = (long)(FmpData.MonotonicCount)\r
+                            FmpData.MonotonicCount = int(FmpData.MonotonicCount)\r
             if not self._GetNextToken():\r
                 break\r
         else:\r
             if not self._GetNextToken():\r
                 break\r
         else:\r
@@ -3167,14 +3141,14 @@ class FdfParser:
 \r
         # Only the IMAGE_TYPE_ID is required item\r
         if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList:\r
 \r
         # Only the IMAGE_TYPE_ID is required item\r
         if FmpKeyList and 'IMAGE_TYPE_ID' in FmpKeyList:\r
-            raise Warning("Missing keywords IMAGE_TYPE_ID in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
+            raise Warning("'IMAGE_TYPE_ID' in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
         # get the Image file and Vendor code file\r
         self._GetFMPCapsuleData(FmpData)\r
         if not FmpData.ImageFile:\r
             raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
         # check whether more than one Vendor code file\r
         if len(FmpData.VendorCodeFile) > 1:\r
         # get the Image file and Vendor code file\r
         self._GetFMPCapsuleData(FmpData)\r
         if not FmpData.ImageFile:\r
             raise Warning("Missing image file in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
         # check whether more than one Vendor code file\r
         if len(FmpData.VendorCodeFile) > 1:\r
-            raise Warning("At most one Image file and one Vendor code file are allowed in FMP payload section.", self.FileName, self.CurrentLineNumber)\r
+            raise Warning("Vendor code file max of 1 per FMP payload section.", self.FileName, self.CurrentLineNumber)\r
         self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
         return True\r
 \r
         self.Profile.FmpPayloadDict[FmpUiName] = FmpData\r
         return True\r
 \r
@@ -3201,25 +3175,25 @@ class FdfParser:
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
-            raise Warning("expected [Capsule.]", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("[Capsule.]", self.FileName, self.CurrentLineNumber)\r
 \r
         CapsuleObj = Capsule()\r
 \r
         CapsuleName = self._GetUiName()\r
         if not CapsuleName:\r
 \r
         CapsuleObj = Capsule()\r
 \r
         CapsuleName = self._GetUiName()\r
         if not CapsuleName:\r
-            raise Warning("expected capsule name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("capsule name", self.FileName, self.CurrentLineNumber)\r
 \r
         CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
 \r
         CapsuleObj.UiCapsuleName = CapsuleName.upper()\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         if self._IsKeyword("CREATE_FILE"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if self._IsKeyword("CREATE_FILE"):\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected file name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("file name", self.FileName, self.CurrentLineNumber)\r
 \r
             CapsuleObj.CreateFile = self._Token\r
 \r
 \r
             CapsuleObj.CreateFile = self._Token\r
 \r
@@ -3253,30 +3227,30 @@ class FdfParser:
         while self._Token in {"CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"}:\r
             Name = self._Token.strip()\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
         while self._Token in {"CAPSULE_GUID", "CAPSULE_HEADER_SIZE", "CAPSULE_FLAGS", "OEM_CAPSULE_FLAGS", "CAPSULE_HEADER_INIT_VERSION"}:\r
             Name = self._Token.strip()\r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
             if not self._GetNextToken():\r
             if not self._GetNextToken():\r
-                raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("value", self.FileName, self.CurrentLineNumber)\r
             if Name == 'CAPSULE_FLAGS':\r
                 if not self._Token in {"PersistAcrossReset", "PopulateSystemTable", "InitiateReset"}:\r
             if Name == 'CAPSULE_FLAGS':\r
                 if not self._Token in {"PersistAcrossReset", "PopulateSystemTable", "InitiateReset"}:\r
-                    raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
                 Value = self._Token.strip()\r
                 while self._IsToken(TAB_COMMA_SPLIT):\r
                     Value += TAB_COMMA_SPLIT\r
                     if not self._GetNextToken():\r
                 Value = self._Token.strip()\r
                 while self._IsToken(TAB_COMMA_SPLIT):\r
                     Value += TAB_COMMA_SPLIT\r
                     if not self._GetNextToken():\r
-                        raise Warning("expected value", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("value", self.FileName, self.CurrentLineNumber)\r
                     if not self._Token in {"PersistAcrossReset", "PopulateSystemTable", "InitiateReset"}:\r
                     if not self._Token in {"PersistAcrossReset", "PopulateSystemTable", "InitiateReset"}:\r
-                        raise Warning("expected PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("PersistAcrossReset, PopulateSystemTable, or InitiateReset", self.FileName, self.CurrentLineNumber)\r
                     Value += self._Token.strip()\r
             elif Name == 'OEM_CAPSULE_FLAGS':\r
                 Value = self._Token.strip()\r
                 if not Value.upper().startswith('0X'):\r
                     Value += self._Token.strip()\r
             elif Name == 'OEM_CAPSULE_FLAGS':\r
                 Value = self._Token.strip()\r
                 if not Value.upper().startswith('0X'):\r
-                    raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("hex value starting with 0x", self.FileName, self.CurrentLineNumber)\r
                 try:\r
                     Value = int(Value, 0)\r
                 except ValueError:\r
                 try:\r
                     Value = int(Value, 0)\r
                 except ValueError:\r
-                    raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("hex string failed to convert to value", self.FileName, self.CurrentLineNumber)\r
                 if not 0x0000 <= Value <= 0xFFFF:\r
                 if not 0x0000 <= Value <= 0xFFFF:\r
-                    raise Warning("expected hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("hex value between 0x0000 and 0xFFFF", self.FileName, self.CurrentLineNumber)\r
                 Value = self._Token.strip()\r
             else:\r
                 Value = self._Token.strip()\r
                 Value = self._Token.strip()\r
             else:\r
                 Value = self._Token.strip()\r
@@ -3333,10 +3307,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected FV name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FV name", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token.upper() not in self.Profile.FvDict:\r
             raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token.upper() not in self.Profile.FvDict:\r
             raise Warning("FV name does not exist", self.FileName, self.CurrentLineNumber)\r
@@ -3366,10 +3340,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected FD name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FD name", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token.upper() not in self.Profile.FdDict:\r
             raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token.upper() not in self.Profile.FdDict:\r
             raise Warning("FD name does not exist", self.FileName, self.CurrentLineNumber)\r
@@ -3395,10 +3369,10 @@ class FdfParser:
                 return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
                 return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("payload name after FMP_PAYLOAD =", self.FileName, self.CurrentLineNumber)\r
         Payload = self._Token.upper()\r
         if Payload not in self.Profile.FmpPayloadDict:\r
             raise Warning("This FMP Payload does not exist: %s" % self._Token, self.FileName, self.CurrentLineNumber)\r
         Payload = self._Token.upper()\r
         if Payload not in self.Profile.FmpPayloadDict:\r
             raise Warning("This FMP Payload does not exist: %s" % self._Token, self.FileName, self.CurrentLineNumber)\r
@@ -3414,10 +3388,10 @@ class FdfParser:
             return None\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return None\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("File name", self.FileName, self.CurrentLineNumber)\r
 \r
         AnyFileName = self._Token\r
         self._VerifyFile(AnyFileName)\r
 \r
         AnyFileName = self._Token\r
         self._VerifyFile(AnyFileName)\r
@@ -3466,10 +3440,10 @@ class FdfParser:
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             return False\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextToken():\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected Afile name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Afile name", self.FileName, self.CurrentLineNumber)\r
 \r
         AfileName = self._Token\r
         AfileBaseName = os.path.basename(AfileName)\r
 \r
         AfileName = self._Token\r
         AfileBaseName = os.path.basename(AfileName)\r
@@ -3514,10 +3488,10 @@ class FdfParser:
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
             #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
-            raise Warning("expected [Rule.]", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("[Rule.]", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._SkipToToken(TAB_SPLIT):\r
 \r
         if not self._SkipToToken(TAB_SPLIT):\r
-            raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'.'", self.FileName, self.CurrentLineNumber)\r
 \r
         Arch = self._SkippedChars.rstrip(TAB_SPLIT)\r
         if Arch.upper() not in ARCH_SET_FULL:\r
 \r
         Arch = self._SkippedChars.rstrip(TAB_SPLIT)\r
         if Arch.upper() not in ARCH_SET_FULL:\r
@@ -3528,11 +3502,11 @@ class FdfParser:
         TemplateName = ""\r
         if self._IsToken(TAB_SPLIT):\r
             if not self._GetNextWord():\r
         TemplateName = ""\r
         if self._IsToken(TAB_SPLIT):\r
             if not self._GetNextWord():\r
-                raise Warning("expected template name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("template name", self.FileName, self.CurrentLineNumber)\r
             TemplateName = self._Token\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
             TemplateName = self._Token\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         RuleObj = self._GetRuleFileStatements()\r
         RuleObj.Arch = Arch.upper()\r
 \r
         RuleObj = self._GetRuleFileStatements()\r
         RuleObj.Arch = Arch.upper()\r
@@ -3563,7 +3537,7 @@ class FdfParser:
     #\r
     def _GetModuleType(self):\r
         if not self._GetNextWord():\r
     #\r
     def _GetModuleType(self):\r
         if not self._GetNextWord():\r
-            raise Warning("expected Module type", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("Module type", self.FileName, self.CurrentLineNumber)\r
         if self._Token.upper() not in {\r
                 SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\r
                 SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER,\r
         if self._Token.upper() not in {\r
                 SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\r
                 SUP_MODULE_DXE_CORE, SUP_MODULE_DXE_DRIVER,\r
@@ -3592,7 +3566,7 @@ class FdfParser:
     #\r
     def _GetFileExtension(self):\r
         if not self._IsToken(TAB_SPLIT):\r
     #\r
     def _GetFileExtension(self):\r
         if not self._IsToken(TAB_SPLIT):\r
-            raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("'.'", self.FileName, self.CurrentLineNumber)\r
 \r
         Ext = ""\r
         if self._GetNextToken():\r
 \r
         Ext = ""\r
         if self._GetNextToken():\r
@@ -3603,7 +3577,7 @@ class FdfParser:
                 raise Warning("Unknown file extension '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
 \r
         else:\r
                 raise Warning("Unknown file extension '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
 \r
         else:\r
-            raise Warning("expected file extension", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("file extension", self.FileName, self.CurrentLineNumber)\r
 \r
     ## _GetRuleFileStatement() method\r
     #\r
 \r
     ## _GetRuleFileStatement() method\r
     #\r
@@ -3614,10 +3588,10 @@ class FdfParser:
     #\r
     def _GetRuleFileStatements(self):\r
         if not self._IsKeyword("FILE"):\r
     #\r
     def _GetRuleFileStatements(self):\r
         if not self._IsKeyword("FILE"):\r
-            raise Warning("expected FILE", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FILE", self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._GetNextWord():\r
 \r
         if not self._GetNextWord():\r
-            raise Warning("expected FFS type", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("FFS type", self.FileName, self.CurrentLineNumber)\r
 \r
         Type = self._Token.strip().upper()\r
         if Type not in {"RAW", "FREEFORM", SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\r
 \r
         Type = self._Token.strip().upper()\r
         if Type not in {"RAW", "FREEFORM", SUP_MODULE_SEC, SUP_MODULE_PEI_CORE, SUP_MODULE_PEIM,\r
@@ -3627,17 +3601,22 @@ class FdfParser:
             raise Warning("Unknown FV type '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
             raise Warning("Unknown FV type '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
         if not self._IsKeyword("$(NAMED_GUID)"):\r
             if not self._GetNextWord():\r
 \r
         if not self._IsKeyword("$(NAMED_GUID)"):\r
             if not self._GetNextWord():\r
-                raise Warning("expected $(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
+                NamedGuid = self._CurrentLine()[self.CurrentOffsetWithinLine:].split()[0].strip()\r
+                if GlobalData.gGuidPatternEnd.match(NamedGuid):\r
+                    self.CurrentOffsetWithinLine += len(NamedGuid)\r
+                    self._Token = NamedGuid\r
+                else:\r
+                    raise Warning.Expected("$(NAMED_GUID)", self.FileName, self.CurrentLineNumber)\r
             if self._Token == 'PCD':\r
                 if not self._IsToken("("):\r
             if self._Token == 'PCD':\r
                 if not self._IsToken("("):\r
-                    raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("'('", self.FileName, self.CurrentLineNumber)\r
                 PcdPair = self._GetNextPcdSettings()\r
                 if not self._IsToken(")"):\r
                 PcdPair = self._GetNextPcdSettings()\r
                 if not self._IsToken(")"):\r
-                    raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("')'", self.FileName, self.CurrentLineNumber)\r
                 self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')'\r
 \r
         NameGuid = self._Token\r
                 self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')'\r
 \r
         NameGuid = self._Token\r
@@ -3659,7 +3638,7 @@ class FdfParser:
                 if self._IsToken(TAB_COMMA_SPLIT):\r
                     while self._GetNextToken():\r
                         if not TokenFindPattern.match(self._Token):\r
                 if self._IsToken(TAB_COMMA_SPLIT):\r
                     while self._GetNextToken():\r
                         if not TokenFindPattern.match(self._Token):\r
-                            raise Warning("expected KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
+                            raise Warning.Expected("KeyString \"Target_Tag_Arch\"", self.FileName, self.CurrentLineNumber)\r
                         KeyStringList.append(self._Token)\r
 \r
                         if not self._IsToken(TAB_COMMA_SPLIT):\r
                         KeyStringList.append(self._Token)\r
 \r
                         if not self._IsToken(TAB_COMMA_SPLIT):\r
@@ -3703,15 +3682,15 @@ class FdfParser:
                 if not IsEncapsulate and not IsLeaf:\r
                     break\r
 \r
                 if not IsEncapsulate and not IsLeaf:\r
                     break\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
 \r
             return NewRule\r
 \r
         else:\r
             # Simple file rule expected\r
             if not self._GetNextWord():\r
 \r
             return NewRule\r
 \r
         else:\r
             # Simple file rule expected\r
             if not self._GetNextWord():\r
-                raise Warning("expected leaf section type", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("leaf section type", self.FileName, self.CurrentLineNumber)\r
 \r
             SectionName = self._Token\r
 \r
 \r
             SectionName = self._Token\r
 \r
@@ -3742,7 +3721,7 @@ class FdfParser:
             if self._IsToken(TAB_VALUE_SPLIT):\r
                 Ext = self._GetFileExtension()\r
             elif not self._GetNextToken():\r
             if self._IsToken(TAB_VALUE_SPLIT):\r
                 Ext = self._GetFileExtension()\r
             elif not self._GetNextToken():\r
-                raise Warning("expected File name", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("File name", self.FileName, self.CurrentLineNumber)\r
 \r
             NewRule = RuleSimpleFile()\r
             NewRule.SectionType = SectionName\r
 \r
             NewRule = RuleSimpleFile()\r
             NewRule.SectionType = SectionName\r
@@ -3770,8 +3749,19 @@ class FdfParser:
     #\r
     def _GetEfiSection(self, Obj):\r
         OldPos = self.GetFileBufferPos()\r
     #\r
     def _GetEfiSection(self, Obj):\r
         OldPos = self.GetFileBufferPos()\r
+        EfiSectionObj = EfiSection()\r
         if not self._GetNextWord():\r
         if not self._GetNextWord():\r
-            return False\r
+            CurrentLine = self._CurrentLine()[self.CurrentOffsetWithinLine:].split()[0].strip()\r
+            if self._Token == '{' and Obj.FvFileType == "RAW" and TAB_SPLIT in CurrentLine:\r
+                if self._IsToken(TAB_VALUE_SPLIT):\r
+                    EfiSectionObj.FileExtension = self._GetFileExtension()\r
+                elif self._GetNextToken():\r
+                    EfiSectionObj.FileName = self._Token\r
+                EfiSectionObj.SectionType = BINARY_FILE_TYPE_RAW\r
+                Obj.SectionList.append(EfiSectionObj)\r
+                return True\r
+            else:\r
+                return False\r
         SectionName = self._Token\r
 \r
         if SectionName not in {\r
         SectionName = self._Token\r
 \r
         if SectionName not in {\r
@@ -3803,14 +3793,14 @@ class FdfParser:
                     if not IsInf and not IsFile:\r
                         break\r
 \r
                     if not IsInf and not IsFile:\r
                         break\r
 \r
-                if not self._IsToken("}"):\r
-                    raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+                if not self._IsToken(T_CHAR_BRACE_R):\r
+                    raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
                 FvImageSectionObj.Fv = FvObj\r
                 FvImageSectionObj.FvName = None\r
 \r
             else:\r
                 if not self._IsKeyword(BINARY_FILE_TYPE_FV):\r
                 FvImageSectionObj.Fv = FvObj\r
                 FvImageSectionObj.FvName = None\r
 \r
             else:\r
                 if not self._IsKeyword(BINARY_FILE_TYPE_FV):\r
-                    raise Warning("expected 'FV'", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("'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
@@ -3822,7 +3812,7 @@ class FdfParser:
                     FvImageSectionObj.FvFileExtension = self._GetFileExtension()\r
                 elif self._GetNextToken():\r
                     if self._Token not in {\r
                     FvImageSectionObj.FvFileExtension = self._GetFileExtension()\r
                 elif self._GetNextToken():\r
                     if self._Token not in {\r
-                            "}", "COMPAT16", BINARY_FILE_TYPE_PE32,\r
+                            T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32,\r
                             BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE,\r
                             "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\r
                             BINARY_FILE_TYPE_UI, "VERSION",\r
                             BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE,\r
                             "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\r
                             BINARY_FILE_TYPE_UI, "VERSION",\r
@@ -3832,26 +3822,25 @@ class FdfParser:
                     else:\r
                         self._UndoToken()\r
                 else:\r
                     else:\r
                         self._UndoToken()\r
                 else:\r
-                    raise Warning("expected FV file name", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("FV file name", self.FileName, self.CurrentLineNumber)\r
 \r
             Obj.SectionList.append(FvImageSectionObj)\r
             return True\r
 \r
 \r
             Obj.SectionList.append(FvImageSectionObj)\r
             return True\r
 \r
-        EfiSectionObj = EfiSection()\r
         EfiSectionObj.SectionType = SectionName\r
 \r
         if not self._GetNextToken():\r
         EfiSectionObj.SectionType = SectionName\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected file type", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("file type", self.FileName, self.CurrentLineNumber)\r
 \r
         if self._Token == "STRING":\r
             if not self._RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
                 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
 \r
         if self._Token == "STRING":\r
             if not self._RuleSectionCouldHaveString(EfiSectionObj.SectionType):\r
                 raise Warning("%s section could NOT have string data%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
 \r
             if not self._GetNextToken():\r
 \r
             if not self._GetNextToken():\r
-                raise Warning("expected Quoted String", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("Quoted String", self.FileName, self.CurrentLineNumber)\r
 \r
             if self._GetStringData():\r
                 EfiSectionObj.StringData = self._Token\r
 \r
             if self._GetStringData():\r
                 EfiSectionObj.StringData = self._Token\r
@@ -3861,9 +3850,9 @@ class FdfParser:
                     raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                    raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                 if not self._GetNextToken():\r
                 if not self._GetNextToken():\r
-                    raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("Build number", self.FileName, self.CurrentLineNumber)\r
                 EfiSectionObj.BuildNum = self._Token\r
 \r
         else:\r
                 EfiSectionObj.BuildNum = self._Token\r
 \r
         else:\r
@@ -3880,9 +3869,9 @@ class FdfParser:
                     raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     raise Warning("%s section could NOT have BUILD_NUM%d" % (EfiSectionObj.SectionType, self.CurrentLineNumber), self.FileName, self.CurrentLineNumber)\r
 \r
                 if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                    raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                 if not self._GetNextToken():\r
                 if not self._GetNextToken():\r
-                    raise Warning("expected Build number", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.Expected("Build number", self.FileName, self.CurrentLineNumber)\r
                 EfiSectionObj.BuildNum = self._Token\r
 \r
         if self._GetAlignment():\r
                 EfiSectionObj.BuildNum = self._Token\r
 \r
         if self._GetAlignment():\r
@@ -3908,7 +3897,7 @@ class FdfParser:
             EfiSectionObj.FileExtension = self._GetFileExtension()\r
         elif self._GetNextToken():\r
             if self._Token not in {\r
             EfiSectionObj.FileExtension = self._GetFileExtension()\r
         elif self._GetNextToken():\r
             if self._Token not in {\r
-                    "}", "COMPAT16", BINARY_FILE_TYPE_PE32,\r
+                    T_CHAR_BRACE_R, "COMPAT16", BINARY_FILE_TYPE_PE32,\r
                     BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE,\r
                     "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\r
                     BINARY_FILE_TYPE_UI, "VERSION",\r
                     BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_TE,\r
                     "FV_IMAGE", "RAW", BINARY_FILE_TYPE_DXE_DEPEX,\r
                     BINARY_FILE_TYPE_UI, "VERSION",\r
@@ -3921,10 +3910,10 @@ class FdfParser:
 \r
                     if self._Token == 'PCD':\r
                         if not self._IsToken("("):\r
 \r
                     if self._Token == 'PCD':\r
                         if not self._IsToken("("):\r
-                            raise Warning("expected '('", self.FileName, self.CurrentLineNumber)\r
+                            raise Warning.Expected("'('", self.FileName, self.CurrentLineNumber)\r
                         PcdPair = self._GetNextPcdSettings()\r
                         if not self._IsToken(")"):\r
                         PcdPair = self._GetNextPcdSettings()\r
                         if not self._IsToken(")"):\r
-                            raise Warning("expected ')'", self.FileName, self.CurrentLineNumber)\r
+                            raise Warning.Expected("')'", self.FileName, self.CurrentLineNumber)\r
                         self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')'\r
 \r
                 EfiSectionObj.FileName = self._Token\r
                         self._Token = 'PCD('+PcdPair[1]+TAB_SPLIT+PcdPair[0]+')'\r
 \r
                 EfiSectionObj.FileName = self._Token\r
@@ -3932,7 +3921,7 @@ class FdfParser:
             else:\r
                 self._UndoToken()\r
         else:\r
             else:\r
                 self._UndoToken()\r
         else:\r
-            raise Warning("expected section file name", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("section file name", self.FileName, self.CurrentLineNumber)\r
 \r
         Obj.SectionList.append(EfiSectionObj)\r
         return True\r
 \r
         Obj.SectionList.append(EfiSectionObj)\r
         return True\r
@@ -3991,36 +3980,37 @@ class FdfParser:
     #   @param  FileType    The file type to check\r
     #\r
     def _CheckRuleSectionFileType(self, SectionType, FileType):\r
     #   @param  FileType    The file type to check\r
     #\r
     def _CheckRuleSectionFileType(self, SectionType, FileType):\r
+        WarningString = "Incorrect section file type '%s'"\r
         if SectionType == "COMPAT16":\r
             if FileType not in {"COMPAT16", "SEC_COMPAT16"}:\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
+                raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == BINARY_FILE_TYPE_PE32:\r
             if FileType not in {BINARY_FILE_TYPE_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(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == BINARY_FILE_TYPE_PIC:\r
             if FileType not in {BINARY_FILE_TYPE_PIC, BINARY_FILE_TYPE_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(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == BINARY_FILE_TYPE_TE:\r
             if FileType not in {BINARY_FILE_TYPE_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
+                raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == "RAW":\r
             if FileType not in {BINARY_FILE_TYPE_BIN, "SEC_BIN", "RAW", "ASL", "ACPI"}:\r
         elif SectionType == "RAW":\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(WarningString % FileType, self.FileName, self.CurrentLineNumber)\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
         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(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == BINARY_FILE_TYPE_UI:\r
             if FileType not in {BINARY_FILE_TYPE_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
+                raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == "VERSION":\r
             if FileType not in {"VERSION", "SEC_VERSION"}:\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(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == BINARY_FILE_TYPE_PEI_DEPEX:\r
             if FileType not in {BINARY_FILE_TYPE_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(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
         elif SectionType == BINARY_FILE_TYPE_GUID:\r
             if FileType not in {BINARY_FILE_TYPE_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
+                raise Warning(WarningString % FileType, self.FileName, self.CurrentLineNumber)\r
 \r
     ## _GetRuleEncapsulationSection() method\r
     #\r
 \r
     ## _GetRuleEncapsulationSection() method\r
     #\r
@@ -4038,7 +4028,7 @@ class FdfParser:
                 Type = self._Token\r
 \r
             if not self._IsToken("{"):\r
                 Type = self._Token\r
 \r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
             CompressSectionObj = CompressSection()\r
 \r
 \r
             CompressSectionObj = CompressSection()\r
 \r
@@ -4050,8 +4040,8 @@ class FdfParser:
                 if not IsEncapsulate and not IsLeaf:\r
                     break\r
 \r
                 if not IsEncapsulate and not IsLeaf:\r
                     break\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
             theRule.SectionList.append(CompressSectionObj)\r
 \r
             return True\r
             theRule.SectionList.append(CompressSectionObj)\r
 \r
             return True\r
@@ -4067,7 +4057,7 @@ class FdfParser:
             AttribDict = self._GetGuidAttrib()\r
 \r
             if not self._IsToken("{"):\r
             AttribDict = self._GetGuidAttrib()\r
 \r
             if not self._IsToken("{"):\r
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
             GuidSectionObj = GuidSection()\r
             GuidSectionObj.NameGuid = GuidValue\r
             GuidSectionObj.SectionType = "GUIDED"\r
             GuidSectionObj = GuidSection()\r
             GuidSectionObj.NameGuid = GuidValue\r
             GuidSectionObj.SectionType = "GUIDED"\r
@@ -4082,219 +4072,14 @@ class FdfParser:
                 if not IsEncapsulate and not IsLeaf:\r
                     break\r
 \r
                 if not IsEncapsulate and not IsLeaf:\r
                     break\r
 \r
-            if not self._IsToken("}"):\r
-                raise Warning("expected '}'", self.FileName, self.CurrentLineNumber)\r
+            if not self._IsToken(T_CHAR_BRACE_R):\r
+                raise Warning.ExpectedCurlyClose(self.FileName, self.CurrentLineNumber)\r
             theRule.SectionList.append(GuidSectionObj)\r
 \r
             return True\r
 \r
         return False\r
 \r
             theRule.SectionList.append(GuidSectionObj)\r
 \r
             return True\r
 \r
         return False\r
 \r
-    ## _GetVtf() method\r
-    #\r
-    #   Get VTF section contents and store its data into VTF list of self.Profile\r
-    #\r
-    #   @param  self        The object pointer\r
-    #   @retval True        Successfully find a VTF\r
-    #   @retval False       Not able to find a VTF\r
-    #\r
-    def _GetVtf(self):\r
-        HW_ARCH_SET = {TAB_ARCH_IA32, TAB_ARCH_X64, TAB_ARCH_IPF, TAB_ARCH_ARM, TAB_ARCH_AARCH64}\r
-        if not self._GetNextToken():\r
-            return False\r
-\r
-        S = self._Token.upper()\r
-        if S.startswith(TAB_SECTION_START) and not S.startswith("[VTF."):\r
-            self.SectionParser(S)\r
-            self._UndoToken()\r
-            return False\r
-\r
-        self._UndoToken()\r
-        if not self._IsToken("[VTF.", True):\r
-            FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
-            #print 'Parsing String: %s in File %s, At line: %d, Offset Within Line: %d' \\r
-            #        % (self.Profile.FileLinesList[self.CurrentLineNumber - 1][self.CurrentOffsetWithinLine:], FileLineTuple[0], FileLineTuple[1], self.CurrentOffsetWithinLine)\r
-            raise Warning("expected [VTF.]", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._SkipToToken(TAB_SPLIT):\r
-            raise Warning("expected '.'", self.FileName, self.CurrentLineNumber)\r
-\r
-        Arch = self._SkippedChars.rstrip(TAB_SPLIT).upper()\r
-        if Arch not in HW_ARCH_SET:\r
-            raise Warning("Unknown Arch '%s'" % Arch, self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextWord():\r
-            raise Warning("expected VTF name", self.FileName, self.CurrentLineNumber)\r
-        Name = self._Token.upper()\r
-\r
-        VtfObj = Vtf()\r
-        VtfObj.UiName = Name\r
-        VtfObj.KeyArch = Arch\r
-\r
-        if self._IsToken(TAB_COMMA_SPLIT):\r
-            if not self._GetNextWord():\r
-                raise Warning("expected Arch list", self.FileName, self.CurrentLineNumber)\r
-            if self._Token.upper() not in HW_ARCH_SET:\r
-                raise Warning("Unknown Arch '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
-            VtfObj.ArchList = self._Token.upper()\r
-\r
-        if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
-\r
-        if self._IsKeyword("IA32_RST_BIN"):\r
-            if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-            if not self._GetNextToken():\r
-                raise Warning("expected Reset file", self.FileName, self.CurrentLineNumber)\r
-\r
-            VtfObj.ResetBin = self._Token\r
-            if VtfObj.ResetBin.replace(TAB_WORKSPACE, '').find('$') == -1:\r
-                #check for file path\r
-                ErrorCode, ErrorInfo = PathClass(NormPath(VtfObj.ResetBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
-                if ErrorCode != 0:\r
-                    EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
-\r
-        while self._GetComponentStatement(VtfObj):\r
-            pass\r
-\r
-        self.Profile.VtfList.append(VtfObj)\r
-        return True\r
-\r
-    ## _GetComponentStatement() method\r
-    #\r
-    #   Get components in VTF\r
-    #\r
-    #   @param  self        The object pointer\r
-    #   @param  VtfObj         for whom component is got\r
-    #   @retval True        Successfully find a component\r
-    #   @retval False       Not able to find a component\r
-    #\r
-    def _GetComponentStatement(self, VtfObj):\r
-        if not self._IsKeyword("COMP_NAME"):\r
-            return False\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextWord():\r
-            raise Warning("expected Component Name", self.FileName, self.CurrentLineNumber)\r
-\r
-        CompStatementObj = ComponentStatement()\r
-        CompStatementObj.CompName = self._Token\r
-\r
-        if not self._IsKeyword("COMP_LOC"):\r
-            raise Warning("expected COMP_LOC", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        CompStatementObj.CompLoc = ""\r
-        if self._GetNextWord():\r
-            CompStatementObj.CompLoc = self._Token\r
-            if self._IsToken(TAB_VALUE_SPLIT):\r
-                if not self._GetNextWord():\r
-                    raise Warning("Expected Region Name", self.FileName, self.CurrentLineNumber)\r
-\r
-                if self._Token not in {"F", "N", "S"}:    #, "H", "L", "PH", "PL"): not support\r
-                    raise Warning("Unknown location type '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
-\r
-                CompStatementObj.FilePos = self._Token\r
-        else:\r
-            self.CurrentLineNumber += 1\r
-            self.CurrentOffsetWithinLine = 0\r
-\r
-        if not self._IsKeyword("COMP_TYPE"):\r
-            raise Warning("expected COMP_TYPE", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextToken():\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._Token[2] in hexdigits or not self._Token[-1] in hexdigits:\r
-                raise Warning("Unknown location type '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
-        CompStatementObj.CompType = self._Token\r
-\r
-        if not self._IsKeyword("COMP_VER"):\r
-            raise Warning("expected COMP_VER", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextToken():\r
-            raise Warning("expected Component version", self.FileName, self.CurrentLineNumber)\r
-\r
-        Pattern = compile('-$|[0-9a-fA-F]{1,2}\.[0-9a-fA-F]{1,2}$', DOTALL)\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
-        if not self._IsKeyword("COMP_CS"):\r
-            raise Warning("expected COMP_CS", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextToken():\r
-            raise Warning("expected Component CS", self.FileName, self.CurrentLineNumber)\r
-        if self._Token not in {"1", "0"}:\r
-            raise Warning("Unknown  Component CS '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
-        CompStatementObj.CompCs = self._Token\r
-\r
-\r
-        if not self._IsKeyword("COMP_BIN"):\r
-            raise Warning("expected COMP_BIN", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextToken():\r
-            raise Warning("expected Component file", self.FileName, self.CurrentLineNumber)\r
-\r
-        CompStatementObj.CompBin = self._Token\r
-        if CompStatementObj.CompBin != '-' and CompStatementObj.CompBin.replace(TAB_WORKSPACE, '').find('$') == -1:\r
-            #check for file path\r
-            ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompBin), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
-            if ErrorCode != 0:\r
-                EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
-\r
-        if not self._IsKeyword("COMP_SYM"):\r
-            raise Warning("expected COMP_SYM", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._GetNextToken():\r
-            raise Warning("expected Component symbol file", self.FileName, self.CurrentLineNumber)\r
-\r
-        CompStatementObj.CompSym = self._Token\r
-        if CompStatementObj.CompSym != '-' and CompStatementObj.CompSym.replace(TAB_WORKSPACE, '').find('$') == -1:\r
-            #check for file path\r
-            ErrorCode, ErrorInfo = PathClass(NormPath(CompStatementObj.CompSym), GenFdsGlobalVariable.WorkSpaceDir).Validate()\r
-            if ErrorCode != 0:\r
-                EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
-\r
-        if not self._IsKeyword("COMP_SIZE"):\r
-            raise Warning("expected COMP_SIZE", self.FileName, self.CurrentLineNumber)\r
-\r
-        if not self._IsToken(TAB_EQUAL_SPLIT):\r
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-\r
-        if self._IsToken("-"):\r
-            CompStatementObj.CompSize = self._Token\r
-        elif self._GetNextDecimalNumber():\r
-            CompStatementObj.CompSize = self._Token\r
-        elif self._GetNextHexNumber():\r
-            CompStatementObj.CompSize = self._Token\r
-        else:\r
-            raise Warning("Unknown size '%s'" % self._Token, self.FileName, self.CurrentLineNumber)\r
-\r
-        VtfObj.ComponentStatementList.append(CompStatementObj)\r
-        return True\r
-\r
     ## _GetOptionRom() method\r
     #\r
     #   Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
     ## _GetOptionRom() method\r
     #\r
     #   Get OptionROM section contents and store its data into OptionROM list of self.Profile\r
@@ -4320,7 +4105,7 @@ class FdfParser:
         OptRomName = self._GetUiName()\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
         OptRomName = self._GetUiName()\r
 \r
         if not self._IsToken(TAB_SECTION_END):\r
-            raise Warning("expected ']'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedBracketClose(self.FileName, self.CurrentLineNumber)\r
 \r
         OptRomObj = OPTIONROM(OptRomName)\r
         self.Profile.OptRomDict[OptRomName] = OptRomObj\r
 \r
         OptRomObj = OPTIONROM(OptRomName)\r
         self.Profile.OptRomDict[OptRomName] = OptRomObj\r
@@ -4350,7 +4135,7 @@ class FdfParser:
         self._GetInfOptions(ffsInf)\r
 \r
         if not self._GetNextToken():\r
         self._GetInfOptions(ffsInf)\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected INF file path", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("INF file path", self.FileName, self.CurrentLineNumber)\r
         ffsInf.InfFileName = self._Token\r
         if ffsInf.InfFileName.replace(TAB_WORKSPACE, '').find('$') == -1:\r
             #check for file path\r
         ffsInf.InfFileName = self._Token\r
         if ffsInf.InfFileName.replace(TAB_WORKSPACE, '').find('$') == -1:\r
             #check for file path\r
@@ -4358,8 +4143,12 @@ class FdfParser:
             if ErrorCode != 0:\r
                 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
             if ErrorCode != 0:\r
                 EdkLogger.error("GenFds", ErrorCode, ExtraData=ErrorInfo)\r
 \r
-        if not ffsInf.InfFileName in self.Profile.InfList:\r
-            self.Profile.InfList.append(ffsInf.InfFileName)\r
+        NewFileName = ffsInf.InfFileName\r
+        if ffsInf.OverrideGuid:\r
+            NewFileName = ProcessDuplicatedInf(PathClass(ffsInf.InfFileName,GenFdsGlobalVariable.WorkSpaceDir), ffsInf.OverrideGuid, GenFdsGlobalVariable.WorkSpaceDir).Path\r
+\r
+        if not NewFileName in self.Profile.InfList:\r
+            self.Profile.InfList.append(NewFileName)\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.InfFileLineList.append(FileLineTuple)\r
             if ffsInf.UseArch:\r
             FileLineTuple = GetRealFileLine(self.FileName, self.CurrentLineNumber)\r
             self.Profile.InfFileLineList.append(FileLineTuple)\r
             if ffsInf.UseArch:\r
@@ -4389,46 +4178,48 @@ class FdfParser:
             while True:\r
                 if self._IsKeyword("PCI_VENDOR_ID"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
             while True:\r
                 if self._IsKeyword("PCI_VENDOR_ID"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                     if not self._GetNextHexNumber():\r
                     if not self._GetNextHexNumber():\r
-                        raise Warning("expected Hex vendor id", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("Hex vendor id", self.FileName, self.CurrentLineNumber)\r
                     Overrides.PciVendorId = self._Token\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_CLASS_CODE"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     Overrides.PciVendorId = self._Token\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_CLASS_CODE"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                     if not self._GetNextHexNumber():\r
                     if not self._GetNextHexNumber():\r
-                        raise Warning("expected Hex class code", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("Hex class code", self.FileName, self.CurrentLineNumber)\r
                     Overrides.PciClassCode = self._Token\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_DEVICE_ID"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     Overrides.PciClassCode = self._Token\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_DEVICE_ID"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
-                    if not self._GetNextHexNumber():\r
-                        raise Warning("expected Hex device id", self.FileName, self.CurrentLineNumber)\r
-\r
-                    Overrides.PciDeviceId = self._Token\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
+                    # Get a list of PCI IDs\r
+                    Overrides.PciDeviceId = ""\r
+                    while (self._GetNextHexNumber()):\r
+                        Overrides.PciDeviceId = "{} {}".format(Overrides.PciDeviceId, self._Token)\r
+                    if not Overrides.PciDeviceId:\r
+                        raise Warning.Expected("one or more Hex device ids", self.FileName, self.CurrentLineNumber)\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_REVISION"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_REVISION"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                     if not self._GetNextHexNumber():\r
                     if not self._GetNextHexNumber():\r
-                        raise Warning("expected Hex revision", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("Hex revision", self.FileName, self.CurrentLineNumber)\r
                     Overrides.PciRevision = self._Token\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_COMPRESS"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
                     Overrides.PciRevision = self._Token\r
                     continue\r
 \r
                 if self._IsKeyword("PCI_COMPRESS"):\r
                     if not self._IsToken(TAB_EQUAL_SPLIT):\r
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\r
                     if not self._GetNextToken():\r
                     if not self._GetNextToken():\r
-                        raise Warning("expected TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.Expected("TRUE/FALSE for compress", self.FileName, self.CurrentLineNumber)\r
                     Overrides.NeedCompress = self._Token.upper() == 'TRUE'\r
                     continue\r
 \r
                     Overrides.NeedCompress = self._Token.upper() == 'TRUE'\r
                     continue\r
 \r
-                if self._IsToken("}"):\r
+                if self._IsToken(T_CHAR_BRACE_R):\r
                     break\r
                 else:\r
                     EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
                     break\r
                 else:\r
                     EdkLogger.error("FdfParser", FORMAT_INVALID, File=self.FileName, Line=self.CurrentLineNumber)\r
@@ -4451,11 +4242,11 @@ class FdfParser:
         FfsFileObj = OptRomFileStatement()\r
 \r
         if not self._IsKeyword("EFI") and not self._IsKeyword(BINARY_FILE_TYPE_BIN):\r
         FfsFileObj = OptRomFileStatement()\r
 \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
+            raise Warning.Expected("Binary type (EFI/BIN)", self.FileName, self.CurrentLineNumber)\r
         FfsFileObj.FileType = self._Token\r
 \r
         if not self._GetNextToken():\r
         FfsFileObj.FileType = self._Token\r
 \r
         if not self._GetNextToken():\r
-            raise Warning("expected File path", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.Expected("File path", self.FileName, self.CurrentLineNumber)\r
         FfsFileObj.FileName = self._Token\r
         if FfsFileObj.FileName.replace(TAB_WORKSPACE, '').find('$') == -1:\r
             #check for file path\r
         FfsFileObj.FileName = self._Token\r
         if FfsFileObj.FileName.replace(TAB_WORKSPACE, '').find('$') == -1:\r
             #check for file path\r