1. Sync pcd definition and parsing with the latest spec
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 29 Aug 2007 09:33:33 +0000 (09:33 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Wed, 29 Aug 2007 09:33:33 +0000 (09:33 +0000)
2. standardize error message output when parsing, add line no and section name information
3. fix a bug in parsing DEFINE/SPEC of section define of INF file
4. Sync source definition and parsing of INF with the latest spec

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@637 7335b38e-4728-0410-8992-fb3ffe349368

Source/Python/Common/DataType.py
Source/Python/Common/DecClassObject.py
Source/Python/Common/DscClassObject.py
Source/Python/Common/InfClassObject.py
Source/Python/Common/String.py
Source/Python/CommonDataClass/PlatformClass.py

index 613efe5..08b3cd3 100644 (file)
@@ -288,6 +288,9 @@ TAB_DSC_DEFINES_SKUID_IDENTIFIER = 'SKUID_IDENTIFIER'
 TAB_DSC_DEFINES_FLASH_DEFINITION = 'FLASH_DEFINITION'\r
 TAB_DSC_DEFINES_BUILD_NUMBER = 'BUILD_NUMBER'\r
 TAB_DSC_DEFINES_MAKEFILE_NAME = 'MAKEFILE_NAME'\r
+TAB_DSC_DEFINES_BS_BASE_ADDRESS = 'BsBaseAddress'\r
+TAB_DSC_DEFINES_RT_BASE_ADDRESS = 'RtBaseAddress'\r
+TAB_DSC_DEFINES_DEFINE = 'DEFINE'\r
 \r
 #TargetTxt Definitions\r
 TAB_TAT_DEFINES_ACTIVE_PLATFORM = 'ACTIVE_PLATFORM'\r
index ff0a4a1..32defa5 100644 (file)
@@ -128,8 +128,12 @@ class Dec(DecObject):
         self.Package.Header.FileName = self.Identification.FileName\r
         self.Package.Header.FullPath = self.Identification.FileFullPath\r
         self.Package.Header.DecSpecification = self.Defines.DefinesDictionary[TAB_DEC_DEFINES_DEC_SPECIFICATION][0]\r
+        File = self.Package.Header.FullPath\r
         \r
-        #Includes\r
+        #\r
+        # Includes\r
+        # <IncludeDirectory>\r
+        #\r
         Includes = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Includes:\r
@@ -140,14 +144,16 @@ class Dec(DecObject):
             Include.SupArchList = Includes[Key]\r
             self.Package.Includes.append(Include)\r
             \r
-        #Guids\r
+        #\r
+        # Guids\r
+        # <CName>=<GuidValue>\r
+        #\r
         Guids = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Guids:\r
                 List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Guids in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'Guids', File, '<CName>=<GuidValue>')\r
                 else:\r
                     MergeArches(Guids, (List[0], List[1]), Arch)\r
         for Key in Guids.keys():\r
@@ -157,14 +163,16 @@ class Dec(DecObject):
             Guid.SupArchList = Guids[Key]\r
             self.Package.GuidDeclarations.append(Guid)\r
 \r
-        #Protocols\r
+        # \r
+        # Protocols\r
+        # <CName>=<GuidValue>\r
+        #\r
         Protocols = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Protocols:\r
                 List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Protocols in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'Protocols', File, '<CName>=<GuidValue>')\r
                 else:\r
                     MergeArches(Protocols, (List[0], List[1]), Arch)\r
         for Key in Protocols.keys():\r
@@ -174,14 +182,16 @@ class Dec(DecObject):
             Protocol.SupArchList = Protocols[Key]\r
             self.Package.ProtocolDeclarations.append(Protocol)\r
         \r
-        #Ppis\r
+        #\r
+        # Ppis\r
+        # <CName>=<GuidValue>\r
+        #\r
         Ppis = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Ppis:\r
                 List = GetSplitValueList(Item, DataType.TAB_EQUAL_SPLIT)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Ppis in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'Ppis', File, '<CName>=<GuidValue>')\r
                 else:\r
                     MergeArches(Ppis, (List[0], List[1]), Arch)\r
         for Key in Ppis.keys():\r
@@ -191,16 +201,18 @@ class Dec(DecObject):
             Ppi.SupArchList = Ppis[Key]\r
             self.Package.PpiDeclarations.append(Ppi)\r
             \r
-        #LibraryClasses\r
+        #\r
+        # LibraryClasses\r
+        # <LibraryClassName>|<LibraryClassInstance>\r
+        #\r
         LibraryClasses = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].LibraryClasses:\r
                 List = GetSplitValueList(Item[0], DataType.TAB_VALUE_SPLIT)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<CName>=<GuidValue>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'LibraryClasses', File, '<LibraryClassName>|<LibraryClassInstanceFilename>')\r
                 else:\r
-                    CheckFileExist(self.WorkspaceDir, os.path.join(self.Identification.FileRelativePath, List[1]), self.Package.Header.FullPath, 'LibraryClasses', Item[0])\r
+                    CheckFileExist(self.WorkspaceDir, os.path.join(self.Identification.FileRelativePath, List[1]), File, 'LibraryClasses', Item[0])\r
                     if Item[1] == ['']:\r
                             Item[1] = DataType.SUP_MODULE_LIST\r
                     MergeArches(LibraryClasses, (List[0], List[1]) + tuple(Item[1]), Arch)\r
@@ -212,63 +224,27 @@ class Dec(DecObject):
             LibraryClass.SupArchList = LibraryClasses[Key]\r
             self.Package.LibraryClassDeclarations.append(LibraryClass)\r
         \r
-        #Pcds\r
+        #\r
+        # Pcds\r
+        # <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
+        #\r
         Pcds = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].PcdsFixedAtBuild:\r
-                List = GetSplitValueList(Item)\r
-                if len(List) != 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsFixedAtBuild in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsFixedAtBuild in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], TAB_PCDS_FIXED_AT_BUILD), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfDec(Item, TAB_PCDS_FIXED_AT_BUILD, File), Arch)\r
             \r
             for Item in self.Contents[Arch].PcdsPatchableInModule:\r
-                List = GetSplitValueList(Item)\r
-                if len(List) != 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsPatchableInModule in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsPatchableInModule in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], TAB_PCDS_PATCHABLE_IN_MODULE), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfDec(Item, TAB_PCDS_PATCHABLE_IN_MODULE, File), Arch)\r
             \r
             for Item in self.Contents[Arch].PcdsFeatureFlag:\r
-                List = GetSplitValueList(Item)\r
-                if len(List) != 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsFeatureFlag in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsFeatureFlag in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], TAB_PCDS_FEATURE_FLAG), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfDec(Item, TAB_PCDS_FEATURE_FLAG, File), Arch)\r
             \r
             for Item in self.Contents[Arch].PcdsDynamicEx:\r
-                List = GetSplitValueList(Item)\r
-                if len(List) != 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsDynamicEx in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsDynamicEx in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], TAB_PCDS_DYNAMIC_EX), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfDec(Item, TAB_PCDS_DYNAMIC_EX, File), Arch)\r
             \r
             for Item in self.Contents[Arch].PcdsDynamic:\r
