Added doxygen comments
[people/mcb30/basetools.git] / Source / Python / Workspace / MetaFileParser.py
index 2fe4c55..3c614fa 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
-# This file is used to create a database used by ECC tool\r
+# This file is used to parse meta files\r
 #\r
-# Copyright (c) 2007 ~ 2008, Intel Corporation\r
+# Copyright (c) 2008, Intel Corporation\r
 # All rights reserved. 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
@@ -14,7 +14,6 @@
 ##\r
 # Import Modules\r
 #\r
-import sqlite3\r
 import os\r
 import time\r
 \r
@@ -24,8 +23,33 @@ from Common.DataType import *
 from Common.String import *\r
 from Common.Misc import Blist\r
 \r
+## Base class of parser\r
+#\r
+#  This class is used for derivation purpose. The specific parser for one kind\r
+# type file must derive this class and implement some public interfaces.\r
+#\r
+#   @param      FilePath        The path of platform description file\r
+#   @param      FileType        The raw data of DSC file\r
+#   @param      Table           Database used to retrieve module/package information\r
+#   @param      Macros          Macros used for replacement in file\r
+#   @param      Owner           Owner ID (for sub-section parsing)\r
+#   @param      From            ID from which the data comes (for !INCLUDE directive)\r
+#\r
 class MetaFileParser(object):\r
+    # data type (file content) for specific file type\r
     DataType = {}\r
+\r
+    ## Constructor of MetaFileParser\r
+    #\r
+    #  Initialize object of MetaFileParser\r
+    #\r
+    #   @param      FilePath        The path of platform description file\r
+    #   @param      FileType        The raw data of DSC file\r
+    #   @param      Table           Database used to retrieve module/package information\r
+    #   @param      Macros          Macros used for replacement in file\r
+    #   @param      Owner           Owner ID (for sub-section parsing)\r
+    #   @param      From            ID from which the data comes (for !INCLUDE directive)\r
+    #\r
     def __init__(self, FilePath, FileType, Table, Macros={}, Owner=-1, From=-1):\r
         self._Table = Table\r
         self._FileType = FileType\r
@@ -36,7 +60,7 @@ class MetaFileParser(object):
         self._Owner = Owner\r
         self._From = From\r
 \r
-        # for parsing\r
+        # parsr status for parsing\r
         self._Content = None\r
         self._ValueList = ['', '', '', '', '']\r
         self._Scope = []\r
@@ -51,37 +75,60 @@ class MetaFileParser(object):
         self._Enabled = 0\r
         self._Finished = False\r
 \r
+    ## Store the parsed data in table\r
     def _Store(self, *Args):\r
         return self._Table.Insert(*Args)\r
 \r
+    ## Virtual method for starting parse\r
     def Start(self):\r
         raise NotImplementedError \r
 \r
+    ## Set parsing complete flag in both class and table\r
     def _Done(self):\r
         self._Finished = True\r
         self._Table.SetEndFlag()\r
 \r
+    ## Return the table containg parsed data\r
+    #\r
+    #   If the parse complete flag is not set, this method will try to parse the\r
+    # file before return the table\r
+    # \r
     def _GetTable(self):\r
         if not self._Finished:\r
             self.Start()\r
         return self._Table\r
 \r
+    ## Get the parse complete flag\r
     def _GetFinished(self):\r
         return self._Finished\r
 \r
+    ## Set the complete flag\r
     def _SetFinished(self, Value):\r
         self._Finished = Value\r
 \r
-    # DataType = [section_header_name, scope1(arch), scope2(platform,moduletype)]\r
+    ## Use [] style to query data in table, just for readability\r
+    # \r
+    #   DataInfo = [data_type, scope1(arch), scope2(platform,moduletype)]\r
+    # \r
     def __getitem__(self, DataInfo):\r
         if type(DataInfo) != type(()):\r
             DataInfo = (DataInfo,)\r
         return self.Table.Query(*DataInfo)\r
 \r
+    ## Data parser for the common format in different type of file\r
+    #\r
+    #   The common format in the meatfile is like\r
+    # \r
+    #       xxx1 | xxx2 | xxx3\r
+    # \r
     def _CommonParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
         self._ValueList[0:len(TokenList)] = TokenList\r
 \r
