]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VfrCompile/VfrSyntax.g
BaseTools: Add reconnect request flag for question.
[mirror_edk2.git] / BaseTools / Source / C / VfrCompile / VfrSyntax.g
index 2255d6f60b3b9a089b104bb26cb1bbaf7cbdf1ef..fba8967fd2a2685654884e1915286cc1a9a20f47 100644 (file)
@@ -1,7 +1,7 @@
 /*++ @file\r
 Vfr Syntax\r
 \r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -191,6 +191,7 @@ VfrParserStart (
 #token InteractiveFlag("INTERACTIVE")           "INTERACTIVE"\r
 #token NVAccessFlag("NV_ACCESS")                "NV_ACCESS"\r
 #token ResetRequiredFlag("RESET_REQUIRED")      "RESET_REQUIRED"\r
+#token ReconnectRequiredFlag("RECONNECT_REQUIRED") "RECONNECT_REQUIRED"\r
 #token LateCheckFlag("LATE_CHECK")              "LATE_CHECK"\r
 #token ReadOnlyFlag("READ_ONLY")                "READ_ONLY"\r
 #token OptionOnlyFlag("OPTIONS_ONLY")           "OPTIONS_ONLY"\r
@@ -1186,6 +1187,7 @@ questionheaderFlagsField[UINT8 & Flags] :
     ReadOnlyFlag                                    << $Flags |= 0x01; >>\r
   | InteractiveFlag                                 << $Flags |= 0x04; >>\r
   | ResetRequiredFlag                               << $Flags |= 0x10; >>\r
+  | ReconnectRequiredFlag                           << $Flags |= 0x40; >>\r
   | O:OptionOnlyFlag                                << \r
                                                        if (mCompatibleMode) {\r
                                                          $Flags |= 0x80;\r
@@ -1393,23 +1395,95 @@ vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, CHAR8 *&VarIdStr,
   )\r
   ;\r
 \r
-vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
-  <<\r
-    EFI_GUID Guid;\r
+vfrConstantValueField[UINT8 Type, EFI_IFR_TYPE_VALUE &Value, BOOLEAN &ListType] :\r
+  <<  \r
+    EFI_GUID    Guid;\r
+    BOOLEAN     Negative = FALSE;\r
+    BOOLEAN     IntDecStyle = FALSE;\r
+    CIfrNumeric *NumericQst = NULL;\r
+    if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
+      NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+      IntDecStyle = (NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0 ? TRUE : FALSE;\r
+    }\r
+    UINT8    *Type8  = (UINT8  *) &Value;\r
+    UINT16   *Type16 = (UINT16 *) &Value;\r
+    UINT32   *Type32 = (UINT32 *) &Value;\r
+    UINT64   *Type64 = (UINT64 *) &Value;\r
+    UINT16   Index = 0;\r
+    ListType = FALSE;\r
   >>\r
+    {\r
+      "\-"                                          << Negative = TRUE;  >>\r
+    }\r
     N1:Number                                       <<\r
                                                        switch ($Type) {\r
                                                        case EFI_IFR_TYPE_NUM_SIZE_8 :\r
-                                                         $Value.u8     = _STOU8(N1->getText(), N1->getLine());\r
+                                                         $Value.u8 = _STOU8(N1->getText(), N1->getLine());\r
+                                                         if (IntDecStyle) {\r
+                                                           if (Negative) {\r
+                                                             if ($Value.u8 > 0x80) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+                                                             }\r
+                                                           } else {\r
+                                                             if ($Value.u8 > 0x7F) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT8 type can't big than 0x7F, small than -0x80");\r
+                                                             }\r
+                                                           }\r
+                                                         }\r
+                                                         if (Negative) {\r
+                                                           $Value.u8 = ~$Value.u8 + 1;\r
+                                                         }\r
                                                        break;\r
                                                        case EFI_IFR_TYPE_NUM_SIZE_16 :\r
-                                                         $Value.u16    = _STOU16(N1->getText(), N1->getLine());\r
+                                                         $Value.u16 = _STOU16(N1->getText(), N1->getLine());\r
+                                                         if (IntDecStyle) {\r
+                                                           if (Negative) {\r
+                                                             if ($Value.u16 > 0x8000) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+                                                             }\r
+                                                           } else {\r
+                                                             if ($Value.u16 > 0x7FFF) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT16 type can't big than 0x7FFF, small than -0x8000");\r
+                                                             }\r
+                                                           }\r
+                                                         }\r
+                                                         if (Negative) {\r
+                                                           $Value.u16 = ~$Value.u16 + 1;\r
+                                                         }\r
                                                        break;\r
                                                        case EFI_IFR_TYPE_NUM_SIZE_32 :\r
                                                          $Value.u32    = _STOU32(N1->getText(), N1->getLine());\r
+                                                         if (IntDecStyle) {\r
+                                                           if (Negative) {\r
+                                                             if ($Value.u32 > 0x80000000) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+                                                             }\r
+                                                           } else {\r
+                                                             if ($Value.u32 > 0X7FFFFFFF) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT32 type can't big than 0x7FFFFFFF, small than -0x80000000");\r
+                                                             }\r
+                                                           }\r
+                                                         }\r
+                                                         if (Negative) {\r
+                                                           $Value.u32 = ~$Value.u32 + 1;\r
+                                                         }\r
                                                        break;\r
                                                        case EFI_IFR_TYPE_NUM_SIZE_64 :\r
                                                          $Value.u64    = _STOU64(N1->getText(), N1->getLine());\r
+                                                         if (IntDecStyle) {\r
+                                                           if (Negative) {\r
+                                                             if ($Value.u64 > 0x8000000000000000) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+                                                             }\r
+                                                           } else {\r
+                                                             if ($Value.u64 > 0x7FFFFFFFFFFFFFFF) {\r
+                                                               _PCATCH (VFR_RETURN_INVALID_PARAMETER, N1->getLine(), "INT64 type can't big than 0x7FFFFFFFFFFFFFFF, small than -0x8000000000000000");\r
+                                                             }\r
+                                                           }\r
+                                                         }\r
+                                                         if (Negative) {\r
+                                                           $Value.u64 = ~$Value.u64 + 1;\r
+                                                         }\r
                                                        break;\r
                                                        case EFI_IFR_TYPE_BOOLEAN :\r
                                                          $Value.b      = _STOU8(N1->getText(), N1->getLine());\r
@@ -1434,6 +1508,49 @@ vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :
   | QI:Number";" FI:Number";" guidDefinition[Guid] ";" "STRING_TOKEN" "\(" DP:Number "\)" \r
                                                     << $Value.ref    = _STOR(QI->getText(), FI->getText(), &Guid, DP->getText(), QI->getLine()); >>\r
   | "STRING_TOKEN" "\(" S1:Number "\)"              << $Value.string = _STOSID(S1->getText(), S1->getLine()); >>\r
+  | "\{"                                            << ListType = TRUE; >>\r
+      L1:Number                                     << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L1->getText(), L1->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      (\r
+        "," \r
+        L2:Number                                   << \r
+                                                       switch (Type) {\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                           Type8[Index]  = _STOU8(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                           Type16[Index] = _STOU16(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                           Type32[Index] = _STOU32(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                           Type64[Index] = _STOU64(L2->getText(), L2->getLine());\r
+                                                         break;\r
+                                                         default:\r
+                                                         break;\r
+                                                       }\r
+                                                       Index++;\r
+                                                    >>\r
+      )*\r
+    "\}"                                           \r
   ;\r
 \r
 //*****************************************************************************\r
@@ -1458,7 +1575,8 @@ vfrFormDefinition :
     // Just for framework vfr compatibility\r
     vfrStatementInvalid                      |\r
     vfrStatementExtension                    |\r
-    vfrStatementModal\r
+    vfrStatementModal                        |\r
+    vfrStatementRefreshEvent ";"\r
   )*\r
   E:EndForm                                         <<\r
                                                       if (mCompatibleMode) {\r
@@ -1504,7 +1622,8 @@ vfrFormMapDefinition :
     vfrStatementLabel                        |\r
     vfrStatementBanner                       |\r
     vfrStatementExtension                    |\r
-    vfrStatementModal\r
+    vfrStatementModal                        |\r
+    vfrStatementRefreshEvent ";"\r
   )*\r
   E:EndForm                                         << CRT_END_OP (E); >>\r
   ";"\r
@@ -1525,7 +1644,8 @@ vfrStatementRules :
 vfrStatementDefault :\r
   <<\r
      BOOLEAN               IsExp         = FALSE;\r
-     EFI_IFR_TYPE_VALUE    Val           = gZeroEfiIfrTypeValue;\r
+     UINT64                ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE    *Val           = (EFI_IFR_TYPE_VALUE *) ValueList;\r
      CIfrDefault           *DObj         = NULL;\r
      CIfrDefault2          *DObj2        = NULL;\r
      EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
@@ -1533,29 +1653,103 @@ vfrStatementDefault :
      EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
      UINT32                Size          = 0;\r
      EFI_GUID              *VarGuid      = NULL;\r
+     BOOLEAN               ArrayType     = FALSE;\r
+     UINT8                 *Type8        = (UINT8  *) ValueList;\r
+     UINT16                *Type16       = (UINT16 *) ValueList;\r
+     UINT32                *Type32       = (UINT32 *) ValueList;\r
+     UINT64                *Type64       = (UINT64 *) ValueList;\r
+     CIfrNumeric           *NumericQst   = NULL;\r
+\r
   >>\r
   D:Default                                         \r
   (\r
     (\r
-      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  \r
+      "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","  \r
                                                     << \r
                                                         if (gCurrentMinMaxData != NULL && gCurrentMinMaxData->IsNumericOpcode()) {\r
                                                           //check default value is valid for Numeric Opcode\r
-                                                          if (Val.u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val.u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
-                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                          NumericQst = (CIfrNumeric *) gCurrentQuestion;\r
+                                                          if ((NumericQst->GetNumericFlags() & EFI_IFR_DISPLAY) == 0) {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8:\r
+                                                              if (((INT8) Val->u8 < (INT8) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+                                                                  ((INT8) Val->u8 > (INT8) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16:\r
+                                                              if (((INT16) Val->u16 < (INT16) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+                                                                  ((INT16) Val->u16 > (INT16) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32:\r
+                                                              if (((INT32) Val->u32 < (INT32) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+                                                                  ((INT32) Val->u32 > (INT32) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64:\r
+                                                              if (((INT64) Val->u64 < (INT64) gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE())) || \r
+                                                                  ((INT64) Val->u64 > (INT64) gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE()))) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                              }\r
+                                                              break;\r
+                                                            default:\r
+                                                              break;\r
+                                                            }\r
+                                                          } else {\r
+                                                            if (Val->u64 < gCurrentMinMaxData->GetMinData(_GET_CURRQEST_DATATYPE()) || Val->u64 > gCurrentMinMaxData->GetMaxData(_GET_CURRQEST_DATATYPE())) {\r
+                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, D->getLine(), "Numeric default value must be between MinValue and MaxValue.");\r
+                                                            }\r
                                                           }\r
                                                         }\r
                                                         if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
                                                           _PCATCH (VFR_RETURN_FATAL_ERROR, D->getLine(), "Default data type error.");\r
                                                           Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                        } else if (ArrayType) {\r
+                                                          switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                              while (Type8[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              break;\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                              while (Type16[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT16);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                              while (Type32[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT32);\r
+                                                              break;\r
+\r
+                                                            case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                              while (Type64[Size] != 0) {\r
+                                                                Size++;\r
+                                                              }\r
+                                                              Size *= sizeof (UINT64);\r
+                                                              break;\r
+\r
+                                                            default:\r
+                                                              break;\r
+                                                          }\r
                                                         } else {\r
                                                           _PCATCH (gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size), D->getLine());\r
                                                         }\r
                                                         Size += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
                                                         DObj = new CIfrDefault ((UINT8)Size);\r
                                                         DObj->SetLineNo(D->getLine());\r
-                                                        DObj->SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                        DObj->SetValue(Val);\r
+                                                        if (ArrayType) {\r
+                                                          DObj->SetType (EFI_IFR_TYPE_BUFFER);\r
+                                                        } else {\r
+                                                          DObj->SetType (_GET_CURRQEST_DATATYPE());\r
+                                                        }\r
+                                                        DObj->SetValue(*Val);\r
                                                     >>\r
       |                                             << IsExp = TRUE; DObj2 = new CIfrDefault2; DObj2->SetLineNo(D->getLine()); DObj2->SetScope (1); >>\r
         vfrStatementValue ","                       << CIfrEnd EndObj1; EndObj1.SetLineNo(D->getLine()); >>\r
@@ -1585,9 +1779,9 @@ vfrStatementDefault :
                                                                    VarStoreName,\r
                                                                    VarGuid,\r
                                                                    _GET_CURRQEST_DATATYPE (),\r
-                                                                     Val),\r
-                                                                     D->getLine()\r
-                                                                     );\r
+                                                                   *Val),\r
+                                                                   D->getLine()\r
+                                                                   );\r
                                                          }\r
                                                        }\r
                                                        if (DObj  != NULL) {delete DObj;} \r
@@ -1650,6 +1844,7 @@ flagsField :
   | ManufacturingFlag \r
   | DefaultFlag \r
   | ResetRequiredFlag \r
+  | ReconnectRequiredFlag\r
   | N:NVAccessFlag                                     << \r
                                                           if (!mCompatibleMode) {\r
                                                             gCVfrErrorHandle.HandleWarning (\r
@@ -2220,41 +2415,205 @@ vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :
      UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
      UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
      UINT8  MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
+     BOOLEAN IntDecStyle = FALSE;\r
+     CIfrNumeric *NObj = (CIfrNumeric *) (&MMSDObj);\r
+     if ((NObj->GetOpCode() == EFI_IFR_NUMERIC_OP) && ((NObj->GetNumericFlags() & EFI_IFR_DISPLAY) == 0)) {\r
+       IntDecStyle = TRUE;\r
+     }\r
+     BOOLEAN MinNegative = FALSE;\r
+     BOOLEAN MaxNegative = FALSE;\r
   >>\r
-  Minimum   "=" I:Number ","\r
-                                                       <<\r
+  Minimum   "=" \r
+  {\r
+    "\-"                                               << MinNegative = TRUE; >>\r
+  }\r
+  I:Number ","                                         <<\r
+                                                          if (!IntDecStyle &&  MinNegative) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
+                                                          }\r
                                                           switch (_GET_CURRQEST_DATATYPE()) {\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText(), I->getLine()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText(), I->getLine()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText(), I->getLine()); break;\r
-                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MinU1 = _STOU8(I->getText(), I->getLine());  break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                            MinU8 = _STOU64(I->getText(), I->getLine());\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MinNegative) { \r
+                                                                if (MinU8 > 0x8000000000000000) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MinU8 > 0x7FFFFFFFFFFFFFFF) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT64 type minimum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MinNegative) {\r
+                                                              MinU8 = ~MinU8 + 1;\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                            MinU4 = _STOU32(I->getText(), I->getLine());\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MinNegative) { \r
+                                                                if (MinU4 > 0x80000000) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MinU4 > 0x7FFFFFFF) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT32 type minimum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MinNegative) {\r
+                                                              MinU4 = ~MinU4 + 1;\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                            MinU2 = _STOU16(I->getText(), I->getLine());\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MinNegative) { \r
+                                                                if (MinU2 > 0x8000) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MinU2 > 0x7FFF) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT16 type minimum can't small than -0x8000, big than 0x7FFF");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MinNegative) {\r
+                                                              MinU2 = ~MinU2 + 1;\r
+                                                            }\r
+                                                            break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                            MinU1 = _STOU8(I->getText(), I->getLine());\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MinNegative) { \r
+                                                                if (MinU1 > 0x80) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MinU1 > 0x7F) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, I->getLine(), "INT8 type minimum can't small than -0x80, big than 0x7F");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MinNegative) {\r
+                                                              MinU1 = ~MinU1 + 1;\r
+                                                            }\r
+                                                            break;\r
                                                           }\r
                                                        >>\r
-  Maximum   "=" A:Number ","\r
-                                                       <<\r
+  Maximum   "=" \r
+  { \r
+    "\-"                                               << MaxNegative = TRUE; >>\r
+  }\r
+  A:Number ","                                         <<\r
+                                                          if (!IntDecStyle && MaxNegative) {\r
+                                                            _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "\"-\" can't be used when not in int decimal type. ");\r
+                                                          }\r
+\r
                                                           switch (_GET_CURRQEST_DATATYPE()) {\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_64 : \r
                                                             MaxU8 = _STOU64(A->getText(), A->getLine()); \r
-                                                            if (MaxU8 < MinU8) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MaxNegative) {\r
+                                                                if (MaxU8 > 0x8000000000000000) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU8 > 0x7FFFFFFFFFFFFFFF) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT64 type maximum can't small than -0x8000000000000000, big than 0x7FFFFFFFFFFFFFFF");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MaxNegative) {\r
+                                                              MaxU8 = ~MaxU8 + 1;\r
+                                                            }\r
+                                                            if (IntDecStyle) {\r
+                                                              if ((INT64) MaxU8 < (INT64) MinU8) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
+                                                            } else {\r
+                                                              if (MaxU8 < MinU8) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
                                                             }\r
                                                             break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_32 : \r
-                                                            MaxU4 = _STOU32(A->getText(), A->getLine()); \r
-                                                            if (MaxU4 < MinU4) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            MaxU4 = _STOU32(A->getText(), A->getLine());\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MaxNegative) {\r
+                                                                if (MaxU4 > 0x80000000) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU4 > 0x7FFFFFFF) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT32 type maximum can't small than -0x80000000, big than 0x7FFFFFFF");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MaxNegative) {\r
+                                                              MaxU4 = ~MaxU4 + 1;\r
+                                                            }\r
+                                                            if (IntDecStyle) {\r
+                                                              if ((INT32) MaxU4 < (INT32) MinU4) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
+                                                            } else {\r
+                                                              if (MaxU4 < MinU4) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
                                                             }\r
                                                             break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_16 : \r
                                                             MaxU2 = _STOU16(A->getText(), A->getLine()); \r
-                                                            if (MaxU2 < MinU2) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MaxNegative) {\r
+                                                                if (MaxU2 > 0x8000) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU2 > 0x7FFF) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT16 type maximum can't small than -0x8000, big than 0x7FFF");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MaxNegative) {\r
+                                                              MaxU2 = ~MaxU2 + 1;\r
+                                                            }\r
+                                                            if (IntDecStyle) {\r
+                                                              if ((INT16) MaxU2 < (INT16) MinU2) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
+                                                            } else {\r
+                                                              if (MaxU2 < MinU2) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
                                                             }\r
                                                             break;\r
                                                           case EFI_IFR_TYPE_NUM_SIZE_8 :  \r
-                                                            MaxU1 = _STOU8(A->getText(), A->getLine());  \r
-                                                            if (MaxU1 < MinU1) {\r
-                                                              _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                            MaxU1 = _STOU8(A->getText(), A->getLine());\r
+                                                            if (IntDecStyle) {\r
+                                                              if (MaxNegative) {\r
+                                                                if (MaxU1 > 0x80) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+                                                                }\r
+                                                              } else {\r
+                                                                if (MaxU1 > 0x7F) {\r
+                                                                  _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "INT8 type maximum can't small than -0x80, big than 0x7F");\r
+                                                                }\r
+                                                              }\r
+                                                            }\r
+                                                            if (MaxNegative) {\r
+                                                              MaxU1 = ~MaxU1 + 1;\r
+                                                            }\r
+                                                            if (IntDecStyle) {\r
+                                                              if ((INT8) MaxU1 < (INT8) MinU1) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
+                                                            } else {\r
+                                                              if (MaxU1 < MinU1) {\r
+                                                                _PCATCH (VFR_RETURN_INVALID_PARAMETER, A->getLine(), "Maximum can't be less than Minimum");\r
+                                                              }\r
                                                             }\r
                                                             break;\r
                                                           }\r
@@ -2563,7 +2922,7 @@ vfrStatementOrderedList :
      CIfrOrderedList OLObj;\r
      UINT32 VarArraySize;\r
   >>\r
-  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
+  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); gIsOrderedList = TRUE;>>\r
   vfrQuestionHeader[OLObj] ","\r
                                                        << \r
                                                           VarArraySize = _GET_CURRQEST_ARRAY_SIZE();\r
@@ -2581,7 +2940,7 @@ vfrStatementOrderedList :
   }\r
   { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] {","}}\r
   vfrStatementQuestionOptionList\r
-  E:EndList                                            << CRT_END_OP (E); >>\r
+  E:EndList                                            << CRT_END_OP (E); gIsOrderedList = FALSE;>>\r
   ";"\r
   ;\r
 \r
@@ -2710,7 +3069,7 @@ vfrStatementQuestionTag :
   vfrStatementRefresh           |\r
   vfrStatementVarstoreDevice    |\r
   vfrStatementExtension         |\r
-  vfrStatementRefreshEvent      |\r
+  vfrStatementRefreshEvent ","  |\r
   vfrStatementWarningIf\r
   ;\r
 \r
@@ -2940,7 +3299,7 @@ vfrStatementRefreshEvent :
     EFI_GUID      Guid;\r
   >>\r
   L:RefreshGuid                                        << RiObj.SetLineNo(L->getLine()); >>\r
-  "="  guidDefinition[Guid] ","                        << RiObj.SetRefreshEventGroutId (&Guid);  >>\r
+  "="  guidDefinition[Guid]                            << RiObj.SetRefreshEventGroutId (&Guid);  >>\r
   ;\r
 \r
 vfrStatementVarstoreDevice :\r
@@ -2973,64 +3332,117 @@ vfrStatementOptions :
 \r
 vfrStatementOneOfOption :\r
   <<\r
-     EFI_IFR_TYPE_VALUE Val           = gZeroEfiIfrTypeValue;\r
+     UINT8              ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     EFI_IFR_TYPE_VALUE *Val          = (EFI_IFR_TYPE_VALUE *) ValueList;\r
      CHAR8              *VarStoreName = NULL;\r
      UINT32             Size          = 0;\r
      BOOLEAN            TypeError     = FALSE;\r
      EFI_VFR_RETURN_CODE ReturnCode   = VFR_RETURN_SUCCESS;\r
      EFI_GUID           *VarStoreGuid = NULL;\r
-     \r
-     if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
-       TypeError = TRUE;\r
-       Size = sizeof (EFI_IFR_TYPE_VALUE);\r
-     } else {\r
-       ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
-     }\r
-\r
-     Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
-     CIfrOneOfOption    OOOObj ((UINT8)Size);\r
+     BOOLEAN            ArrayType     = FALSE;\r
+     CIfrOneOfOption    *OOOObj;\r
+     UINT8              *Type8        = (UINT8  *) ValueList;\r
+     UINT16             *Type16       = (UINT16 *) ValueList;\r
+     UINT32             *Type32       = (UINT32 *) ValueList;\r
+     UINT64             *Type64       = (UINT64 *) ValueList;\r
   >>\r
   L:Option                                             <<      \r
-                                                          OOOObj.SetLineNo(L->getLine());\r
-                                                          if (TypeError) {\r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
                                                             _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Get data type error.");\r
                                                           }\r
-                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
-                                                            _PCATCH (ReturnCode, L->getLine());\r
-                                                          }\r
+\r
                                                        >>\r
-  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText(), S->getLine())); >>\r
-  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    \r
+  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      \r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE(), *Val, ArrayType] ","\r
                                                        << \r
                                                           if (gCurrentMinMaxData != NULL) {\r
                                                             //set min/max value for oneof opcode\r
                                                             UINT64 Step = gCurrentMinMaxData->GetStepData(_GET_CURRQEST_DATATYPE());\r
                                                             switch (_GET_CURRQEST_DATATYPE()) {\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_64:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u64, Val.u64, Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u64, Val->u64, Step);\r
                                                               break;\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_32:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u32, Val.u32, (UINT32) Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u32, Val->u32, (UINT32) Step);\r
                                                               break;\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_16:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u16, Val.u16, (UINT16) Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u16, Val->u16, (UINT16) Step);\r
                                                               break;\r
                                                             case EFI_IFR_TYPE_NUM_SIZE_8:\r
-                                                              gCurrentMinMaxData->SetMinMaxStepData(Val.u8, Val.u8, (UINT8) Step);\r
+                                                              gCurrentMinMaxData->SetMinMaxStepData(Val->u8, Val->u8, (UINT8) Step);\r
                                                               break;\r
                                                             default:\r
                                                               break;\r
                                                             }\r
                                                           }\r
-                                                          OOOObj.SetType (_GET_CURRQEST_DATATYPE()); \r
-                                                          OOOObj.SetValue (Val); \r
+                                                          if (_GET_CURRQEST_DATATYPE() == EFI_IFR_TYPE_OTHER) {\r
+                                                            Size = sizeof (EFI_IFR_TYPE_VALUE);\r
+                                                          } else if (ArrayType) {\r
+                                                            switch (_GET_CURRQEST_DATATYPE()) {\r
+                                                                 case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                               while (Type8[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                               while (Type16[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT16);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                               while (Type32[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT32);\r
+                                                               break;\r
+                                                             case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                               while (Type64[Size] != 0) {\r
+                                                                 Size++;\r
+                                                               }\r
+                                                               Size *= sizeof (UINT64);\r
+                                                               break;\r
+                                                             default:\r
+                                                               break;\r
+                                                            }\r
+                                                          } else {\r
+                                                            ReturnCode = gCVfrVarDataTypeDB.GetDataTypeSize (_GET_CURRQEST_DATATYPE(), &Size);\r
+                                                          }\r
+                                                          if (ReturnCode != VFR_RETURN_SUCCESS) {\r
+                                                            _PCATCH (ReturnCode, L->getLine());\r
+                                                          }\r
+\r
+                                                          Size += OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+                                                          OOOObj = new CIfrOneOfOption((UINT8)Size);\r
+                                                          OOOObj->SetLineNo(L->getLine());\r
+                                                          OOOObj->SetOption (_STOSID(S->getText(), S->getLine())); \r
+                                                          if (ArrayType) {\r
+                                                            OOOObj->SetType (EFI_IFR_TYPE_BUFFER); \r
+                                                          } else {\r
+                                                            OOOObj->SetType (_GET_CURRQEST_DATATYPE()); \r
+                                                          }\r
+                                                          OOOObj->SetValue (*Val); \r
                                                        >>\r
-  F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+  F:FLAGS "=" vfrOneOfOptionFlags[*OOOObj, F->getLine()]\r
                                                        <<\r
+                                                          //\r
+                                                          // Array type only for default type OneOfOption.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) == 0 && ArrayType) {\r
+                                                            _PCATCH (VFR_RETURN_FATAL_ERROR, L->getLine(), "Default keyword should with array value type!");\r
+                                                          }\r
+\r
+                                                          //\r
+                                                          // Clear the default flag if the option not use array value but has default flag.\r
+                                                          //\r
+                                                          if ((OOOObj->GetFlags () & (EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG)) != 0 && !ArrayType && gIsOrderedList) {\r
+                                                            OOOObj->SetFlags(OOOObj->GetFlags () & ~(EFI_IFR_OPTION_DEFAULT | EFI_IFR_OPTION_DEFAULT_MFG));\r
+                                                          }\r
+\r
                                                           if (_GET_CURRQEST_VARTINFO().mVarStoreId != EFI_VARSTORE_ID_INVALID) {\r
                                                             _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
                                                             VarStoreGuid = mCVfrDataStorage.GetVarStoreGuid(_GET_CURRQEST_VARTINFO().mVarStoreId);\r
-                                                            if (OOOObj.GetFlags () & 0x10) {\r
+                                                            if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_STANDARD, F);\r
                                                               _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_STANDARD,\r
@@ -3038,10 +3450,10 @@ vfrStatementOneOfOption :
                                                                         VarStoreName,\r
                                                                         VarStoreGuid,\r
                                                                         _GET_CURRQEST_DATATYPE (),\r
-                                                                        Val\r
+                                                                        *Val\r
                                                                         ), L->getLine());\r
                                                             }\r
-                                                            if (OOOObj.GetFlags () & 0x20) {\r
+                                                            if (OOOObj->GetFlags () & EFI_IFR_OPTION_DEFAULT_MFG) {\r
                                                               CheckDuplicateDefaultValue (EFI_HII_DEFAULT_CLASS_MANUFACTURING, F);\r
                                                               _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
                                                                         EFI_HII_DEFAULT_CLASS_MANUFACTURING,\r
@@ -3049,7 +3461,7 @@ vfrStatementOneOfOption :
                                                                         VarStoreName,\r
                                                                         VarStoreGuid,\r
                                                                         _GET_CURRQEST_DATATYPE (),\r
-                                                                        Val\r
+                                                                        *Val\r
                                                                         ), L->getLine());\r
                                                             }\r
                                                           }\r
@@ -3064,16 +3476,16 @@ vfrStatementOneOfOption :
                                                          //\r
                                                          CIfrOptionKey IfrOptionKey (\r
                                                                          gCurrentQuestion->QUESTION_ID(),\r
-                                                                         Val,\r
+                                                                         *Val,\r
                                                                          _STOQID(KN->getText(), KN->getLine())\r
                                                                          );\r
                                                          SET_LINE_INFO (IfrOptionKey, KN);\r
                                                        >>\r
   }\r
   (\r
-    T:"," vfrImageTag                                  << OOOObj.SetScope (1); CRT_END_OP (T); >>\r
+    T:"," vfrImageTag                                  << OOOObj->SetScope (1); CRT_END_OP (T); >>\r
   )*\r
-  ";"\r
+  ";"                                                  << if (OOOObj != NULL) {delete OOOObj;} >>\r
   ;\r
 \r
 vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
@@ -3092,6 +3504,7 @@ oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :
   | "OPTION_DEFAULT_MFG"                               << $LFlags |= 0x20; >>\r
   | InteractiveFlag                                    << $HFlags |= 0x04; >>\r
   | ResetRequiredFlag                                  << $HFlags |= 0x10; >>\r
+  | ReconnectRequiredFlag                              << $HFlags |= 0x40; >>\r
   | ManufacturingFlag                                  << $LFlags |= 0x20; >>\r
   | DefaultFlag                                        << $LFlags |= 0x10; >>\r
   | A:NVAccessFlag                                     << \r
@@ -3255,6 +3668,7 @@ vfrStatementInvalidSaveRestoreDefaults :
 #token ToUpper("toupper")                       "toupper"\r
 #token ToLower("tolower")                       "tolower"\r
 #token Match("match")                           "match"\r
+#token Match2("match2")                         "match2"\r
 #token Catenate("catenate")                     "catenate"\r
 #token QuestionRefVal("questionrefval")         "questionrefval"\r
 #token StringRefVal("stringrefval")             "stringrefval"\r
@@ -3423,6 +3837,7 @@ castTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:
 atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
     vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
   | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionMatch2[$RootLevel, $ExpOpCount]\r
   | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
   | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
   | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
@@ -3453,6 +3868,20 @@ vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:
   "\)"                                                 << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
   ;\r
 \r
+vfrExpressionMatch2 [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  <<\r
+    EFI_GUID      Guid;\r
+  >>\r
+  L:Match2\r
+  "\("\r
+  vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  guidDefinition[Guid]\r
+  "\)"                                                 << { CIfrMatch2 M2Obj(L->getLine(), &Guid); $ExpOpCount++; } >>\r
+  ;\r
+\r
 vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
   "\("\r
   vfrStatementExpressionSub[$RootLevel + 1, $ExpOpCount]\r