-                List = GetSplitValueList(Item)\r
-                if len(List) != 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsDynamic in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item, self.Package.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdsDynamic in file '%s', correct format is '<TokenSpcCName>.<TokenCName>|<Token>|<Value>|<DatumType>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], TAB_PCDS_DYNAMIC), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfDec(Item, TAB_PCDS_DYNAMIC, File), Arch)\r
+\r
         for Key in Pcds.keys():\r
             Pcd = PcdClass()\r
             Pcd.CName = Key[1]\r
@@ -280,6 +256,24 @@ class Dec(DecObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Package.PcdDeclarations.append(Pcd)\r
     \r
+    #\r
+    # Get Pcd of Dec as <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
+    # Return (TokenSpcCName, TokenCName, Value, DatumType, Token, ItemType)\r
+    #\r
+    def GetPcdOfDec(self, Item, Type, File):\r
+        Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
+        List = GetSplitValueList(Item)\r
+        if len(List) != 4:\r
+            RaiseParserError(Item, 'Pcds' + Type, File, Format)\r
+        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+        if len(TokenInfo) != 2:\r
+            RaiseParserError(Item, 'Pcds' + Type, File, Format)\r
+        \r
+        return (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], Type)\r
+    \r
+    #\r
+    # Show detailed information of Dec\r
+    #\r
     def ShowDec(self):\r
         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
         printDict(self.Defines.DefinesDictionary)\r
@@ -291,6 +285,9 @@ class Dec(DecObject):
                                     "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
                 eval(Command)\r
     \r
+    #\r
+    # Show detailed information of Package\r
+    #\r
     def ShowPackage(self):\r
         m = self.Package\r
         print 'Filename =', m.Header.FileName\r
index 1f5a5b8..f75e523 100644 (file)
@@ -38,7 +38,10 @@ class DscDefines(DscObject):
             TAB_DSC_DEFINES_SKUID_IDENTIFIER                      : [''],\r
             TAB_DSC_DEFINES_FLASH_DEFINITION                      : [''],\r
             TAB_DSC_DEFINES_BUILD_NUMBER                          : [''],\r
-            TAB_DSC_DEFINES_MAKEFILE_NAME                         : ['']                        \r
+            TAB_DSC_DEFINES_MAKEFILE_NAME                         : [''],\r
+            TAB_DSC_DEFINES_BS_BASE_ADDRESS                       : [''],\r
+            TAB_DSC_DEFINES_RT_BASE_ADDRESS                       : [''],\r
+            TAB_DSC_DEFINES_DEFINE                                : ['']\r
         }\r
 \r
 class DscSkuId(DscObject):\r
@@ -149,6 +152,7 @@ class Dsc(DscObject):
         self.Platform.Header.FileName = self.Identification.FileName\r
         self.Platform.Header.FullPath = self.Identification.FileFullPath\r
         self.Platform.Header.DscSpecification = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_DSC_SPECIFICATION][0]\r
+        File = self.Platform.Header.FullPath\r
         \r
         self.Platform.Header.SkuIdName = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_SKUID_IDENTIFIER]\r
         self.Platform.Header.SupArchList = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_SUPPORTED_ARCHITECTURES]\r
@@ -157,11 +161,28 @@ class Dsc(DscObject):
         self.Platform.Header.BuildNumber = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_BUILD_NUMBER][0]\r
         self.Platform.Header.MakefileName = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_MAKEFILE_NAME][0]\r
         \r
+        self.Platform.Header.BsBaseAddress = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_BS_BASE_ADDRESS][0]\r
+        self.Platform.Header.RtBaseAddress = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_RT_BASE_ADDRESS][0]\r
+        \r
+        #\r
+        # Define of Defines\r
+        #\r
+        if self.Defines.DefinesDictionary[TAB_DSC_DEFINES_DEFINE][0] != '':\r
+            for Item in self.Defines.DefinesDictionary[TAB_DSC_DEFINES_DEFINE]:\r
+                List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
+                if len(List) != 2:\r
+                    RaiseParserError(Item, 'DEFINE of Defines', File, 'DEFINE <MACRO> = <PATH>')\r
+                else:\r
+                    self.Platform.Header.Define[CleanString(List[0])] = CleanString(List[1])\r
+        \r
         Fdf = PlatformFlashDefinitionFileClass()\r
         Fdf.FilePath = self.Defines.DefinesDictionary[TAB_DSC_DEFINES_FLASH_DEFINITION][0]\r
         self.Platform.FlashDefinitionFile = Fdf\r
         \r
-        #BuildOptions\r
+        #\r
+        # BuildOptions\r
+        # [<Family>:]<ToolFlag>=Flag\r
+        #\r
         BuildOptions = {}\r
         IncludeFiles = {}\r
         for Arch in DataType.ARCH_LIST:\r
@@ -170,9 +191,9 @@ class Dsc(DscObject):
                     IncludeFile = CleanString(Item[Item.upper().find(DataType.TAB_INCLUDE.upper() + ' ') + len(DataType.TAB_INCLUDE + ' ') : ])\r
                     CheckFileExist(self.WorkspaceDir, IncludeFile, self.Platform.Header.FullPath, 'BuildOptions', Item)\r
                     for NewItem in open(WorkspaceFile(self.WorkspaceDir, IncludeFile), 'r').readlines():\r
-                        MergeArches(BuildOptions, GetBuildOption(NewItem), Arch)\r
+                        MergeArches(BuildOptions, GetBuildOption(NewItem, File), Arch)\r
                     continue\r
-                MergeArches(BuildOptions, GetBuildOption(Item), Arch)\r
+                MergeArches(BuildOptions, GetBuildOption(Item, File), Arch)\r
         \r
         self.Platform.BuildOptions.IncludeFiles = IncludeFiles\r
         for Key in BuildOptions.keys():\r
@@ -180,7 +201,10 @@ class Dsc(DscObject):
             BuildOption.SupArchList = BuildOptions[Key]\r
             self.Platform.BuildOptions.BuildOptionList.append(BuildOption)\r
         \r
-        #SkuIds\r
+        #\r
+        # SkuIds\r
+        # <Integer>|<UiName>\r
+        #\r
         IncludeFiles = {}\r
         self.Platform.SkuInfos.SkuInfoList['DEFAULT'] = '0'\r
         for Arch in DataType.ARCH_LIST:\r
@@ -191,20 +215,21 @@ class Dsc(DscObject):
                     for NewItem in open(WorkspaceFile(self.WorkspaceDir, IncludeFile), 'r').readlines():\r
                         List = GetSplitValueList(NewItem)\r
                         if len(List) != 2:\r