+    ## Data parser for the format in which there's path\r
+    #\r
+    #   Only path can have macro used. So we need to replace them before use.\r
+    # \r
     def _PathParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT)\r
         self._ValueList[0:len(TokenList)] = TokenList\r
@@ -92,15 +139,23 @@ class MetaFileParser(object):
                     continue\r
                 self._ValueList[Index] = NormPath(Value, self._Macros)\r
 \r
+    ## Skip unsupported data\r
     def _Skip(self):\r
         self._ValueList[0:1] = [self._CurrentLine]\r
 \r
+    ## Section header parser\r
+    #\r
+    #   The section header is always in following format:\r
+    # \r
+    #       [section_name.arch<.platform|module_type>]\r
+    # \r
     def _SectionHeaderParser(self):\r
         self._Scope = []\r
         self._SectionName = ''\r
         ArchList = set()\r
         for Item in GetSplitValueList(self._CurrentLine[1:-1], TAB_COMMA_SPLIT):\r
             ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
+            # different section should not mix in one section\r
             if self._SectionName != '' and self._SectionName != ItemList[0].upper():\r
                 EdkLogger.error('Parser', FORMAT_INVALID, "Different section names in the same section",\r
                                 File=self._FilePath, Line=self._LineIndex+1, ExtraData=self._CurrentLine)\r
@@ -127,6 +182,7 @@ class MetaFileParser(object):
             EdkLogger.error('Parser', FORMAT_INVALID, "'common' ARCH must not be used with specific ARCHs",\r
                             File=self._FilePath, Line=self._LineIndex+1, ExtraData=self._CurrentLine)\r
 \r
+    ## [defines] section parser\r
     def _DefineParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)\r
         self._ValueList[0:len(TokenList)] = TokenList\r
@@ -134,6 +190,7 @@ class MetaFileParser(object):
             EdkLogger.error('Parser', FORMAT_INVALID, "No value specified",\r
                             ExtraData=self._CurrentLine, File=self._FilePath, Line=self._LineIndex+1)\r
 \r
+    ## DEFINE name=value parser\r
     def _MacroParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, ' ', 1)\r
         if len(TokenList) < 2 or TokenList[1] == '':\r
@@ -144,6 +201,7 @@ class MetaFileParser(object):
             return\r
         if self._Macros == None:\r
             self._Macros = {}\r
+        # keep the macro definition for later use\r
         self._Macros[TokenList[0]] = TokenList[1]\r
 \r
     _SectionParser  = {}\r
@@ -151,7 +209,15 @@ class MetaFileParser(object):
     Finished        = property(_GetFinished, _SetFinished)\r
 \r
 \r
+## INF file parser class\r
+#\r
+#   @param      FilePath        The path of platform description file\r
+#   @param      FileType        The raw data of DSC file\r
+#   @param      Table           Database used to retrieve module/package information\r
+#   @param      Macros          Macros used for replacement in file\r
+#\r
 class InfParser(MetaFileParser):\r
+    # INF file supported data types (one type per section)\r
     DataType = {\r
         TAB_UNKNOWN.upper() : MODEL_UNKNOWN,\r
         TAB_INF_DEFINES.upper() : MODEL_META_DATA_HEADER,\r
@@ -175,15 +241,26 @@ class InfParser(MetaFileParser):
         TAB_USER_EXTENSIONS.upper() : MODEL_META_DATA_USER_EXTENSION\r
     }\r
 \r
-    def __init__(self, FilePath, FileId, FileType, Table, Macros={}):\r
+    ## Constructor of InfParser\r
+    #\r
+    #  Initialize object of InfParser\r
+    #\r
+    #   @param      FilePath        The path of module description file\r
+    #   @param      FileType        The raw data of DSC file\r
+    #   @param      Table           Database used to retrieve module/package information\r
+    #   @param      Macros          Macros used for replacement in file\r
+    #\r
+    def __init__(self, FilePath, FileType, Table, Macros={}):\r
         MetaFileParser.__init__(self, FilePath, FileType, Table, Macros)\r
 \r
