]> 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 f8f559aecffd0932a4116f6599667ad6a8b4ba42..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
-#  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
@@ -24,7 +18,7 @@ from uuid import UUID
 \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
@@ -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 .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
@@ -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_STAR = '*'\r
+T_CHAR_BRACE_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
@@ -129,6 +121,24 @@ class Warning (Exception):
     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
@@ -143,7 +153,7 @@ class IncludeFileProfile:
         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
@@ -184,8 +194,6 @@ class IncludeFileProfile:
 \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
@@ -199,7 +207,7 @@ class FileProfile:
     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
@@ -218,7 +226,6 @@ class FileProfile:
         self.FdNameNotSet = False\r
         self.FvDict = {}\r
         self.CapsuleDict = {}\r
-        self.VtfList = []\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
-        # [VTF.arch.UiName, arch]\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
-        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
@@ -516,7 +516,7 @@ class FdfParser:
                     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
@@ -535,7 +535,7 @@ class FdfParser:
                 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
@@ -563,10 +563,10 @@ class FdfParser:
 \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
-                    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
@@ -575,7 +575,7 @@ class FdfParser:
                 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
@@ -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
-                        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 + len(MacorValue)\r
+                                PreIndex = StartPos + len(MacroValue)\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
-                        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
-                        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
@@ -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
-                    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
@@ -1031,7 +1031,7 @@ class FdfParser:
 \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
@@ -1048,12 +1048,12 @@ class FdfParser:
         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
-            # 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
@@ -1075,7 +1075,7 @@ class FdfParser:
 \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
@@ -1085,7 +1085,7 @@ class FdfParser:
     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
@@ -1127,13 +1127,13 @@ class FdfParser:
         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
-            # 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
@@ -1143,7 +1143,7 @@ class FdfParser:
 \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
@@ -1153,7 +1153,7 @@ class FdfParser:
     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
@@ -1161,7 +1161,7 @@ class FdfParser:
 \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
@@ -1179,20 +1179,20 @@ class FdfParser:
 \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
-            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
-            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
-                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
@@ -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
+        QuoteToUse = None\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
-            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
+        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
@@ -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
-            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
@@ -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
-            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
@@ -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
-            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
-            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
@@ -1391,9 +1383,9 @@ class FdfParser:
             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
-                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
@@ -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
-                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
@@ -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
-            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
@@ -1444,21 +1436,21 @@ class FdfParser:
                     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
-            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
-            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
@@ -1479,7 +1471,7 @@ class FdfParser:
         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
@@ -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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -1533,10 +1525,10 @@ class FdfParser:
     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
-                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
@@ -1551,10 +1543,10 @@ class FdfParser:
 \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
-                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
@@ -1564,18 +1556,18 @@ class FdfParser:
                 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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-            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
@@ -1594,22 +1586,22 @@ class FdfParser:
     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