-                            ErrorMsg = "Wrong statement '%s' found in section SkuIds in file '%s', correct format is '<Integer>|<UiName>'" % (Item, self.Platform.Header.FullPath)\r
-                            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                            RaiseParserError(NewItem, 'SkuIds', WorkspaceFile(self.WorkspaceDir, IncludeFile), '<Integer>|<UiName>')\r
                         else:\r
                             self.Platform.SkuInfos.SkuInfoList[List[1]] = List[0]\r
                     continue\r
                 List = GetSplitValueList(Item)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section SkuIds in file '%s', correct format is '<Integer>|<UiName>'" % (Item, self.Platform.Header.FullPath)\r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'SkuIds', File, '<Integer>|<UiName>')\r
                 else:\r
                     self.Platform.SkuInfos.SkuInfoList[List[1]] = List[0]\r
         self.Platform.SkuInfos.IncludeFiles = IncludeFiles\r
         \r
-        #Libraries\r
+        #\r
+        # Libraries\r
+        # <PathAndFilename>\r
+        #\r
         Libraries = {}\r
         IncludeFiles = {}\r
         Defines = {}\r
@@ -220,8 +245,7 @@ class Dsc(DscObject):
                 if Status == 0:       # Find DEFINE statement\r
                     pass\r
                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section Libraries in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'Libraries', File, 'DEFINE <VarName> = <PATH>')\r
                 elif Status == 1:     # Not find DEFINE statement\r
                     MergeArches(Libraries, Item, Arch)\r
         self.Platform.Libraries.IncludeFiles = IncludeFiles\r
@@ -232,7 +256,10 @@ class Dsc(DscObject):
             Library.SupArchList = Libraries[Key]\r
             self.Platform.Libraries.LibraryList.append(Library)\r
         \r
-        #LibraryClasses\r
+        #\r
+        # LibraryClasses\r
+        # <LibraryClassKeyWord>|<LibraryInstance>\r
+        #\r
         LibraryClasses = {}\r
         IncludeFiles = {}\r
         Defines = {}\r
@@ -249,8 +276,7 @@ class Dsc(DscObject):
                 if Status == 0:       # Find DEFINE statement\r
                     pass\r
                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'LibraryClasses', File, 'DEFINE <VarName> = <PATH>')\r
                 elif Status == 1:     # Not find DEFINE statement\r
                     MergeArches(LibraryClasses, self.GenLibraryClass(Item, self.Platform.Header.FullPath), Arch)\r
         self.Platform.LibraryClasses.IncludeFiles = IncludeFiles\r
@@ -264,15 +290,15 @@ class Dsc(DscObject):
             self.Platform.LibraryClasses.LibraryList.append(Library)\r
         \r
         #Pcds\r
-        self.GenPcds(DataType.TAB_PCDS_FIXED_AT_BUILD)\r
-        self.GenPcds(DataType.TAB_PCDS_PATCHABLE_IN_MODULE)\r
-        self.GenFeatureFlagPcds(DataType.TAB_PCDS_FEATURE_FLAG)\r
-        self.GenDynamicDefaultPcds(DataType.TAB_PCDS_DYNAMIC_DEFAULT)\r
-        self.GenDynamicDefaultPcds(DataType.TAB_PCDS_DYNAMIC_EX_DEFAULT)\r
-        self.GenDynamicHiiPcds(DataType.TAB_PCDS_DYNAMIC_HII)\r
-        self.GenDynamicHiiPcds(DataType.TAB_PCDS_DYNAMIC_EX_HII)\r
-        self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_VPD)\r
-        self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_EX_VPD)\r
+        self.GenPcds(DataType.TAB_PCDS_FIXED_AT_BUILD, File)\r
+        self.GenPcds(DataType.TAB_PCDS_PATCHABLE_IN_MODULE, File)\r
+        self.GenFeatureFlagPcds(DataType.TAB_PCDS_FEATURE_FLAG, File)\r
+        self.GenDynamicDefaultPcds(DataType.TAB_PCDS_DYNAMIC_DEFAULT, File)\r
+        self.GenDynamicDefaultPcds(DataType.TAB_PCDS_DYNAMIC_EX_DEFAULT, File)\r
+        self.GenDynamicHiiPcds(DataType.TAB_PCDS_DYNAMIC_HII, File)\r
+        self.GenDynamicHiiPcds(DataType.TAB_PCDS_DYNAMIC_EX_HII, File)\r
+        self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_VPD, File)\r
+        self.GenDynamicVpdPcds(DataType.TAB_PCDS_DYNAMIC_EX_VPD, File)\r
         \r
         #Components\r
         Components = {}\r
@@ -293,8 +319,7 @@ class Dsc(DscObject):
                 if Status == 0:       # Find DEFINE statement\r
                     pass\r
                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'Components', File, 'DEFINE <VarName> = <PATH>')\r
                 elif Status == 1:     # Not find DEFINE statement\r
                     MergeArches(Components, self.GenComponent(Item, self.Platform.Header.FullPath), Arch)\r
         self.Platform.Modules.IncludeFiles = IncludeFiles\r
@@ -311,8 +336,7 @@ class Dsc(DscObject):
     def GenLibraryClass(self, Item, ContainerFile):\r
         List = GetSplitValueList(Item[0])\r
         if len(List) != 2:\r
-            ErrorMsg = "Wrong statement '%s' found in section LibraryClasses in file '%s', correct format is '<LibraryClassKeyWord>|<LibraryInstance>'" % (Item, ContainerFile) \r
-            raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+            RaiseParserError(Item[0], 'LibraryClasses', ContainerFile, '<LibraryClassKeyWord>|<LibraryInstance>')\r
         else:\r
             CheckFileType(List[1], '.Inf', ContainerFile, 'library class instance', Item[0])\r
             CheckFileExist(self.WorkspaceDir, List[1], ContainerFile, 'LibraryClasses', Item[0])\r
@@ -336,13 +360,12 @@ class Dsc(DscObject):
         for Lib in LibraryClasses:\r
             List = GetSplitValueList(Lib)\r
             if len(List) != 2:\r
-                ErrorMsg = "Wrong LibraryClass statement '%s' found in section Components in file '%s', correct format is '<ClassName>|<InfFilename>'" % (Lib, ContainerFile) \r
-                raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                RaiseParserError(Lib, 'LibraryClasses', ContainerFile, '<ClassName>|<InfFilename>')\r
             CheckFileType(List[1], '.Inf', ContainerFile, 'library instance of component ', Lib)\r
             CheckFileExist(self.WorkspaceDir, List[1], ContainerFile, 'library instance of component', Lib)\r
             Component.LibraryClasses.LibraryList.append(PlatformLibraryClass(List[0], List[1]))\r
         for BuildOption in BuildOptions:\r
-            Key = GetBuildOption(BuildOption)\r
+            Key = GetBuildOption(BuildOption, ContainerFile)\r
             Component.ModuleSaBuildOption.BuildOptionList.append(BuildOptionClass(Key[0], Key[1], Key[2]))\r
         for Pcd in Pcds:\r
             Type = Pcd[0]\r
@@ -353,50 +376,41 @@ class Dsc(DscObject):
             #\r
             if Type == DataType.TAB_PCDS_FEATURE_FLAG:\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE'" % (Type, Pcd[1], ContainerFile) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Pcd[1], 'Components', ContainerFile, '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE')\r
                 \r