+    ## Parser starter\r
     def Start(self):\r
         try:\r
             self._Content = open(self._FilePath, 'r').readlines()\r
         except:\r
             EdkLogger.error("Parser", FILE_READ_FAILURE, ExtraData=self._FilePath)\r
 \r
+        # parse the file line by line\r
         for Index in range(0, len(self._Content)):\r
             Line = CleanString(self._Content[Index])\r
             if Line == '':\r
@@ -196,18 +273,19 @@ class InfParser(MetaFileParser):
                 self._SectionHeaderParser()\r
                 continue\r
             elif Line.upper().startswith('DEFINE '):\r
+                # file private macros\r
                 self._MacroParser()\r
                 continue\r
 \r
             # section content\r
             self._ValueList = ['','','']\r
+            # parse current line, result will be put in self._ValueList\r
             self._SectionParser[self._SectionType](self)\r
             if self._ValueList == None:\r
                 continue\r
             # \r
-            # Model, Value1, Value2, Value3, Value4, Value5, Arch, Platform, BelongsToFile=-1, \r
-            # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, BelongsToItem=-1, FeatureFlag='', \r
-            # Enabled=-1\r
+            # Model, Value1, Value2, Value3, Arch, Platform, BelongsToItem=-1, \r
+            # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1\r
             # \r
             for Arch, Platform in self._Scope:\r
                 self._Store(self._SectionType,\r
@@ -224,7 +302,8 @@ class InfParser(MetaFileParser):
                             0\r
                             )\r
         self._Done()\r
-            \r
+\r
+    ## [BuildOptions] section parser\r
     def _BuildOptionParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)\r
         TokenList2 = GetSplitValueList(TokenList[0], ':', 1)\r
@@ -235,12 +314,14 @@ class InfParser(MetaFileParser):
             self._ValueList[1] = TokenList[0]\r
         self._ValueList[2] = ReplaceMacro(TokenList[1], self._Macros)\r
 \r
+    ## [nmake] section parser (R8.x style only)\r
     def _NmakeParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)\r
         self._ValueList[0:len(TokenList)] = TokenList\r
         # remove self-reference in macro setting\r
         self._ValueList[1] = ReplaceMacro(self._ValueList[1], {self._ValueList[0]:''})\r
 \r
+    ## [FixedPcd], [FeaturePcd], [PatchPcd], [Pcd] and [PcdEx] sections parser\r
     def _PcdParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
         self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
@@ -250,6 +331,7 @@ class InfParser(MetaFileParser):
             EdkLogger.error('Parser', FORMAT_INVALID, "No token space GUID or PCD name specified",\r
                             ExtraData=self._CurrentLine, File=self._FilePath, Line=self._LineIndex+1)\r
 \r
+    ## [depex] section parser\r
     def _DepexParser(self):\r
         self._ValueList[0:1] = [self._CurrentLine]\r
 \r
@@ -276,7 +358,17 @@ class InfParser(MetaFileParser):
         MODEL_META_DATA_USER_EXTENSION  :   MetaFileParser._Skip,\r
     }\r
 \r
+## DSC file parser class\r
+#\r
+#   @param      FilePath        The path of platform description file\r
+#   @param      FileType        The raw data of DSC file\r
+#   @param      Table           Database used to retrieve module/package information\r
+#   @param      Macros          Macros used for replacement in file\r
+#   @param      Owner           Owner ID (for sub-section parsing)\r
+#   @param      From            ID from which the data comes (for !INCLUDE directive)\r
+#\r
 class DscParser(MetaFileParser):\r
+    # DSC file supported data types (one type per section)\r
     DataType = {\r
         TAB_SKUIDS.upper()                          :   MODEL_EFI_SKU_ID,\r
         TAB_LIBRARIES.upper()                       :   MODEL_EFI_LIBRARY_INSTANCE,\r
@@ -302,6 +394,7 @@ class DscParser(MetaFileParser):
         TAB_END_IF.upper()                          :   MODEL_META_DATA_CONDITIONAL_STATEMENT_ENDIF,\r
     }\r
 \r