-                raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("address", self.FileName, self.CurrentLineNumber)\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
-                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
-                raise Warning("expected address", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("address", self.FileName, self.CurrentLineNumber)\r
 \r
-            RtAddress = long(self._Token, 0)\r
+            RtAddress = int(self._Token, 0)\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
-                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
@@ -1643,10 +1635,10 @@ class FdfParser:
             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
-            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
@@ -1657,17 +1649,17 @@ class FdfParser:
             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
-                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
-                raise Warning("expected block numbers", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.Expected("block numbers", self.FileName, self.CurrentLineNumber)\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
@@ -1699,10 +1691,10 @@ class FdfParser:
             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
-                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
@@ -1738,7 +1730,7 @@ class FdfParser:
             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
@@ -1776,7 +1768,7 @@ class FdfParser:
             Expr += CurCh\r
             self._GetOneChar()\r
         try:\r
-            return long(\r
+            return int(\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
-            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
-            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
@@ -1824,7 +1816,7 @@ class FdfParser:
                            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
@@ -1890,13 +1882,13 @@ class FdfParser:
     #\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
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -1904,10 +1896,10 @@ class FdfParser:
         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
-                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
@@ -1920,13 +1912,13 @@ class FdfParser:
     #\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
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -1934,10 +1926,10 @@ class FdfParser:
         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
-                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
@@ -1950,13 +1942,13 @@ class FdfParser:
     #\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
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -1964,10 +1956,10 @@ class FdfParser:
         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
-                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
@@ -1980,16 +1972,16 @@ class FdfParser:
     #\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
-            raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedEquals(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._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
@@ -2013,8 +2005,8 @@ class FdfParser:
                 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
@@ -2023,13 +2015,13 @@ class FdfParser:
         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
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\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
@@ -2053,8 +2045,8 @@ class FdfParser:
                     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
@@ -2088,7 +2080,7 @@ class FdfParser:
         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
@@ -2138,10 +2130,10 @@ class FdfParser:
             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
-            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
@@ -2165,10 +2157,10 @@ class FdfParser:
             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
-            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
@@ -2189,10 +2181,10 @@ class FdfParser:
             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
-            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
@@ -2230,10 +2222,10 @@ class FdfParser:
                 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
-                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
@@ -2252,10 +2244,10 @@ class FdfParser:
             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
-            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
@@ -2266,10 +2258,10 @@ class FdfParser:
             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 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
@@ -2280,34 +2272,33 @@ class FdfParser:
             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
-            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
-            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
-            raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
-        if not self._IsKeyword ("FILE") and not self._IsKeyword ("DATA"):\r
-            raise Warning("expected 'FILE' or 'DATA'", self.FileName, self.CurrentLineNumber)\r
+        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
             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
-                raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\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
@@ -2323,27 +2314,26 @@ class FdfParser:
                 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
-            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
             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
-                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
-            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
@@ -2361,11 +2351,11 @@ class FdfParser:
             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
-            raise Warning("expected '{'", self.FileName, self.CurrentLineNumber)\r
+            raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\r
 \r
         AprSectionObj = AprioriSection()\r
         AprSectionObj.AprioriType = AprType\r
@@ -2378,8 +2368,8 @@ class FdfParser:
             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
@@ -2392,10 +2382,10 @@ class FdfParser:
         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
-            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
@@ -2409,8 +2399,12 @@ class FdfParser:
             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
@@ -2462,41 +2456,41 @@ class FdfParser:
     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
-                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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -2512,7 +2506,7 @@ class FdfParser:
 \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
@@ -2532,7 +2526,7 @@ class FdfParser:
             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
@@ -2543,17 +2537,17 @@ class FdfParser:
         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
-                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
-                    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
-                    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
@@ -2579,7 +2573,7 @@ class FdfParser:
     #\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
@@ -2620,23 +2614,23 @@ 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("expected '{'", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedCurlyOpen(self.FileName, self.CurrentLineNumber)\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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -2653,8 +2647,8 @@ class FdfParser:
             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
@@ -2675,19 +2669,19 @@ class FdfParser:
                 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
-            if FileName == '}':\r
+            if FileName == T_CHAR_BRACE_R:\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
-            if self._IsToken("}"):\r
+            if self._IsToken(T_CHAR_BRACE_R):\r
                 self._UndoToken()\r
                 break\r
 \r
@@ -2710,7 +2704,7 @@ class FdfParser:
                 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
@@ -2743,10 +2737,10 @@ class FdfParser:
     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
-                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
@@ -2781,7 +2775,7 @@ class FdfParser:
 \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
@@ -2794,10 +2788,10 @@ class FdfParser:
         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
-                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
@@ -2805,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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -2821,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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -2836,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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -2859,8 +2853,8 @@ class FdfParser:
                     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
@@ -2881,18 +2875,18 @@ class FdfParser:
             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
-                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
-            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
-                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
@@ -2921,7 +2915,7 @@ class FdfParser:
 \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
@@ -2965,7 +2959,7 @@ class FdfParser:
                 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
@@ -2978,13 +2972,9 @@ class FdfParser:
                     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
-\r
-#            else:\r
-#               raise Warning("Compress type not known")\r
-\r
             return True\r
 \r
         elif self._IsKeyword("GUIDED"):\r
@@ -2994,7 +2984,7 @@ class FdfParser:
 \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
@@ -3009,8 +2999,8 @@ class FdfParser:
                 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
@@ -3034,10 +3024,10 @@ class FdfParser:
             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
-                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
@@ -3046,9 +3036,9 @@ class FdfParser:
                     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
-                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
@@ -3066,7 +3056,7 @@ class FdfParser:
         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
@@ -3101,7 +3091,7 @@ class FdfParser:
         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
@@ -3110,20 +3100,20 @@ class FdfParser:
             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
-                    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
-                    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
-                    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
@@ -3138,9 +3128,9 @@ class FdfParser:
                     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
-                            FmpData.MonotonicCount = (long)(FmpData.MonotonicCount)\r
+                            FmpData.MonotonicCount = int(FmpData.MonotonicCount)\r
             if not self._GetNextToken():\r
                 break\r
         else:\r
@@ -3151,14 +3141,14 @@ class FdfParser:
 \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
-            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
@@ -3185,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
-            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
-            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
-            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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -3237,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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                    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
-                        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
-                        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
-                    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
-                    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
-                    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
@@ -3317,10 +3307,10 @@ class FdfParser:
             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
-            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
@@ -3350,10 +3340,10 @@ class FdfParser:
             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
-            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
@@ -3379,10 +3369,10 @@ class FdfParser:
                 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
-            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
@@ -3398,10 +3388,10 @@ class FdfParser:
             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
-            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
@@ -3450,10 +3440,10 @@ class FdfParser:
             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
-            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
@@ -3498,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
-            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
-            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
@@ -3512,11 +3502,11 @@ class FdfParser:
         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
-            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
@@ -3547,7 +3537,7 @@ class FdfParser:
     #\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
@@ -3576,7 +3566,7 @@ class FdfParser:
     #\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
@@ -3587,7 +3577,7 @@ class FdfParser:
                 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
@@ -3598,10 +3588,10 @@ class FdfParser:
     #\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
-            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
@@ -3611,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("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
-                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
-                    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
-                    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
@@ -3643,7 +3638,7 @@ class FdfParser:
                 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
@@ -3687,15 +3682,15 @@ class FdfParser:
                 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
-                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
@@ -3726,7 +3721,7 @@ class FdfParser:
             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
@@ -3754,8 +3749,19 @@ class FdfParser:
     #\r
     def _GetEfiSection(self, Obj):\r
         OldPos = self.GetFileBufferPos()\r
+        EfiSectionObj = EfiSection()\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
@@ -3787,14 +3793,14 @@ class FdfParser:
                     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
-                    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
@@ -3806,7 +3812,7 @@ class FdfParser:
                     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
@@ -3816,26 +3822,25 @@ class FdfParser:
                     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
-        EfiSectionObj = EfiSection()\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
-                raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -3845,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("expected '='", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -3864,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("expected '='", self.FileName, self.CurrentLineNumber)\r
+                    raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
@@ -3892,7 +3897,7 @@ class FdfParser:
             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
@@ -3905,10 +3910,10 @@ class FdfParser:
 \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
-                            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
@@ -3916,7 +3921,7 @@ class FdfParser:
             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
@@ -3975,36 +3980,37 @@ class FdfParser:
     #   @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
-                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
-                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
-                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
-                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
-                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
-                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
-                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
-                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
-                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
-                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
@@ -4022,7 +4028,7 @@ class FdfParser:
                 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
@@ -4034,8 +4040,8 @@ class FdfParser:
                 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
@@ -4051,7 +4057,7 @@ class FdfParser:
             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
@@ -4066,219 +4072,14 @@ class FdfParser:
                 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
-    ## _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
@@ -4304,7 +4105,7 @@ class FdfParser:
         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
@@ -4334,7 +4135,7 @@ class FdfParser:
         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
@@ -4342,8 +4143,12 @@ class FdfParser:
             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
@@ -4373,46 +4178,48 @@ class FdfParser:
             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
-                        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
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                        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
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                        raise Warning("expected '='", self.FileName, self.CurrentLineNumber)\r
+                        raise Warning.ExpectedEquals(self.FileName, self.CurrentLineNumber)\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
-                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
@@ -4435,11 +4242,11 @@ class FdfParser:
         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
-            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