+                CheckPcdTokenInfo(List[0], 'Components', ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|TRUE/FALSE'" % (Type, Pcd[1], ContainerFile) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', List[1], Type, [], {}, []))\r
+                Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', List[1], Type, [], {}, []))\r
             #\r
             # For FixedAtBuild or PatchableInModule\r
             #\r
             if Type == DataType.TAB_PCDS_FIXED_AT_BUILD or Type == DataType.TAB_PCDS_PATCHABLE_IN_MODULE:\r
                 List.append('')\r
-                if len(List) < 3:\r
-                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], ContainerFile) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                \r
+                if len(List) != 3 and len(List) != 4:\r
+                    RaiseParserError(Pcd[1], 'Components', ContainerFile, '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]')\r
+\r
+                CheckPcdTokenInfo(List[0], 'Components', ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>|<Value>[|<MaxDatumSize>]'" % (Type, Pcd[1], ContainerFile) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', List[2], List[1], Type, [], {}, []))\r
+                Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', List[2], List[1], Type, [], {}, []))\r
             \r
             #\r
             # For Dynamic or DynamicEx\r
             #\r
             if Type == DataType.TAB_PCDS_DYNAMIC or Type == DataType.TAB_PCDS_DYNAMIC_EX:\r
                 if len(List) != 1:\r
-                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>'" % (Type, Pcd[1], ContainerFile) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Pcd[1], 'Components', ContainerFile, '<PcdTokenSpaceGuidCName>.<PcdTokenName>')\r
                 \r
+                CheckPcdTokenInfo(List[0], 'Components', ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong Pcds%s statement '%s' found in section Components in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<PcdTokenName>'" % (Type, Pcd[1], ContainerFile) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', '', Type, [], {}, []))                        \r
+                Component.PcdBuildDefinitions.append(PcdClass(TokenInfo[1], '', TokenInfo[0], '', '', '', Type, [], {}, []))                        \r
         \r
         return Component\r
     #End of GenComponent\r
     \r
-    def GenFeatureFlagPcds(self, Type = ''):\r
+    #\r
+    # Gen FeatureFlagPcds\r
+    #\r
+    def GenFeatureFlagPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
         Items = []\r
         for Arch in DataType.ARCH_LIST:\r
@@ -408,21 +422,20 @@ class Dsc(DscObject):
             for Item in Items:\r
                 List = GetSplitValueList(Item)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcds%s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE'" % (Item, Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE')\r
                 \r
+                CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcds%s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|TRUE/FALSE'" % (Item, Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                \r
                 MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], Type), Arch)\r
         for Key in Pcds:\r
             Pcd = PcdClass(Key[0], '', Key[1], '', '', Key[2], Key[3], [], {}, [])\r
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
     \r
-    def GenPcds(self, Type = ''):\r
+    #\r
+    # Gen Pcds\r
+    #\r
+    def GenPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
         Items = []\r
         for Arch in DataType.ARCH_LIST:\r
@@ -436,20 +449,19 @@ class Dsc(DscObject):
             for Item in Items:\r
                 List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT * 2)\r
                 if len(List) < 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcds%s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<Type>|<MaximumDatumSize>]'" % (Item, Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                \r
+                    RaiseParserError(Item, 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<Type>|<MaximumDatumSize>]')\r
+                    \r
+                CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcds%s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>[|<Type>|<MaximumDatumSize>]'" % (Item, Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], Type), Arch)\r
+                MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], Type), Arch)\r
         for Key in Pcds:\r
             Pcd = PcdClass(Key[0], '', Key[1], Key[3], Key[4], Key[2], Key[5], [], {}, [])\r
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
     \r
+    #\r
+    # Gen SkuInfoList\r
+    #\r
     def GenSkuInfoList(self, SkuNameList, SkuInfo, VariableName = '', VariableGuid = '', VariableOffset = '', HiiDefaultValue = '', VpdOffset = '', DefaultValue = ''):\r
         if SkuNameList == None or SkuNameList == [] or SkuNameList == ['']:\r
             SkuNameList = ['DEFAULT']\r
@@ -462,7 +474,10 @@ class Dsc(DscObject):
         \r
         return True, SkuInfoList\r
             \r
-    def GenDynamicDefaultPcds(self, Type = ''):\r
+    #\r
+    # Gen DynamicDefaultPcds\r
+    #\r
+    def GenDynamicDefaultPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
         Items = []\r
         SkuInfoList = {}\r
@@ -477,15 +492,11 @@ class Dsc(DscObject):
             for Item in Items:\r
                 List = GetSplitValueList(Item[0] + DataType.TAB_VALUE_SPLIT)\r
                 if len(List) < 3:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcds%s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>')\r
                 \r
+                CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcds%s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<Value>'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], Type), Arch)\r
+                MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], Type), Arch)\r
         for Key in Pcds:\r
             (Status, SkuInfoList) = self.GenSkuInfoList(Item[1], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', '', Key[2])\r
             if Status == False:\r
@@ -495,7 +506,10 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
          \r
-    def GenDynamicHiiPcds(self, Type = ''):\r
+    #\r
+    # Gen DynamicHiiPcds\r
+    #\r
+    def GenDynamicHiiPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
         Items = []\r
         SkuInfoList = {}\r
@@ -510,15 +524,11 @@ class Dsc(DscObject):
             for Item in Items:\r
                 List = GetSplitValueList(Item[0] + DataType.TAB_VALUE_SPLIT * 2)\r
                 if len(List) < 6:\r
-                    ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<String>|<VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<String>|<VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]')\r
                 \r
+                CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<String>|<VariableGuidCName>|<VariableOffset>[|<DefaultValue>[|<MaximumDatumSize>]]'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], List[4], List[5], Type), Arch)\r
+                MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], List[3], List[4], List[5], Type), Arch)\r
         for Key in Pcds:\r
             (Status, SkuInfoList) = self.GenSkuInfoList(Item[1], self.Platform.SkuInfos.SkuInfoList, Key[2], Key[3], Key[4], Key[5], '', '')\r
             if Status == False:\r
@@ -528,7 +538,10 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
     \r
-    def GenDynamicVpdPcds(self, Type = ''):\r
+    #\r
+    # Gen DynamicVpdPcds\r
+    #\r
+    def GenDynamicVpdPcds(self, Type = '', ContainerFile = ''):\r
         Pcds = {}\r
         Items = []\r
         SkuInfoList = {}\r
@@ -543,15 +556,11 @@ class Dsc(DscObject):
             for Item in Items:\r
                 List = GetSplitValueList(Item[0] + DataType.TAB_VALUE_SPLIT)\r
                 if len(List) < 3:\r
-                    ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>[|<MaximumDatumSize>]'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'Pcds' + Type, ContainerFile, '<PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>[|<MaximumDatumSize>]')\r
                 \r
+                CheckPcdTokenInfo(List[0], 'Pcds' + Type, ContainerFile)\r
                 TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section %s in file '%s', correct format is '<PcdTokenSpaceGuidCName>.<TokenCName>|<VpdOffset>[|<MaximumDatumSize>]'" % (Item[0], Type, self.Platform.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                else:\r