+    # sections which allow "!include" directive\r
     _IncludeAllowedSection = [\r
         TAB_LIBRARIES.upper(), \r
         TAB_LIBRARY_CLASSES.upper(), \r
@@ -319,6 +412,7 @@ class DscParser(MetaFileParser):
         TAB_PCDS_DYNAMIC_EX_VPD_NULL.upper(),\r
         ]\r
 \r
+    # operators which can be used in "!if/!ifdef/!ifndef" directives\r
     _OP_ = {\r
         "!"     :   lambda a:   not a,\r
         "!="    :   lambda a,b: a!=b,\r
@@ -331,11 +425,23 @@ class DscParser(MetaFileParser):
         "=<"    :   lambda a,b: a<=b,\r
     }\r
 \r
-    def __init__(self, FilePath, FileId, FileType, Table, Macros={}, Owner=-1, From=-1):\r
+    ## Constructor of DscParser\r
+    #\r
+    #  Initialize object of DscParser\r
+    #\r
+    #   @param      FilePath        The path of platform description file\r
+    #   @param      FileType        The raw data of DSC file\r
+    #   @param      Table           Database used to retrieve module/package information\r
+    #   @param      Macros          Macros used for replacement in file\r
+    #   @param      Owner           Owner ID (for sub-section parsing)\r
+    #   @param      From            ID from which the data comes (for !INCLUDE directive)\r
+    #\r
+    def __init__(self, FilePath, FileType, Table, Macros={}, Owner=-1, From=-1):\r
         MetaFileParser.__init__(self, FilePath, FileType, Table, Macros, Owner, From)\r
         # to store conditional directive evaluation result\r
         self._Eval = Blist()\r
 \r
+    ## Parser starter\r
     def Start(self):\r
         try:\r
             if self._Content == None:\r
@@ -347,7 +453,6 @@ class DscParser(MetaFileParser):
             Line = CleanString(self._Content[Index])\r
             # skip empty line\r
             if Line == '':\r
-                self._LineIndex += 1\r
                 continue\r
             self._CurrentLine = Line\r
             self._LineIndex = Index\r
@@ -356,10 +461,12 @@ class DscParser(MetaFileParser):
             if Line[0] == TAB_SECTION_START and Line[-1] == TAB_SECTION_END:\r
                 self._SectionHeaderParser()\r
                 continue\r
+            # subsection ending\r
             elif Line[0] == '}':\r
                 self._InSubsection = False\r
                 self._Owner = -1\r
                 continue\r
+            # subsection header\r
             elif Line[0] == TAB_OPTION_START and Line[-1] == TAB_OPTION_END:\r
                 self._SubsectionHeaderParser()\r
                 continue\r
@@ -367,6 +474,7 @@ class DscParser(MetaFileParser):
             elif Line[0] == '!':\r
                 self._DirectiveParser()\r
                 continue\r
+            # file private macros\r
             elif Line.upper().startswith('DEFINE '):\r
                 self._MacroParser()\r
                 continue\r
@@ -386,9 +494,8 @@ class DscParser(MetaFileParser):
                 continue\r
 \r
             # \r
-            # Model, Value1, Value2, Value3, Arch, Platform, BelongsToFile=-1, \r
-            # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, BelongsToItem=-1, \r
-            # Enabled=-1\r
+            # Model, Value1, Value2, Value3, Arch, ModuleType, BelongsToItem=-1, BelongsToFile=-1, \r
+            # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, Enabled=-1\r
             # \r
             for Arch, ModuleType in self._Scope:\r
                 self._LastItem = self._Store(\r
@@ -408,15 +515,18 @@ class DscParser(MetaFileParser):
                     )\r
         self._Done()\r
 \r
+    ## [defines] section parser\r
     def _DefineParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)\r
         if len(TokenList) < 2:\r
             EdkLogger.error('Parser', FORMAT_INVALID, "No value specified",\r
                             ExtraData=self._CurrentLine, File=self._FilePath, Line=self._LineIndex+1)\r
+        # 'FLASH_DEFINITION', 'OUTPUT_DIRECTORY' need special processing\r
         if TokenList[0] in ['FLASH_DEFINITION', 'OUTPUT_DIRECTORY']:\r
             TokenList[1] = NormPath(TokenList[1], self._Macros)\r
         self._ValueList[0:len(TokenList)] = TokenList    \r
