]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTool/VfrCompile: Support Union type in VFR
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 406dbc5988a1c604c9186901ab3b0e5d191d4460..24e053827bcbe9aa17cad9da36cb7225536e0d0d 100644 (file)
@@ -157,6 +157,7 @@ VfrParserStart (
 #token Inventory("inventory")                   "inventory"\r
 #token NonNvDataMap("_NON_NV_DATA_MAP")         "_NON_NV_DATA_MAP"\r
 #token Struct("struct")                         "struct"\r
+#token Union("union")                           "union"\r
 #token Boolean("BOOLEAN")                       "BOOLEAN"\r
 #token Uint64("UINT64")                         "UINT64"\r
 #token Uint32("UINT32")                         "UINT32"\r
@@ -272,6 +273,7 @@ vfrProgram > [UINT8 Return] :
   (\r
       vfrPragmaPackDefinition\r
     | vfrDataStructDefinition\r
+    | vfrDataUnionDefinition\r
   )*\r
   vfrFormSetDefinition\r
   << $Return = mParserStatus; >>\r
@@ -320,6 +322,21 @@ vfrPragmaPackDefinition :
   "\)"\r
   ;\r
 \r
+  vfrDataUnionDefinition :\r
+  { TypeDef } Union                                << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
+  { NonNvDataMap }\r
+  {\r
+    N1:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
+  }\r
+  OpenBrace\r
+    vfrDataStructFields[TRUE]\r
+  CloseBrace\r
+  {\r
+    N2:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
+  }\r
+  ";"                                               << gCVfrVarDataTypeDB.DeclareDataTypeEnd ();>>\r
+  ;\r
+\r
 vfrDataStructDefinition :\r
   { TypeDef } Struct                                << gCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
   { NonNvDataMap }\r
@@ -327,7 +344,7 @@ vfrDataStructDefinition :
     N1:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
   }\r
   OpenBrace\r
-    vfrDataStructFields\r
+    vfrDataStructFields[FALSE]\r
   CloseBrace\r
   {\r
     N2:StringIdentifier                             << _PCATCH(gCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
@@ -335,42 +352,42 @@ vfrDataStructDefinition :
   ";"                                               << gCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r
   ;\r
 \r
-vfrDataStructFields :\r
+vfrDataStructFields [BOOLEAN  FieldInUnion]:\r
   (\r
-     dataStructField64     |\r
-     dataStructField32     |\r
-     dataStructField16     |\r
-     dataStructField8      |\r
-     dataStructFieldBool   |\r
-     dataStructFieldString |\r
-     dataStructFieldDate   |\r
-     dataStructFieldTime   |\r
-     dataStructFieldRef    |\r
-     dataStructFieldUser\r
+     dataStructField64 [FieldInUnion]    |\r
+     dataStructField32 [FieldInUnion]    |\r
+     dataStructField16 [FieldInUnion]    |\r
+     dataStructField8  [FieldInUnion]    |\r
+     dataStructFieldBool [FieldInUnion]  |\r
+     dataStructFieldString [FieldInUnion]|\r
+     dataStructFieldDate  [FieldInUnion] |\r
+     dataStructFieldTime  [FieldInUnion] |\r
+     dataStructFieldRef   [FieldInUnion] |\r
+     dataStructFieldUser [FieldInUnion]\r
   )*\r
   ;\r
 \r
-dataStructField64 :\r
+dataStructField64 [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"UINT64"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField32 :\r
+dataStructField32 [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"UINT32"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField16 :\r
+dataStructField16 [BOOLEAN  FieldInUnion]:\r
   << \r
     UINT32 ArrayNum = 0; \r
   >>\r
@@ -379,77 +396,77 @@ dataStructField16 :
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), (CHAR8 *) "UINT16", ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructField8 :\r
+dataStructField8 [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"UINT8"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldBool :\r
+dataStructFieldBool [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"BOOLEAN"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldString :\r
+dataStructFieldString [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_STRING_ID"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldDate :\r
+dataStructFieldDate [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_HII_DATE"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldTime :\r
+dataStructFieldTime [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_HII_TIME"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldRef :\r
+dataStructFieldRef [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   D:"EFI_HII_REF"\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum), N); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), D->getText(), ArrayNum, FieldInUnion), N); >>\r
   ;\r
 \r
-dataStructFieldUser :\r
+dataStructFieldUser [BOOLEAN  FieldInUnion]:\r
   << UINT32 ArrayNum = 0; >>\r
   T:StringIdentifier\r
   N:StringIdentifier\r
   {\r
     OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText(), I->getLine()); >>\r
   }\r
-  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\r
+  ";"                                               << _PCATCH(gCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum, FieldInUnion), T); >>\r
   ;\r
 \r
 //*****************************************************************************\r