-                    MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], Type), Arch)\r
+                MergeArches(Pcds, (TokenInfo[1], TokenInfo[0], List[1], List[2], Type), Arch)\r
         for Key in Pcds:\r
             (Status, SkuInfoList) = self.GenSkuInfoList(Item[1], self.Platform.SkuInfos.SkuInfoList, '', '', '', '', Key[2], '')\r
             if Status == False:\r
@@ -561,6 +570,9 @@ class Dsc(DscObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Platform.DynamicPcdBuildDefinitions.append(Pcd)\r
     \r
+    #\r
+    # Show detailed information of Dsc\r
+    #\r
     def ShowDsc(self):\r
         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
         printDict(self.Defines.DefinesDictionary)\r
@@ -571,7 +583,10 @@ class Dsc(DscObject):
                                     key + DataType.TAB_SPLIT + arch + \\r
                                     "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
                 eval(Command)\r
-       \r
+    \r
+    #\r
+    # Show detailed information of Platform\r
+    #\r
     def ShowPlatform(self):\r
         m = self.Platform\r
         print 'Filename =', m.Header.FileName\r
@@ -587,6 +602,9 @@ class Dsc(DscObject):
         print 'BuildNumber =', m.Header.BuildNumber\r
         print 'MakefileName =', m.Header.MakefileName\r
         print 'Fdf =', m.FlashDefinitionFile.FilePath\r
+        print 'BsBaseAddress =', m.Header.BsBaseAddress\r
+        print 'RtBaseAddress =', m.Header.RtBaseAddress\r
+        print 'Define =', m.Header.Define\r
         print '\nBuildOptions =', m.BuildOptions, m.BuildOptions.IncludeFiles\r
         for Item in m.BuildOptions.BuildOptionList:\r
             print '\t', Item.ToolChainFamily, Item.ToolChain, Item.Option, Item.SupArchList\r
index e4a27bf..6e6478c 100644 (file)
@@ -127,6 +127,7 @@ class Inf(InfObject):
         self.Module.Header.Version = self.Defines.DefinesDictionary[TAB_INF_DEFINES_VERSION_NUMBER][0]\r
         self.Module.Header.FileName = self.Identification.FileName\r
         self.Module.Header.FullPath = self.Identification.FileFullPath\r
+        File = self.Module.Header.FullPath\r
         \r
         self.Module.Header.EfiSpecificationVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_EFI_SPECIFICATION_VERSION][0]\r
         self.Module.Header.EdkReleaseVersion = self.Defines.DefinesDictionary[TAB_INF_DEFINES_EDK_RELEASE_VERSION][0]\r
@@ -144,7 +145,9 @@ class Inf(InfObject):
         self.Module.Header.PcdIsDriver = self.Defines.DefinesDictionary[TAB_INF_DEFINES_PCD_IS_DRIVER][0]\r
         self.Module.Header.TianoR8FlashMap_h = self.Defines.DefinesDictionary[TAB_INF_DEFINES_TIANO_R8_FLASHMAP_H][0]\r
         \r
-        #LibraryClass of Define\r
+        #\r
+        # LibraryClass of Defines\r
+        #\r
         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_LIBRARY_CLASS][0] != '':\r
             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_LIBRARY_CLASS]:\r
                 List = GetSplitValueList(Item, DataType.TAB_VALUE_SPLIT, 1)\r
@@ -156,17 +159,20 @@ class Inf(InfObject):
                     Lib.SupModuleList = GetSplitValueList(CleanString(List[1]), ' ')\r
                 self.Module.Header.LibraryClass.append(Lib)\r
         \r
-        #Custom makefile\r
+        #\r
+        # Custom makefile of Defines\r
+        #\r
         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CUSTOM_MAKEFILE][0] != '':\r
             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_CUSTOM_MAKEFILE]:\r
                 List = Item.split(DataType.TAB_VALUE_SPLIT)\r
                 if len(List) == 2:\r
                     self.Module.Header.CustomMakefile[CleanString(List[0])] = CleanString(List[1])\r
                 else:\r
-                    ErrorMsg = "Wrong CUSTOM_MAKEFILE statement '%s' found in section Defines in file '%s', correct format is 'CUSTOM_MAKEFILE = Family|Filename'" % (Item, self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'CUSTOM_MAKEFILE of Defines', File, 'CUSTOM_MAKEFILE=<Family>|<Filename>')\r
         \r
-        #EntryPoint and UnloadImage\r
+        #\r
+        # EntryPoint and UnloadImage of Defines\r
+        #\r
         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT][0] != '':\r
             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_ENTRY_POINT]:\r
                 Image = ModuleExternImageClass()\r
@@ -178,7 +184,9 @@ class Inf(InfObject):
                 Image.ModuleUnloadImage = CleanString(Item)\r
                 self.Module.ExternImages.append(Image)\r
         \r
-        #Constructor and Destructor\r
+        #\r
+        # Constructor and Destructor of Defines\r
+        #\r
         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR][0] != '':\r
             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_CONSTRUCTOR]:\r
                 LibraryClass = ModuleExternLibraryClass()\r
@@ -190,37 +198,44 @@ class Inf(InfObject):
                 LibraryClass.Destructor = CleanString(Item)\r
                 self.Module.ExternLibraries.append(LibraryClass)\r
         \r
-        #Define\r
+        #\r
+        # Define of Defines\r
+        #\r
         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_DEFINE][0] != '':\r
             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_DEFINE]:\r
                 List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section Defines in file '%s', correct format is 'DEFINE <Word> = <Word>'" % (Item, self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'DEFINE of Defines', File, 'DEFINE <Word> = <Word>')\r
                 else:\r
                     self.Module.Header.Define[CleanString(List[0])] = CleanString(List[1])\r
         \r
-        #Spec\r
+        #\r
+        # Spec\r
+        #\r
         if self.Defines.DefinesDictionary[TAB_INF_DEFINES_SPEC][0] != '':\r
             for Item in self.Defines.DefinesDictionary[TAB_INF_DEFINES_SPEC]:\r
                 List = Item.split(DataType.TAB_EQUAL_SPLIT)\r
                 if len(List) != 2:\r
-                    ErrorMsg = "Wrong SPEC statement '%s' found in section Defines in file '%s', correct format is 'SPEC <Word> = <Version>'" % (Item, self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'SPEC of Defines', File, 'SPEC <Word> = <Version>')\r
                 else:\r
                     self.Module.Header.Specification[CleanString(List[0])] = CleanString(List[1])\r
                 \r
-        #BuildOptions\r
+        #\r
+        # BuildOptions\r
+        # [<Family>:]<ToolFlag>=Flag\r
+        #\r
         BuildOptions = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].BuildOptions:\r
-                MergeArches(BuildOptions, GetBuildOption(Item), Arch)\r
+                MergeArches(BuildOptions, GetBuildOption(Item, File), Arch)\r
         for Key in BuildOptions.keys():\r
             BuildOption = BuildOptionClass(Key[0], Key[1], Key[2])\r
             BuildOption.SupArchList = BuildOptions[Key]\r
             self.Module.BuildOptions.append(BuildOption)    \r
         \r