-            \r
+\r
+    ## <subsection_header> parser\r
     def _SubsectionHeaderParser(self):\r
         self._SubsectionName = self._CurrentLine[1:-1].upper()\r
         if self._SubsectionName in self.DataType:\r
@@ -424,6 +534,7 @@ class DscParser(MetaFileParser):
         else:\r
             self._SubsectionType = MODEL_UNKNOWN\r
 \r
+    ## Directive statement parser\r
     def _DirectiveParser(self):\r
         self._ValueList = ['','','']\r
         TokenList = GetSplitValueList(self._CurrentLine, ' ', 1)\r
@@ -433,6 +544,7 @@ class DscParser(MetaFileParser):
                             File=self._FilePath, Line=self._LineIndex+1,\r
                             ExtraData=self._CurrentLine)\r
         DirectiveName = self._ValueList[0].upper()\r
+        # keep the directive in database first\r
         self._LastItem = self._Store(\r
             self.DataType[DirectiveName],\r
             self._ValueList[0],\r
@@ -455,6 +567,7 @@ class DscParser(MetaFileParser):
             # the included file must be relative to the parsing file\r
             IncludedFile = os.path.join(self._FileDir, self._ValueList[1])\r
             Parser = DscParser(IncludedFile, self._FileType, self._Table, self._Macros, From=self._LastItem)\r
+            # set the parser status with current status\r
             Parser._SectionName = self._SectionName\r
             Parser._SectionType = self._SectionType\r
             Parser._Scope = self._Scope\r
@@ -464,6 +577,7 @@ class DscParser(MetaFileParser):
             except:\r
                 EdkLogger.error("Parser", PARSER_ERROR, File=self._FilePath, Line=self._LineIndex+1,\r
                                 ExtraData="Failed to parse content in file %s" % IncludedFile)\r
+            # update current status with sub-parser's status\r
             self._SectionName = Parser._SectionName\r
             self._SectionType = Parser._SectionType\r
             self._Scope       = Parser._Scope\r
@@ -491,11 +605,14 @@ class DscParser(MetaFileParser):
             else:\r
                 self._Enabled = len(self._Eval)\r
 \r
+    ## Evaludate the value of expression in "if/ifdef/ifndef" directives\r
     def _Evaluate(self, Expression):\r
         TokenList = Expression.split()\r
         TokenNumber = len(TokenList)\r
+        # one operand, guess it's just a macro name\r
         if TokenNumber == 1:\r
             return TokenList[0] in self._Macros\r
+        # two operands, suppose it's "!xxx" format\r
         elif TokenNumber == 2:\r
             Op = TokenList[0]\r
             if Op not in self._OP_:\r
@@ -506,6 +623,7 @@ class DscParser(MetaFileParser):
             else:\r
                 Value = False\r
             return self._OP_[Op](Value)\r
+        # three operands\r
         elif TokenNumber == 3:\r
             Name = TokenList[0]\r
             if Name not in self._Macros:\r
@@ -519,6 +637,7 @@ class DscParser(MetaFileParser):
             EdkLogger.error('Parser', FORMAT_INVALID, File=self._FilePath, Line=self._LineIndex+1,\r
                             ExtraData=Expression)\r
 \r
+    ## [BuildOptions] section parser\r
     def _BuildOptionParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)\r
         TokenList2 = GetSplitValueList(TokenList[0], ':', 1)\r
@@ -529,6 +648,20 @@ class DscParser(MetaFileParser):
             self._ValueList[1] = TokenList[0]\r
         self._ValueList[2] = ReplaceMacro(TokenList[1], self._Macros)\r
 \r
+    ## PCD sections parser \r
+    # \r
+    #   [PcdsFixedAtBuild]\r
+    #   [PcdsPatchableInModule]\r
+    #   [PcdsFeatureFlag]\r
+    #   [PcdsDynamicEx\r
+    #   [PcdsDynamicExDefault]\r
+    #   [PcdsDynamicExVpd]\r
+    #   [PcdsDynamicExHii]\r
+    #   [PcdsDynamic]\r
+    #   [PcdsDynamicDefault]\r
+    #   [PcdsDynamicVpd]\r
+    #   [PcdsDynamicHii]\r
+    # \r
     def _PcdParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
         self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r