-        #Includes\r
+        #\r
+        # Includes\r
+        #\r
         Includes = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Includes:\r
@@ -231,7 +246,9 @@ class Inf(InfObject):
             Include.SupArchList = Includes[Key]\r
             self.Module.Includes.append(Include)\r
         \r
-        #Libraries\r
+        #\r
+        # Libraries\r
+        #\r
         Libraries = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Libraries:\r
@@ -242,7 +259,10 @@ class Inf(InfObject):
             Library.SupArchList = Libraries[Key]\r
             self.Module.Libraries.append(Library)\r
         \r
-        #LibraryClasses\r
+        #\r
+        # LibraryClasses\r
+        # LibraryClass[|<LibraryClassInstanceFilename>[|<TokenSpaceGuidCName>.<PcdCName>]]\r
+        #\r
         LibraryClasses = {}\r
         Defines = {}\r
         for Arch in DataType.ARCH_LIST:\r
@@ -251,13 +271,13 @@ class Inf(InfObject):
                 if Status == 0:       # Find DEFINE statement\r
                     pass\r
                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section LibraryClasses in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item[0], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'LibraryClasses', File, 'DEFINE <VarName> = <PATH>')\r
                 elif Status == 1:     # Not find DEFINE statement\r
                     #{ (LibraryClass, Instance, PcdFeatureFlag, ModuleType1|ModuleType2|ModuleType3) : [Arch1, Arch2, ...] }\r
                     ItemList = GetSplitValueList((Item[0] + DataType.TAB_VALUE_SPLIT * 2))\r
                     CheckFileType(ItemList[1], '.Inf', self.Module.Header.FullPath, 'LibraryClasses', Item[0])\r
                     CheckFileExist(self.WorkspaceDir, ItemList[1], self.Module.Header.FullPath, 'LibraryClasses', Item[0])\r
+                    CheckPcdTokenInfo(ItemList[2], 'LibraryClasses', File)\r
                     MergeArches(LibraryClasses, (ItemList[0], ItemList[1], ItemList[2], DataType.TAB_VALUE_SPLIT.join(Item[1])), Arch)\r
         for Key in LibraryClasses.keys():\r
             KeyList = Key[0].split(DataType.TAB_VALUE_SPLIT)\r
@@ -273,7 +293,9 @@ class Inf(InfObject):
                 LibraryClass.SupModuleList = DataType.SUP_MODULE_LIST\r
             self.Module.LibraryClasses.append(LibraryClass)\r
         \r
-        #Packages\r
+        #\r
+        # Packages\r
+        #\r
         Packages = {}\r
         Defines = {}\r
         for Arch in DataType.ARCH_LIST:\r
@@ -282,8 +304,7 @@ class Inf(InfObject):
                 if Status == 0:       # Find DEFINE statement\r
                     pass\r
                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section Packages in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item[0], 'Packages', File, 'DEFINE <VarName> = <PATH>')\r
                 elif Status == 1:     # Not find DEFINE statement\r
                     CheckFileType(Item, '.Dec', self.Module.Header.FullPath, 'package', Item)\r
                     CheckFileExist(self.WorkspaceDir, Item, self.Module.Header.FullPath, 'Packages', Item)\r
@@ -295,7 +316,9 @@ class Inf(InfObject):
             Package.SupArchList = Packages[Key]\r
             self.Module.PackageDependencies.append(Package)\r
             \r
-        #Nmake\r
+        #\r
+        # Nmake\r
+        #\r
         Nmakes = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Nmake:\r
@@ -303,76 +326,34 @@ class Inf(InfObject):
         for Key in Nmakes.keys():\r
             List = GetSplitValueList(Key, DataType.TAB_EQUAL_SPLIT)\r
             if len(List) != 2:\r
-                ErrorMsg = "Wrong statement '%s' found in section Nmake in file '%s', correct format is '<Word>=<Word>'" % (Item, self.Module.Header.FullPath) \r
-                raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                RaiseParserError(Item[0], 'Nmake', File, 'DEFINE <VarName> = <PATH>')\r
             Nmake = ModuleNmakeClass()\r
             Nmake.Name = List[0]\r
             Nmake.Value = List[1]\r
             Nmake.SupArchList = Nmakes[Key]\r
             self.Module.Nmake.append(Nmake)\r
         \r
-        #Pcds\r
+        #\r
+        # Pcds\r
+        # <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
+        #\r
         Pcds = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].FixedPcd:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT\r
-                List = GetSplitValueList(Item)\r
-                if len(List) < 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FixedPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FixedPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], TAB_PCDS_FIXED_AT_BUILD), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfInf(Item, TAB_PCDS_FIXED_AT_BUILD, File), Arch)\r
             \r
             for Item in self.Contents[Arch].PatchPcd:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT\r
-                List = GetSplitValueList(Item)\r
-                if len(List) < 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PatchPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FixedPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], TAB_PCDS_PATCHABLE_IN_MODULE), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfInf(Item, TAB_PCDS_PATCHABLE_IN_MODULE, File), Arch)\r
             \r
             for Item in self.Contents[Arch].FeaturePcd:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT\r
-                List = GetSplitValueList(Item)\r
-                if len(List) < 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FeaturePcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FixedPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], TAB_PCDS_FEATURE_FLAG), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfInf(Item, TAB_PCDS_FEATURE_FLAG, File), Arch)\r
             \r
             for Item in self.Contents[Arch].PcdEx:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT\r
-                List = GetSplitValueList(Item)\r
-                if len(List) < 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section PcdEx in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FixedPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], TAB_PCDS_DYNAMIC_EX), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfInf(Item, TAB_PCDS_DYNAMIC_EX, File), Arch)\r
             \r
             for Item in self.Contents[Arch].Pcd:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT\r
-                List = GetSplitValueList(Item)\r
-                if len(List) < 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Pcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-                if len(TokenInfo) != 2:\r
-                    ErrorMsg = "Wrong statement '%s' found in section FixedPcd in file '%s', correct format is '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
-                MergeArches(Pcds, (TokenInfo[0], TokenInfo[1], List[1], TAB_PCDS_DYNAMIC), Arch)\r
+                MergeArches(Pcds, self.GetPcdOfInf(Item, TAB_PCDS_DYNAMIC, File), Arch)\r
+                \r
         for Key in Pcds.keys():\r
             Pcd = PcdClass()\r
             Pcd.CName = Key[1]\r