@@ -540,6 +673,7 @@ class DscParser(MetaFileParser):
             EdkLogger.error('Parser', FORMAT_INVALID, "No PCD value given",\r
                             ExtraData=self._CurrentLine, File=self._FilePath, Line=self._LineIndex+1)\r
 \r
+    ## [components] section parser\r
     def _ComponentParser(self):        \r
         if self._CurrentLine[-1] == '{':\r
             self._InSubsection = True\r
@@ -569,7 +703,15 @@ class DscParser(MetaFileParser):
         MODEL_META_DATA_USER_EXTENSION  :   MetaFileParser._Skip,\r
     }\r
 \r
+## DEC file parser class\r
+#\r
+#   @param      FilePath        The path of platform description file\r
+#   @param      FileType        The raw data of DSC file\r
+#   @param      Table           Database used to retrieve module/package information\r
+#   @param      Macros          Macros used for replacement in file\r
+#\r
 class DecParser(MetaFileParser):\r
+    # DEC file supported data types (one type per section)\r
     DataType = {\r
         TAB_DEC_DEFINES.upper()                     :   MODEL_META_DATA_HEADER,\r
         TAB_INCLUDES.upper()                        :   MODEL_EFI_INCLUDE,\r
@@ -584,9 +726,19 @@ class DecParser(MetaFileParser):
         TAB_PCDS_DYNAMIC_EX_NULL.upper()            :   MODEL_PCD_DYNAMIC_EX,\r
     }\r
 \r
-    def __init__(self, FilePath, FileId, FileType, Table, Macro={}):\r
+    ## Constructor of DecParser\r
+    #\r
+    #  Initialize object of DecParser\r
+    #\r
+    #   @param      FilePath        The path of platform description file\r
+    #   @param      FileType        The raw data of DSC file\r
+    #   @param      Table           Database used to retrieve module/package information\r
+    #   @param      Macros          Macros used for replacement in file\r
+    #\r
+    def __init__(self, FilePath, FileType, Table, Macro={}):\r
         MetaFileParser.__init__(self, FilePath, FileType, Table, Macro, -1)\r
 \r
+    ## Parser starter\r
     def Start(self):\r
         try:\r
             if self._Content == None:\r
@@ -617,9 +769,8 @@ class DecParser(MetaFileParser):
                 continue\r
 \r
             # \r
-            # Model, Value1, Value2, Value3, Value4, Value5, Arch, Platform, BelongsToFile=-1, \r
-            # LineBegin=-1, ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, BelongsToItem=-1, FeatureFlag='', \r
-            # Enabled=-1\r
+            # Model, Value1, Value2, Value3, Arch, BelongsToItem=-1, LineBegin=-1, \r
+            # ColumnBegin=-1, LineEnd=-1, ColumnEnd=-1, FeatureFlag='', Enabled=-1\r
             # \r
             for Arch, ModuleType in self._Scope:\r
                 self._LastItem = self._Store(\r
@@ -637,7 +788,8 @@ class DecParser(MetaFileParser):
                     0\r
                     )\r
         self._Done()\r
-            \r
+\r
+    ## [guids], [ppis] and [protocols] section parser\r
     def _GuidParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_EQUAL_SPLIT, 1)\r
         if len(TokenList) < 2:\r
@@ -646,6 +798,14 @@ class DecParser(MetaFileParser):
         self._ValueList[0] = TokenList[0]\r
         self._ValueList[1] = TokenList[1]\r
 \r
+    ## PCD sections parser \r
+    # \r
+    #   [PcdsFixedAtBuild]\r
+    #   [PcdsPatchableInModule]\r
+    #   [PcdsFeatureFlag]\r
+    #   [PcdsDynamicEx\r
+    #   [PcdsDynamic]\r
+    # \r
     def _PcdParser(self):\r
         TokenList = GetSplitValueList(self._CurrentLine, TAB_VALUE_SPLIT, 1)\r
         self._ValueList[0:1] = GetSplitValueList(TokenList[0], TAB_SPLIT)\r