@@ -382,25 +363,33 @@ class Inf(InfObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Module.PcdCodes.append(Pcd)\r
         \r
-        #Sources\r
+        #\r
+        # Sources\r
+        # <Filename>[|<Family>|<TagName>|<ToolCode>|<PcdFeatureFlag>]\r
+        #\r
         Sources = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Sources:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT * 4\r
-                List = GetSplitValueList(Item)\r
+                ItemNew = Item + DataType.TAB_VALUE_SPLIT * 4\r
+                List = GetSplitValueList(ItemNew)\r
+                if len(List) != 5 and len(List) != 9:\r
+                    RaiseParserError(Item, 'Sources', File, '<Filename>[|<Family>|<TagName>|<ToolCode>|<PcdFeatureFlag>]')\r
+                CheckFileExist(self.Identification.FileRelativePath, List[0], File, 'Sources', Item)\r
+                CheckPcdTokenInfo(List[4], 'Sources', File)\r
                 MergeArches(Sources, (List[0], List[1], List[2], List[3], List[4]), Arch)\r
         for Key in Sources.keys():\r
-            Source = ModuleSourceFileClass(Key[0], Key[3], Key[4], Key[1], Key[2], Sources[Key])\r
+            Source = ModuleSourceFileClass(Key[0], Key[2], Key[3], Key[1], Key[4], Sources[Key])\r
             self.Module.Sources.append(Source)\r
-        \r
-        #UserExtensions\r
+\r
+        #\r
+        # UserExtensions\r
+        #\r
         if self.UserExtensions != '':\r
             UserExtension = UserExtensionsClass()\r
             Lines = self.UserExtensions.splitlines()\r
             List = GetSplitValueList(Lines[0], DataType.TAB_SPLIT, 2)\r
             if len(List) != 3:\r
-                ErrorMsg = "Wrong statement '%s' found in section UserExtensions in file '%s', correct format is 'UserExtensions.UserId.'Identifier''" % (Item[0:-1], self.Module.Header.FullPath) \r
-                raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                RaiseParserError(Lines[0], 'UserExtensions', File, "UserExtensions.UserId.'Identifier'")\r
             else:\r
                 UserExtension.UserID = List[1]\r
                 UserExtension.Identifier = List[2][0:-1].replace("'", '').replace('\"', '')\r
@@ -408,7 +397,9 @@ class Inf(InfObject):
                     UserExtension.Content = UserExtension.Content + CleanString(Line) + '\n'\r
             self.Module.UserExtensions.append(UserExtension)\r
         \r
-        #Guids\r
+        #\r
+        # Guids\r
+        #\r
         Guids = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Guids:\r
@@ -419,7 +410,9 @@ class Inf(InfObject):
             Guid.SupArchList = Guids[Key]\r
             self.Module.Guids.append(Guid)\r
 \r
-        #Protocols\r
+        #\r
+        # Protocols\r
+        #\r
         Protocols = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Protocols:\r
@@ -430,7 +423,9 @@ class Inf(InfObject):
             Protocol.SupArchList = Protocols[Key]\r
             self.Module.Protocols.append(Protocol)\r
         \r
-        #Ppis\r
+        #\r
+        # Ppis\r
+        #\r
         Ppis = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Ppis:\r
@@ -441,7 +436,9 @@ class Inf(InfObject):
             Ppi.SupArchList = Ppis[Key]\r
             self.Module.Ppis.append(Ppi)\r
         \r
-        #Depex\r
+        #\r
+        # Depex\r
+        #\r
         Depex = {}\r
         Defines = {}\r
         for Arch in DataType.ARCH_LIST:\r
@@ -451,8 +448,7 @@ class Inf(InfObject):
                 if Status == 0:       # Find DEFINE statement\r
                     pass\r
                 elif Status == -1:    # Find DEFINE statement but in wrong format\r
-                    ErrorMsg = "Wrong DEFINE statement '%s' found in section Depex in file '%s', correct format is 'DEFINE <VarName> = <PATH>'" % (Item, self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                    RaiseParserError(Item, 'Depex', File, 'DEFINE <VarName> = <PATH>')\r
                 elif Status == 1:     # Not find DEFINE statement\r
                     Line = Line + Item + ' '\r
             MergeArches(Depex, Line, Arch)\r
@@ -463,21 +459,39 @@ class Inf(InfObject):
             Dep.Define = Defines\r
             self.Module.Depex.append(Dep)\r
         \r
-        #Binaries\r
+        #\r
+        # Binaries\r
+        # <FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]\r
+        #\r
         Binaries = {}\r
         for Arch in DataType.ARCH_LIST:\r
             for Item in self.Contents[Arch].Binaries:\r
-                Item = Item + DataType.TAB_VALUE_SPLIT\r
-                List = GetSplitValueList(Item)\r
-                if len(List) < 4:\r
-                    ErrorMsg = "Wrong statement '%s' found in section Binaries in file '%s', correct format is '<FileType>|<Target>|<FileName>[|<PcdFeatureFlag>]'" % (Item[0:-1], self.Module.Header.FullPath) \r
-                    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
+                ItemNew = Item + DataType.TAB_VALUE_SPLIT\r
+                List = GetSplitValueList(ItemNew)\r
+                if len(List) != 4 and len(List) != 5:\r
+                    RaiseParserError(Item, 'Binaries', File, "<FileType>|<Filename>|<Target>[|<TokenSpaceGuidCName>.<PcdCName>]")\r
                 else:\r
+                    CheckPcdTokenInfo(List[3], 'Binaries', File)\r
                     MergeArches(Binaries, (List[0], List[1], List[2], List[3]), Arch)\r
         for Key in Binaries.keys():\r
             Binary = ModuleBinaryFileClass(Key[2], Key[0], Key[1], Key[3], Binaries[Key])\r
             self.Module.Binaries.append(Binary)\r
         \r
+    #\r
+    # Get Pcd of Dec as <TokenSpaceGuidCName>.<PcdCName>[|<Value>]\r
+    # Return (TokenSpcCName, TokenCName, Value, ItemType)\r
+    #\r
+    def GetPcdOfInf(self, Item, Type, File):\r
+        Format = '<TokenSpaceGuidCName>.<PcdCName>[|<Value>]'\r
+        List = GetSplitValueList(Item + DataType.TAB_VALUE_SPLIT)\r
+        if len(List) < 2 or len(List) > 3:\r
+            RaiseParserError(Item, 'Pcds' + Type, File, Format)\r
+        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
+        if len(TokenInfo) != 2:\r
+            RaiseParserError(Item, 'Pcds' + Type, File, Format)\r
+        \r
+        return (TokenInfo[0], TokenInfo[1], List[1], Type)\r
+    \r
     def LoadInfFile(self, Filename):     \r
         (Filepath, Name) = os.path.split(Filename)\r
         self.Identification.FileName = Name\r
@@ -513,6 +527,9 @@ class Inf(InfObject):
                                 continue\r
             #EndFor\r
 \r
+    #\r
+    # Show detailed information of Inf\r
+    #\r
     def ShowInf(self):\r
         print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
         printDict(self.Defines.DefinesDictionary)\r
@@ -525,6 +542,9 @@ class Inf(InfObject):
                 eval(Command)\r
         print ""\r
     \r
+    #\r
+    # Show detailed information of Module\r
+    #\r
     def ShowModule(self):\r
         m = self.Module\r
         print 'Filename =', m.Header.FileName\r
@@ -576,10 +596,10 @@ class Inf(InfObject):
             print Item.Name, Item.Value, Item.SupArchList\r
         print '\nPcds =', m.PcdCodes\r
         for Item in m.PcdCodes:\r
-            print '\tCName=', Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, Item.SupArchList\r
+            print '\tCName=',Item.CName, 'TokenSpaceGuidCName=', Item.TokenSpaceGuidCName, 'DefaultValue=', Item.DefaultValue, 'ItemType=', Item.ItemType, Item.SupArchList\r
         print '\nSources =', m.Sources\r
         for Source in m.Sources:\r
-            print Source.SourceFile, Source.ToolChainFamily, Source.FeatureFlag, Source.TagName, Source.ToolCode, Source.SupArchList\r
+            print Source.SourceFile, 'Fam=', Source.ToolChainFamily, 'Pcd=', Source.FeatureFlag, 'Tag=', Source.TagName, 'ToolCode=', Source.ToolCode, Source.SupArchList\r
         print '\nUserExtensions =', m.UserExtensions\r
         for UserExtension in m.UserExtensions:\r
             print UserExtension.UserID, UserExtension.Identifier,UserExtension.Content\r
index fcaf756..92684e5 100644 (file)
@@ -82,7 +82,9 @@ def GetExec(String):
 # Parse a string with format "[<Family>:]<ToolFlag>=Flag"\r
 # Return (Family, ToolFlag, Flag)\r
 #\r
-def GetBuildOption(String):\r
+def GetBuildOption(String, File):\r
+    if String.find(DataType.TAB_EQUAL_SPLIT) < 0:\r
+        RaiseParserError(String, 'BuildOptions', File, '[<Family>:]<ToolFlag>=Flag')\r
     (Family, ToolChain, Flag) = ('', '', '')\r
     List = GetSplitValueList(String, DataType.TAB_EQUAL_SPLIT, MaxSplit = 1)\r
     if List[0].find(':') > -1:\r
@@ -288,9 +290,13 @@ def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCh
         # Handle DEFINE and SPEC\r
         #\r
         if Line.find(DataType.TAB_INF_DEFINES_DEFINE + ' ') > -1:\r
+            if '' in DefineValues:\r
+                DefineValues.remove('')\r
             DefineValues.append(GetDefineValue(Line, DataType.TAB_INF_DEFINES_DEFINE, CommentCharacter))\r
             continue\r
         if Line.find(DataType.TAB_INF_DEFINES_SPEC + ' ') > -1:\r
+            if '' in SpecValues:\r
+                SpecValues.remove('')\r
             SpecValues.append(GetDefineValue(Line, DataType.TAB_INF_DEFINES_SPEC, CommentCharacter))\r
             continue\r
                 \r
@@ -304,7 +310,7 @@ def GetSingleValueOfKeyFromLines(Lines, Dictionary, CommentCharacter, KeySplitCh
                 #Remove comments and white spaces\r
                 LineList[1] = CleanString(LineList[1], CommentCharacter)\r
                 if ValueSplitFlag:\r
-                    Value = map(string.strip, LineList[1].replace('\\','/').split(ValueSplitCharacter))\r
+                    Value = map(string.strip, LineList[1].split(ValueSplitCharacter))\r
                 else:\r
                     Value = CleanString(LineList[1], CommentCharacter).splitlines()\r
                 \r
@@ -359,6 +365,8 @@ def PreCheck(FileName, FileContent, SupSectionTag):
                 Tag = Tag.split(DataType.TAB_SPLIT, 1)[0].replace('[', '').replace(']', '').strip()\r
                 if Tag.upper() == DataType.TAB_COMMON_DEFINES.upper():\r
                     break\r
+                if Tag.upper() == DataType.TAB_USER_EXTENSIONS.upper():\r
+                    break\r
                 if Tag.upper() not in map(lambda s: s.upper(), SupSectionTag):\r
                     ErrorMsg = "'%s' is not a supportted section name found at line %s in file '%s'" % (Tag, LineNo, FileName)\r
                     raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
@@ -377,7 +385,7 @@ def CheckFileType(CheckFilename, ExtName, ContainerFilename, SectionName, Line):
         if Ext.upper() != ExtName.upper():\r
             ContainerFile = open(ContainerFilename, 'r').read()\r
             LineNo = GetLineNo(ContainerFile, Line)\r
-            ErrorMsg = "Invalid %s '%s' defined at line %s in file '%s', it is NOT a valid '%s' file" % (SectionName, CheckFilename, LineNo, ContainerFilename, ExtName) \r
+            ErrorMsg = "Invalid %s '%s' is defined at line %s in file '%s', it is NOT a valid '%s' file" % (SectionName, CheckFilename, LineNo, ContainerFilename, ExtName) \r
             raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
     \r
     return True\r
@@ -395,20 +403,41 @@ def CheckFileExist(WorkspaceDir, CheckFilename, ContainerFilename, SectionName,
         else:\r
             ContainerFile = open(ContainerFilename, 'r').read()\r
             LineNo = GetLineNo(ContainerFile, Line)\r
-            ErrorMsg = "Can't find file '%s' defined in section %s at line %s in file '%s'" % (CheckFile, SectionName, LineNo, ContainerFilename) \r
+            ErrorMsg = "Can't find file '%s' defined in section '%s' at line %s in file '%s'" % (CheckFile, SectionName, LineNo, ContainerFilename) \r
             raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
     \r
     return True\r
 \r
+#\r
+# Check if PcdTokenInfo is following <TokenSpaceGuidCName>.<PcdCName>\r
+#\r
+def CheckPcdTokenInfo(TokenInfoString, Section, File):\r
+    if TokenInfoString != '' and TokenInfoString != None:\r
+        Format = '<TokenSpaceGuidCName>.<PcdCName>'\r
+        TokenInfoList = GetSplitValueList(TokenInfoString, DataType.TAB_SPLIT)\r
+        if len(TokenInfoList) != 2:\r
+            RaiseParserError(TokenInfoString, Section, File, Format)\r
+    \r
+    return True\r
+\r
 #\r
 # Find the index of a line in a file\r
 #\r
 def GetLineNo(FileContent, Line):\r
-    LineNo = -1\r
     LineList = FileContent.splitlines()\r
     for Index in range(len(LineList)):\r
         if LineList[Index].find(Line) > -1:\r
             return Index + 1\r
+    \r
+    return -1\r
+\r
+#\r
+# Raise a parser error\r
+#\r
+def RaiseParserError(Line, Section, File, Format):\r
+    LineNo = GetLineNo(open(os.path.normpath(File), 'r').read(), Line)\r
+    ErrorMsg = "Invalid statement '%s' is found in section '%s' at line %s in file '%s', correct format is '%s'" % (Line, Section, LineNo, File, Format) \r
+    raise ParserError(PARSER_ERROR, msg = ErrorMsg)\r
 \r
 #\r
 # Return a full path with workspace dir\r
index ce4c1dd..18d5669 100644 (file)
@@ -33,6 +33,8 @@ class PlatformHeaderClass(IdentificationClass, CommonHeaderClass, DefineClass):
         self.BuildNumber = ''\r
         self.MakefileName = ''\r
         self.ClonedFrom = []                                         #[ ClonedRecordClass, ...]\r
+        self.BsBaseAddress = ''\r
+        self.RtBaseAddress = ''\r
 \r
 class PlatformFlashDefinitionFileClass(object):\r
     def __init__(self):\r