]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g
1) Sync EdkCompatibilityPkg with EDK 1.04. The changes includes:
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / UefiVfrCompile / VfrSyntax.g
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g b/EdkCompatibilityPkg/Sample/Tools/Source/UefiVfrCompile/VfrSyntax.g
new file mode 100644 (file)
index 0000000..6029d9e
--- /dev/null
@@ -0,0 +1,3201 @@
+#header<<\r
+\r
+#include "EfiVfr.h"\r
+#include "VfrFormPkg.h"\r
+#include "VfrError.h"\r
+#include "VfrUtilityLib.h"\r
+#include "AToken.h"\r
+#include "ATokPtr.h"\r
+>>\r
+\r
+<<\r
+#include "stdio.h"\r
+#include "PBlackBox.h"\r
+#include "DLexerBase.h"\r
+#include "VfrLexer.h"    \r
+#include "AToken.h"\r
+\r
+#define GET_LINENO(Obj)       ((Obj)->getLine())\r
+#define SET_LINE_INFO(Obj, L) {(Obj).SetLineNo((L)->getLine());} while (0)\r
+#define CRT_END_OP(Obj)       {CIfrEnd EObj; EObj.SetLineNo ((Obj)->getLine());} while (0)\r
+\r
+typedef ANTLRCommonToken ANTLRToken;\r
+\r
+class CVfrDLGLexer : public VfrLexer\r
+{\r
+public:\r
+  CVfrDLGLexer (DLGFileInput *F) : VfrLexer (F) {};\r
+  INT32 errstd (char *Text) \r
+  { \r
+    printf ("unrecognized input '%s'\n", Text); \r
+  }\r
+};\r
+\r
+UINT8\r
+VfrParserStart (\r
+  IN FILE *File\r
+  )\r
+{\r
+  ParserBlackBox<CVfrDLGLexer, EfiVfrParser, ANTLRToken> VfrParser(File);\r
+  return VfrParser.parser()->vfrProgram();\r
+}\r
+>>\r
+\r
+#lexaction\r
+<<\r
+#include <Error.h>\r
+\r
+>>\r
+\r
+//\r
+// Define a lexical class for parsing quoted strings. Basically\r
+// starts with a double quote, and ends with a double quote that\r
+// is not preceeded with a backslash.\r
+//\r
+#lexclass QUOTED_STRING\r
+#token TheString            "~[\"]*\"" << mode (START); >>     \r
+\r
+//\r
+// Define a lexclass for skipping over C++ style comments\r
+//\r
+#lexclass CPP_COMMENT\r
+#token "~[\n]*"       << skip (); >>\r
+#token "\n"           << skip (); mode (START); newline (); >>\r
+\r
+//\r
+// Standard lexclass is START\r
+//\r
+#lexclass START\r
+\r
+//\r
+// Find start of C++ style comments\r
+//\r
+#token "//"       << skip (); mode (CPP_COMMENT); >>\r
+\r
+//\r
+// Skip whitespace\r
+//\r
+#token "[\ \t]"   << skip (); >> \r
+\r
+//\r
+// Skip over newlines, but count them\r
+//\r
+#token "\n"       << skip (); newline (); >>\r
+\r
+//\r
+// Skip over 'extern' in any included .H file\r
+//\r
+#token "extern"   << skip (); mode (CPP_COMMENT); >>\r
+\r
+//\r
+// Tokens for the different keywords. Syntax is:\r
+// TokenName("ErrorMessageText")    "TokenString"\r
+//   where:\r
+//     TokenName is the token name (must be capitalized) that is used in the rules\r
+//     ErrorMessageText is the string the compiler emits when it detects a syntax error\r
+//     TokenString is the actual matching string used in the user script\r
+//\r
+#token FormPkgType("formpkgtype")               "formpkgtype"\r
+#token OpenBrace("{")                           "\{"\r
+#token CloseBrace("}")                          "\}"\r
+#token OpenParen("(")                           "\("\r
+#token CloseParen(")")                          "\)"\r
+#token OpenBracket("[")                         "\["\r
+#token CloseBracket("]")                        "\]"\r
+\r
+#token LineDefinition                           "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << gCVfrErrorHandle.ParseFileScopeRecord (begexpr (), line ()); skip (); newline (); >>\r
+#token DevicePath("devicepath")                 "devicepath"\r
+#token FormSet("formset")                       "formset"\r
+#token FormSetId("formsetid")                   "formsetid"\r
+#token EndFormSet("endformset")                 "endformset"\r
+#token Title("title")                           "title"\r
+#token FormId("formid")                         "formid"\r
+#token OneOf("oneof")                           "oneof"\r
+#token EndoneOf("endoneof")                     "endoneof"\r
+#token Prompt("prompt")                         "prompt"\r
+#token OrderedList("orderedlist")               "orderedlist"\r
+#token MaxContainers("maxcontainers")           "maxcontainers"\r
+#token EndList("endlist")                       "endlist"\r
+#token EndForm("endform")                       "endform"\r
+#token EndOneOf("endoneof")                     "endoneof"\r
+#token Form("form")                             "form"\r
+#token Subtitle("subtitle")                     "subtitle"\r
+#token Help("help")                             "help"\r
+#token Text("text")                             "text"\r
+#token Option("option")                         "option"\r
+#token FLAGS("flags")                           "flags"\r
+#token Date("date")                             "date"\r
+#token EndDate("enddate")                       "enddate"\r
+#token Year("year")                             "year"\r
+#token Month("month")                           "month"\r
+#token Day("day")                               "day"\r
+#token Time("time")                             "time"\r
+#token EndTime("endtime")                       "endtime"\r
+#token Hour("hour")                             "hour"\r
+#token Minute("minute")                         "minute"\r
+#token Second("second")                         "second"\r
+#token GrayOutIf("grayoutif")                   "grayoutif"\r
+#token Label("label")                           "label"\r
+#token Timeout("timeout")                       "timeout"\r
+#token Inventory("inventory")                   "inventory"\r
+#token NonNvDataMap("_NON_NV_DATA_MAP")         "_NON_NV_DATA_MAP"\r
+#token Struct("struct")                         "struct"\r
+#token Uint64("UINT64")                         "UINT64"\r
+#token Uint32("UINT32")                         "UINT32"\r
+#token Uint16("UINT16")                         "UINT16"\r
+#token Char16("CHAR16")                         "CHAR16"\r
+#token Uint8("UINT8")                           "UINT8"\r
+#token GUID("guid")                             "guid"\r
+#token CheckBox("checkbox")                     "checkbox"\r
+#token EndCheckBox("endcheckbox")               "endcheckbox"\r
+#token Numeric("numeric")                       "numeric"\r
+#token EndNumeric("endnumeric")                 "endnumeric"            \r
+#token Minimum("minimum")                       "minimum"         \r
+#token Maximum("maximum")                       "maximum"         \r
+#token STEP("step")                             "step"      \r
+#token Default("default")                       "default"         \r
+#token Password("password")                     "password"          \r
+#token EndPassword("endpassword")               "endpassword"             \r
+#token String("string")                         "string"\r
+#token EndString("endstring")                   "endstring"           \r
+#token MinSize("minsize")                       "minsize"         \r
+#token MaxSize("maxsize")                       "maxsize"         \r
+#token Encoding("encoding")                     "encoding"\r
+#token SuppressIf("suppressif")                 "suppressif"\r
+#token DisableIf("disableif")                   "disableif"\r
+#token Hidden("hidden")                         "hidden"\r
+#token Goto("goto")                             "goto"\r
+#token FormSetGuid("formsetguid")               "formsetguid"\r
+#token InconsistentIf("inconsistentif")         "inconsistentif"\r
+#token NoSubmitIf("nosubmitif")                 "nosubmitif"\r
+#token EndIf("endif")                           "endif"\r
+#token Key("key")                               "key"\r
+#token DefaultFlag("DEFAULT")                   "DEFAULT"\r
+#token ManufacturingFlag("MANUFACTURING")       "MANUFACTURING"\r
+#token InteractiveFlag("INTERACTIVE")           "INTERACTIVE"\r
+#token NVAccessFlag("NV_ACCESS")                "NV_ACCESS"\r
+#token ResetRequiredFlag("RESET_REQUIRED")      "RESET_REQUIRED"\r
+#token LateCheckFlag("LATE_CHECK")              "LATE_CHECK"\r
+#token ReadOnlyFlag("READ_ONLY")                "READ_ONLY"\r
+#token CallBackFlag("INTERACTIVE")              "INTERACTIVE"\r
+#token OptionOnlyFlag("OPTIONS_ONLY")           "OPTIONS_ONLY"\r
+#token Class("class")                           "class"\r
+#token Subclass("subclass")                     "subclass"\r
+#token TypeDef("typedef")                       "typedef"\r
+#token Restore("restore")                       "restore"\r
+#token Save("save")                             "save"\r
+#token Defaults("defaults")                     "defaults"\r
+#token Banner("banner")                         "banner"\r
+#token Align("align")                           "align"\r
+#token Left("left")                             "left"\r
+#token Right("right")                           "right"\r
+#token Center("center")                         "center"\r
+#token Line("line")                             "line"\r
+#token Name("name")                             "name"\r
+\r
+#token VarId("varid")                           "varid"\r
+#token Question("question")                     "question"\r
+#token QuestionId("questionid")                 "questionid"\r
+#token Image("image")                           "image"\r
+#token Locked("locked")                         "locked"\r
+#token Rule("rule")                             "rule"\r
+#token EndRule("endrule")                       "endrule"\r
+#token Value("value")                           "value"\r
+#token ResetButton("resetbutton")               "resetbutton"\r
+#token EndResetButton("endresetbutton")         "endresetbutton"\r
+#token DefaultStore("defaultstore")             "defaultstore"\r
+#token Attribute("attribute")                   "attribute"\r
+#token Varstore("varstore")                     "varstore"\r
+#token Efivarstore("efivarstore")               "efivarstore"\r
+#token VarSize("varsize")                       "varsize"\r
+#token NameValueVarStore("namevaluevarstore")   "namevaluevarstore"\r
+#token Action("action")                         "action"\r
+#token Config("config")                         "config"\r
+#token EndAction("endaction")                   "endaction"\r
+#token Refresh("refresh")                       "refresh"\r
+#token Interval("interval")                     "interval"\r
+#token VarstoreDevice("varstoredevice")         "varstoredevice"\r
+//\r
+// Define the class and subclass tokens\r
+//\r
+#token ClassNonDevice("NONDEVICE")                        "NON_DEVICE"\r
+#token ClassDiskDevice("DISK_DEVICE")                     "DISK_DEVICE"\r
+#token ClassVideoDevice("VIDEO_DEVICE")                   "VIDEO_DEVICE"\r
+#token ClassNetworkDevice("NETWORK_DEVICE")               "NETWORK_DEVICE"\r
+#token ClassInputDevice("INPUT_DEVICE")                   "INPUT_DEVICE"\r
+#token ClassOnBoardDevice("ONBOARD_DEVICE")               "ONBOARD_DEVICE"\r
+#token ClassOtherDevice("OTHER_DEVICE")                   "OTHER_DEVICE"\r
+\r
+#token SubclassSetupApplication("SETUP_APPLICATION")      "SETUP_APPLICATION"\r
+#token SubclassGeneralApplication("GENERAL_APPLICATION")  "GENERAL_APPLICATION"\r
+#token SubclassFrontPage("FRONT_PAGE")                    "FRONT_PAGE"\r
+#token SubclassSingleUse("SINGLE_USE")                    "SINGLE_USE"\r
+\r
+//\r
+// This is the overall definition of a VFR form definition script.\r
+//\r
+\r
+vfrProgram > [UINT8 Return] :\r
+  << mParserStatus = 0; >>\r
+  (\r
+    (\r
+         "\#pragma" "pack" "\(" A:Number "\)"          << _PCATCH(mCVfrVarDataTypeDB.Pack (_STOU32(A->getText())), A); >>\r
+      vfrDataStructDefinition\r
+         "\#pragma" "pack" "\(" "\)"                   << mCVfrVarDataTypeDB.UnPack (); >>\r
+    )\r
+    |\r
+    (\r
+      vfrDataStructDefinition\r
+    )\r
+  )*\r
+  vfrFromSetDefinition\r
+  << $Return = mParserStatus; >>\r
+  ;\r
+\r
+//*****************************************************************************\r
+//\r
+// the syntax of data struct definition\r
+//\r
+vfrDataStructDefinition :\r
+  { TypeDef } Struct                                << mCVfrVarDataTypeDB.DeclareDataTypeBegin (); >>\r
+  { NonNVDataMap }\r
+  {\r
+    N1:StringIdentifier                             << _PCATCH(mCVfrVarDataTypeDB.SetNewTypeName (N1->getText()), N1); >>\r
+  }\r
+  OpenBrace \r
+    vfrDataStructFields\r
+  CloseBrace \r
+  { \r
+    N2:StringIdentifier                             << _PCATCH(mCVfrVarDataTypeDB.SetNewTypeName (N2->getText()), N2); >>\r
+  }\r
+  ";"                                               << mCVfrVarDataTypeDB.DeclareDataTypeEnd (); >>\r
+  ;\r
+\r
+vfrDataStructFields :\r
+  (\r
+     dataStructField64     | \r
+        dataStructField32     | \r
+        dataStructField16     | \r
+        dataStructField8      | \r
+     dataStructFieldBool   |\r
+        dataStructFieldString |\r
+        dataStructFieldDate   | \r
+        dataStructFieldTime   |\r
+     dataStructFieldUser\r
+  )*\r
+  ;\r
+\r
+dataStructField64 :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "UINT64" \r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT64", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructField32 :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "UINT32" \r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT32", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructField16 :\r
+  << UINT32 ArrayNum = 0; >>\r
+  ("UINT16" | "CHAR16")\r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT16", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructField8 :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "UINT8"\r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "UINT8", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructFieldBool :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "BOOLEAN"\r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "BOOLEAN", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructFieldString :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "EFI_STRING_ID"\r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_STRING_ID", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructFieldDate :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "EFI_HII_DATE" \r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_DATE", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructFieldTime :\r
+  << UINT32 ArrayNum = 0; >>\r
+  "EFI_HII_TIME" \r
+  N:StringIdentifier \r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), "EFI_HII_TIME", ArrayNum), N); >>\r
+  ;\r
+\r
+dataStructFieldUser :\r
+  << UINT32 ArrayNum = 0; >>\r
+  T:StringIdentifier\r
+  N:StringIdentifier\r
+  {\r
+    OpenBracket I:Number CloseBracket               << ArrayNum = _STOU32(I->getText()); >>\r
+  }\r
+  ";"                                               << _PCATCH(mCVfrVarDataTypeDB.DataTypeAddField (N->getText(), T->getText(), ArrayNum), T); >>\r
+  ;\r
+\r
+//*****************************************************************************\r
+//\r
+// the syntax of from set definition\r
+//\r
+vfrFromSetDefinition :\r
+  <<\r
+     EFI_GUID    Guid;\r
+     CIfrFormSet FSObj;\r
+     UINT16      C, SC;\r
+  >>\r
+  L:FormSet                                         << SET_LINE_INFO (FSObj, L); >>\r
+  GUID "=" \r
+  OpenBrace\r
+    G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number "," \r
+    G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
+  CloseBrace\r
+                                                    << \r
+                                                       _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (), \r
+                                                                       G4->getText (), G5->getText (), G6->getText (), \r
+                                                                       G7->getText (), G8->getText (), G9->getText (), \r
+                                                                       G10->getText (), G11->getText ()); \r
+                                                       FSObj.SetGuid (&Guid);\r
+                                                    >>\r
+  ","\r
+  Title "=" "STRING_TOKEN" "\(" S1:Number "\)" ","  << FSObj.SetFormSetTitle (_STOSID(S1->getText())); >>\r
+  Help  "=" "STRING_TOKEN" "\(" S2:Number "\)" ","  << FSObj.SetHelp (_STOSID(S2->getText())); >>\r
+  {\r
+    Class "=" classDefinition[C] ","                << {CIfrClass CObj; CObj.SetClass(C);} >>\r
+  }\r
+  {\r
+    Subclass "=" subclassDefinition[SC] ","         << {CIfrSubClass SCObj; SCObj.SetSubClass(SC);} >>\r
+  }\r
+                                                    <<\r
+                                                       _DeclareStandardDefaultStorage (GET_LINENO (L));\r
+                                                       //_DeclareDefaultLinearVarStore (GET_LINENO (L));\r
+                                                    >>\r
+  vfrFormSetList\r
+  E:EndFormSet                                      << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrFormSetList :\r
+  (\r
+    vfrFormDefinition             |\r
+    vfrStatementImage             |\r
+    vfrStatementVarStoreLinear    |\r
+    vfrStatementVarStoreEfi       |\r
+    vfrStatementVarStoreNameValue |\r
+    vfrStatementDefaultStore      |\r
+    vfrStatementDisableIfFromSet\r
+  )*\r
+  ;\r
+\r
+vfrStatementDefaultStore :\r
+  << UINT16  DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD; >>\r
+  D:DefaultStore N:StringIdentifier ","\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)"\r
+  {\r
+    "," Attribute "=" A:Number                      << DefaultId = _STOU16(A->getText()); >>\r
+  }\r
+                                                    << \r
+                                                       if (mCVfrDefaultStore.DefaultIdRegistered (DefaultId) == FALSE) {\r
+                                                         CIfrDefaultStore DSObj;\r
+                                                         _PCATCH(mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), N->getText(), _STOSID(S->getText()), DefaultId)), D->getLine();\r
+                                                                                                                DSObj.SetLineNo(D->getLine());\r
+                                                         DSObj.SetDefaultName (_STOSID(S->getText()));\r
+                                                         DSObj.SetDefaultId (DefaultId);\r
+                                                                                                          } else {\r
+                                                         _PCATCH(mCVfrDefaultStore.ReRegisterDefaultStoreById (DefaultId, N->getText(), _STOSID(S->getText()))), D->getLine();\r
+                                                                                                          }\r
+                                                    >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementVarStoreLinear :\r
+  <<\r
+     EFI_GUID        Guid; \r
+     CIfrVarStore    VSObj;\r
+     INT8            *TypeName;\r
+        UINT32          LineNum;\r
+     EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID;\r
+     UINT32          Size;\r
+  >>\r
+  V:Varstore                                        << VSObj.SetLineNo(V->getLine()); >>\r
+  (\r
+      TN:StringIdentifier ","                       << TypeName = TN->getText(); LineNum = TN->getLine(); >>\r
+       | U8:"UINT8" ","                                << TypeName = "UINT8"; LineNum = U8->getLine(); >>\r
+       | U16:"UINT16" ","                              << TypeName = "UINT16"; LineNum = U16->getLine(); >>\r
+       | U32:"UINT32" ","                              << TypeName = "UINT32"; LineNum = U32->getLine(); >>\r
+       | U64:"UINT64" ","                              << TypeName = "UINT64"; LineNum = U64->getLine(); >>\r
+       | D:"EFI_HII_DATE" ","                          << TypeName = "EFI_HII_DATE"; LineNum = D->getLine(); >>\r
+       | T:"EFI_HII_TIME" ","                          << TypeName = "EFI_HII_TIME"; LineNum = T->getLine(); >>\r
+  )\r
+  { Key "=" Number "," }                            // Key is used to assign Varid in Framework VFR but no use in UEFI2.1 VFR\r
+  {\r
+    VarId "=" ID:Number ","                         << VarStoreId = _STOU16(ID->getText()); >>\r
+  }\r
+  Name "=" SN:StringIdentifier ","\r
+  GUID "="\r
+  OpenBrace\r
+    G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number "," \r
+    G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
+  CloseBrace\r
+                                                    << \r
+                                                       _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (), \r
+                                                                       G4->getText (), G5->getText (), G6->getText (), \r
+                                                                       G7->getText (), G8->getText (), G9->getText (), \r
+                                                                       G10->getText (), G11->getText ()); \r
+                                                    >>\r
+                                                    <<\r
+                                                       _PCATCH(mCVfrDataStorage.DeclareBufferVarStore (\r
+                                                                                  SN->getText(), \r
+                                                                                  &Guid, \r
+                                                                                  &mCVfrVarDataTypeDB, \r
+                                                                                  TypeName,\r
+                                                                                                                                                                 VarStoreId\r
+                                                                                  ), LineNum);\r
+                                                    >>\r
+                                                    << \r
+                                                       VSObj.SetGuid (&Guid); \r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+                                                       VSObj.SetVarStoreId (VarStoreId);\r
+                                                       _PCATCH(mCVfrVarDataTypeDB.GetDataTypeSize(TypeName, &Size), LineNum);\r
+                                                       VSObj.SetSize (Size);\r
+                                                       VSObj.SetName (SN->getText());\r
+                                                    >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementVarStoreEfi :\r
+  <<\r
+     EFI_GUID        Guid;\r
+     CIfrVarStoreEfi VSEObj;\r
+     EFI_VARSTORE_ID VarStoreId;\r
+     UINT32          Attr = 0;\r
+  >>\r
+  E:Efivarstore                                     << VSEObj.SetLineNo(E->getLine()); >>\r
+  SN:StringIdentifier ","\r
+  Attribute "=" vfrVarStoreEfiAttr[Attr] ( "\|" vfrVarStoreEfiAttr[Attr] )* ","\r
+                                                    << VSEObj.SetAttributes (Attr); >>\r
+  Name "=" "STRING_TOKEN" "\(" VN:Number "\)" ","\r
+  VarSize "=" N:Number ","\r
+  GUID "=" \r
+  OpenBrace\r
+    G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number "," \r
+    G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
+  CloseBrace\r
+                                                    << \r
+                                                       _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (), \r
+                                                                       G4->getText (), G5->getText (), G6->getText (), \r
+                                                                       G7->getText (), G8->getText (), G9->getText (), \r
+                                                                       G10->getText (), G11->getText ()); \r
+                                                    >>\r
+                                                    << mCVfrDataStorage.DeclareEfiVarStore (SN->getText(), &Guid, _STOSID(VN->getText()), _STOU32(N->getText())); >>\r
+                                                    << \r
+                                                       VSEObj.SetGuid (&Guid);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+                                                       VSEObj.SetVarStoreId (VarStoreId); \r
+                                                    >>\r
+  ";"\r
+  ;\r
+\r
+vfrVarStoreEfiAttr [UINT32 & Attr] :\r
+  N:Number                                          << $Attr |= _STOU32(N->getText()); >>\r
+  ;\r
+\r
+vfrStatementVarStoreNameValue :\r
+  <<\r
+     EFI_GUID              Guid; \r
+     CIfrVarStoreNameValue VSNVObj;\r
+     EFI_VARSTORE_ID       VarStoreId;\r
+  >>\r
+  L:NameValueVarStore                               << VSNVObj.SetLineNo(L->getLine()); >>\r
+  SN:StringIdentifier ","                           << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreBegin (SN->getText()), SN); >>\r
+  (\r
+    Name "=" "STRING_TOKEN" "\(" N:Number "\)" ","  << _PCATCH(mCVfrDataStorage.NameTableAddItem (_STOSID(N->getText())), SN); >>\r
+  )+\r
+  GUID "=" \r
+  OpenBrace\r
+    G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number "," \r
+    G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
+  CloseBrace\r
+                                                    << \r
+                                                       _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (), \r
+                                                                       G4->getText (), G5->getText (), G6->getText (), \r
+                                                                       G7->getText (), G8->getText (), G9->getText (), \r
+                                                                       G10->getText (), G11->getText ()); \r
+                                                    >>\r
+                                                    << _PCATCH(mCVfrDataStorage.DeclareNameVarStoreEnd (&Guid), SN); >>\r
+                                                    << \r
+                                                       VSNVObj.SetGuid (&Guid);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId(SN->getText(), &VarStoreId), SN);\r
+                                                       VSNVObj.SetVarStoreId (VarStoreId); \r
+                                                    >>\r
+  ";"\r
+  ;\r
+\r
+//\r
+// keep classDeinition and validClassNames for compatibility but not generate\r
+// any IFR object\r
+//\r
+classDefinition[UINT16 & Class] :\r
+  << $Class = 0; >>\r
+  validClassNames[$Class] ( "\|" validClassNames[$Class] )*\r
+  ;\r
+  \r
+validClassNames[UINT16 & Class] :\r
+    ClassNonDevice                                  << $Class |= EFI_NON_DEVICE_CLASS; >>\r
+  | ClassDiskDevice                                 << $Class |= EFI_DISK_DEVICE_CLASS; >>\r
+  | ClassVideoDevice                                << $Class |= EFI_VIDEO_DEVICE_CLASS; >>\r
+  | ClassNetworkDevice                              << $Class |= EFI_NETWORK_DEVICE_CLASS; >>\r
+  | ClassInputDevice                                << $Class |= EFI_INPUT_DEVICE_CLASS; >>\r
+  | ClassOnBoardDevice                              << $Class |= EFI_ON_BOARD_DEVICE_CLASS; >>\r
+  | ClassOtherDevice                                << $Class |= EFI_OTHER_DEVICE_CLASS; >>\r
+  | N:Number                                        << $Class |= _STOU16(N->getText()); >>\r
+  ;\r
+\r
+subclassDefinition[UINT16 & SubClass] :\r
+  << $SubClass = 0; >>\r
+    SubclassSetupApplication                        << $SubClass |= EFI_SETUP_APPLICATION_SUBCLASS; >>\r
+  | SubclassGeneralApplication                      << $SubClass |= EFI_GENERAL_APPLICATION_SUBCLASS; >>\r
+  | SubclassFrontPage                               << $SubClass |= EFI_FRONT_PAGE_SUBCLASS; >>\r
+  | SubclassSingleUse                               << $SubClass |= EFI_SINGLE_USE_SUBCLASS; >>\r
+  | N:Number                                        << $SubClass |= _STOU16(N->getText()); >>\r
+  ;\r
+\r
+vfrStatementDisableIfFromSet :\r
+  << CIfrDisableIf DIObj; >>\r
+  D:DisableIf                                       << DIObj.SetLineNo(D->getLine()); >>\r
+  vfrStatementExpression[0] ";"\r
+  vfrFormSetList\r
+  E:EndIf                                           << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+//*****************************************************************************\r
+//\r
+// the syntax of question header and statement header\r
+//\r
+vfrStatementHeader[CIfrStatementHeader *SHObj] :\r
+  Prompt "=" "STRING_TOKEN" "\(" S1:Number "\)" "," << $SHObj->SetPrompt (_STOSID(S1->getText())); >>\r
+  Help   "=" "STRING_TOKEN" "\(" S2:Number "\)"     << $SHObj->SetHelp (_STOSID(S2->getText())); >>\r
+  ;\r
+\r
+vfrQuestionHeader[CIfrQuestionHeader & QHObj, EFI_QUESION_TYPE QType = QUESTION_NORMAL]:\r
+  <<\r
+     EFI_VARSTORE_INFO Info; \r
+        EFI_QUESTION_ID   QId       = EFI_QUESTION_ID_INVALID;\r
+     INT8              *QName    = NULL;\r
+     INT8              *VarIdStr = NULL;\r
+  >>\r
+  {\r
+    Name "=" QN:StringIdentifier ","                <<\r
+                                                       QName = QN->getText();\r
+                                                       _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
+                                                    >>\r
+  }\r
+  { V:VarId "=" vfrStorageVarId[Info, VarIdStr] "," }\r
+  {\r
+    QuestionId "=" ID:Number ","                    <<\r
+                                                       QId = _STOQID(ID->getText());\r
+                                                       _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "has already been used please assign another number"); \r
+                                                    >>\r
+  }\r
+                                                    << \r
+                                                       switch (QType) {\r
+                                                       case QUESTION_NORMAL:\r
+                                                         mCVfrQuestionDB.RegisterQuestion (QName, VarIdStr, QId);\r
+                                                         break;\r
+                                                                                                          case QUESTION_DATE:\r
+                                                                                                                mCVfrQuestionDB.RegisterNewDateQuestion (QName, VarIdStr, QId);\r
+                                                                                                                break;\r
+                                                                                                          case QUESTION_TIME:\r
+                                                                                                                mCVfrQuestionDB.RegisterNewTimeQuestion (QName, VarIdStr, QId);\r
+                                                                                                                break;\r
+                                                                                                          default:\r
+                                                                                                                _PCATCH(VFR_RETURN_FATAL_ERROR);\r
+                                                                                                          }\r
+                                                       $QHObj.SetQuestionId (QId);\r
+                                                       $QHObj.SetVarStoreInfo (&Info);\r
+                                                    >>\r
+  vfrStatementHeader[&$QHObj]\r
+                                                    << _SAVE_CURRQEST_VARINFO (Info); >>\r
+                                                                                                       << if (VarIdStr != NULL) delete VarIdStr; >>\r
+  ;\r
+\r
+vfrQuestionHeaderWithNoStorage[CIfrQuestionHeader *QHObj] :\r
+  <<\r
+        EFI_QUESTION_ID   QId = EFI_QUESTION_ID_INVALID;\r
+     INT8              *QName = NULL;\r
+  >>\r
+  {\r
+    Name "=" QN:StringIdentifier ","                <<\r
+                                                       QName = QN->getText();\r
+                                                       _PCATCH(mCVfrQuestionDB.FindQuestion (QName), VFR_RETURN_UNDEFINED, QN, "has already been used please used anther name");\r
+                                                    >>\r
+  }\r
+  {\r
+    QuestionId "=" ID:Number ","                    <<\r
+                                                       QId = _STOQID(ID->getText());\r
+                                                       _PCATCH(mCVfrQuestionDB.FindQuestion (QId), VFR_RETURN_UNDEFINED, ID, "redefined quesiont ID"); \r
+                                                    >>\r
+  }\r
+                                                    << \r
+                                                       mCVfrQuestionDB.RegisterQuestion (QName, NULL, QId);\r
+                                                       $QHObj->SetQuestionId (QId);\r
+                                                    >>\r
+  vfrStatementHeader[$QHObj]\r
+  ;\r
+\r
+questionheaderFlagsField[UINT8 & Flags] :\r
+    ReadOnlyFlag                                    << $Flags |= 0x01; >>\r
+  | CallBackFlag                                    << $Flags |= 0x04; >>\r
+  | ResetRequiredFlag                               << $Flags |= 0x10; >>\r
+  | OptionOnlyFlag                                  << $Flags |= 0x80; >>\r
+  ;\r
+\r
+vfrStorageVarId[EFI_VARSTORE_INFO & Info, INT8 *&QuestVarIdStr] :\r
+  <<\r
+     UINT32                Idx;\r
+     UINT32                LineNo;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+     INT8                  *VarIdStr    = NULL;\r
+     INT8                  *VarStr      = NULL;\r
+     INT8                  *SName       = NULL;\r
+     INT8                  *TName       = NULL;\r
+  >>\r
+  (\r
+    SN1:StringIdentifier                            << SName = SN1->getText(); _STRCAT(&VarIdStr, SN1->getText()); >>\r
+    OpenBracket I1:Number CloseBracket              << Idx = _STOU32(I1->getText()); _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I1->getText()); _STRCAT(&VarIdStr, "]"); >>\r
+                                                    <<\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreType (SName, VarStoreType), SN1);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN1); \r
+                                                                                                          _PCATCH(mCVfrDataStorage.GetNameVarStoreInfo (&$Info, Idx), SN1);\r
+                                                                                                       >>\r
+  )\r
+  |\r
+  (\r
+    SN2:StringIdentifier                            << SName = SN2->getText(); _STRCAT(&VarIdStr, SName); >>\r
+                                                    <<\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreType (SName, VarStoreType), SN2);\r
+                                                       _PCATCH(mCVfrDataStorage.GetVarStoreId (SName, &$Info.mVarStoreId), SN2);\r
+                                                                                                          if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
+                                                         _PCATCH(mCVfrDataStorage.GetBufferVarStoreDataTypeName(SName, &TName), SN2);\r
+                                                                                                                _STRCAT(&VarStr, TName);\r
+                                                                                                          }\r
+                                                    >>\r
+  \r
+    (\r
+      "."                                           <<\r
+                                                       _PCATCH(((VarStoreType != EFI_VFR_VARSTORE_BUFFER) ? VFR_RETURN_EFIVARSTORE_USE_ERROR : VFR_RETURN_SUCCESS), SN2);\r
+                                                                                                          _STRCAT(&VarIdStr, "."); _STRCAT(&VarStr, ".");\r
+                                                                                                       >>\r
+      SF:StringIdentifier                           << _STRCAT(&VarIdStr, SF->getText()); _STRCAT(&VarStr, SF->getText()); >>\r
+      {\r
+        OpenBracket I2:Number CloseBracket          << _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I2->getText()); _STRCAT(&VarIdStr, "]"); >>\r
+                                                    << _STRCAT(&VarStr, "["); _STRCAT(&VarStr, I2->getText()); _STRCAT(&VarStr, "]"); >>\r
+      }\r
+    )*                                              << \r
+                                                       switch (VarStoreType) {\r
+                                                       case EFI_VFR_VARSTORE_EFI:\r
+                                                         _PCATCH(mCVfrDataStorage.GetEfiVarStoreInfo (&$Info), SN2);\r
+                                                         break;\r
+                                                       case EFI_VFR_VARSTORE_BUFFER:\r
+                                                         _PCATCH(mCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, $Info.mInfo.mVarOffset, $Info.mVarType, $Info.mVarTotalSize), SN2->getLine());\r
+                                                         //_PCATCH(mCVfrDataStorage.BufferVarStoreRequestElementAdd (SName, Info), SN2);\r
+                                                         break;\r
+                                                       case EFI_VFR_VARSTORE_NAME:\r
+                                                       default: break;\r
+                                                       }\r
+\r
+                                                       QuestVarIdStr = VarIdStr;\r
+                                                       if (VarStr != NULL) {delete VarStr;}\r
+                                                    >>\r
+  )\r
+  ;\r
+\r
+vfrQuestionDataFieldName [EFI_QUESTION_ID &QId, UINT32 &Mask, INT8 *&VarIdStr, UINT32 &LineNo] :\r
+                                                    << VarIdStr = NULL; LineNo = 0; >>\r
+  (\r
+    SN1:StringIdentifier                            << _STRCAT(&VarIdStr, SN1->getText()); LineNo = SN1->getLine(); >>\r
+    OpenBracket I1:Number CloseBracket              << _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I1->getText()); _STRCAT(&VarIdStr, "]"); >>\r
+                                                    << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r
+  )\r
+  |\r
+  (\r
+    SN2:StringIdentifier                            << _STRCAT (&VarIdStr, SN2->getText()); LineNo = SN2->getLine(); >>\r
+    (\r
+      "."                                           << _STRCAT (&VarIdStr, "."); >>\r
+      SF:StringIdentifier                           << _STRCAT(&VarIdStr, SF->getText()); >>\r
+      {\r
+        OpenBracket I2:Number CloseBracket          << _STRCAT(&VarIdStr, "["); _STRCAT(&VarIdStr, I2->getText()); _STRCAT(&VarIdStr, "]"); >>\r
+      }\r
+    )*\r
+                                                    << mCVfrQuestionDB.GetQuestionId (NULL, VarIdStr, $QId, $Mask); >>\r
+  )\r
+  ;\r
+\r
+vfrConstantValueField[UINT8 Type] > [EFI_IFR_TYPE_VALUE Value] :\r
+    N1:Number                                       << \r
+                                                       switch ($Type) {\r
+                                                       case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+                                                                                                            $Value.u8     = _STOU8(N1->getText());\r
+                                                                                                                break;\r
+                                                                                                          case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+                                                                                                            $Value.u16    = _STOU16(N1->getText());\r
+                                                                                                                break;\r
+                                                                                                          case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+                                                                                                            $Value.u32    = _STOU32(N1->getText());\r
+                                                                                                                break;\r
+                                                                                                          case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+                                                                                                            $Value.u64    = _STOU64(N1->getText());\r
+                                                                                                                break;\r
+                                                                                                          case EFI_IFR_TYPE_BOOLEAN :\r
+                                                                                                            $Value.b      = _STOU8(N1->getText());\r
+                                                                                                                break;\r
+                                                                                                          case EFI_IFR_TYPE_STRING :\r
+                                                                                                            $Value.string = _STOU16(N1->getText());\r
+                                                                                                                break;\r
+                                                                                                          case EFI_IFR_TYPE_TIME :\r
+                                                                                                          case EFI_IFR_TYPE_DATE :\r
+                                                                                                          default :\r
+                                                                                                                break;\r
+                                                                                                          } \r
+                                                    >>\r
+  | B1:True                                         << $Value.b      = TRUE; >>\r
+  | B2:False                                        << $Value.b      = FALSE; >>\r
+  | O1:One                                          << $Value.u8     = _STOU8(O1->getText()); >>\r
+  | O2:Ones                                         << $Value.u64    = _STOU64(O2->getText()); >>\r
+  | Z:Zero                                          << $Value.u8     = _STOU8(Z->getText()); >>\r
+  | HOUR:Number ":" MINUTE:Number ":" SECOND:Number << $Value.time   = _STOT(HOUR->getText(), MINUTE->getText(), SECOND->getText()); >>\r
+  | YEAR:Number "/" MONTH:Number "/" DAY:Number     << $Value.date   = _STOD(YEAR->getText(), MONTH->getText(), DAY->getText()); >>\r
+  | "STRING_TOKEN" "\(" S1:Number "\)"              << $Value.string = _STOSID(S1->getText()); >>\r
+  ;\r
+\r
+//*****************************************************************************\r
+//\r
+// the syntax of form definition\r
+//\r
+vfrFormDefinition :\r
+  << CIfrForm FObj; >>\r
+  F:Form                                            << FObj.SetLineNo(F->getLine()); >>\r
+  FormId "=" S1:Number ","                          << _PCATCH(FObj.SetFormId (_STOFID(S1->getText())), S1); >>\r
+  Title "=" "STRING_TOKEN" "\(" S2:Number "\)" ";"  << FObj.SetFormTitle (_STOSID(S2->getText())); >>\r
+  (\r
+    vfrStatementImage                        |\r
+    vfrStatementLocked                       |\r
+    vfrStatementRules                        |\r
+    vfrStatementDefault                      |\r
+    vfrStatementStat                         |\r
+    vfrStatementQuestions                    |\r
+    vfrStatementConditional                  |\r
+    vfrStatementLabel                        |\r
+    vfrStatementBanner                       \r
+    // Just for framework vfr compatibility\r
+    //vfrStatementInvalid\r
+  )*\r
+  E:EndForm                                         << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementRules : \r
+  << CIfrRule RObj; >>\r
+  R:Rule                                            << RObj.SetLineNo(R->getLine()); >>\r
+  S1:StringIdentifier ","                           <<\r
+                                                       mCVfrRulesDB.RegisterRule (S1->getText());\r
+                                                       RObj.SetRuleId (mCVfrRulesDB.GetRuleId(S1->getText())); \r
+                                                    >>\r
+  vfrStatementExpression[0]\r
+  E:EndRule                                         << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementDefault :\r
+  <<\r
+     BOOLEAN               IsExp         = FALSE;\r
+     EFI_IFR_TYPE_VALUE    Val; \r
+     CIfrDefault           DObj;\r
+     EFI_DEFAULT_ID        DefaultId     = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+     INT8                  *VarStoreName = NULL;\r
+     EFI_VFR_VARSTORE_TYPE VarStoreType  = EFI_VFR_VARSTORE_INVALID;\r
+  >>\r
+  D:Default                                         << DObj.SetLineNo(D->getLine()); >>\r
+  (\r
+    (\r
+        vfrStatementValue ","                       << IsExp = TRUE; DObj.SetScope (1); >>\r
+      | "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] > [Val] ","  \r
+                                                    << DObj.SetType (_GET_CURRQEST_DATATYPE()); DObj.SetValue(Val); >>\r
+    )\r
+    {\r
+      DefaultStore "=" SN:StringIdentifier ","      << _PCATCH(mCVfrDefaultStore.GetDefaultId (SN->getText(), &DefaultId), SN); DObj.SetDefaultId (DefaultId); >>\r
+    }\r
+                                                    << \r
+                                                                                                          _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), D->getLine());\r
+                                                                                                          _PCATCH(mCVfrDataStorage.GetVarStoreType (VarStoreName, VarStoreType), D->getLine());\r
+                                                                                                          if ((IsExp == FALSE) && (VarStoreType == EFI_VFR_VARSTORE_BUFFER)) { \r
+                                                                                                            _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                                                                                                    DefaultId, \r
+                                                                                                                                                                        _GET_CURRQEST_VARTINFO(), \r
+                                                                                                                                                                        VarStoreName, \r
+                                                                                                                                                                        _GET_CURRQEST_DATATYPE (), \r
+                                                                                                                                                                        Val), D->getLine()); \r
+                                                                                                          }\r
+                                                                                                       >>\r
+  )\r
+  ;\r
+\r
+vfrStatementStat :\r
+  vfrStatementSubTitle        | \r
+  vfrStatementStaticText      |\r
+  vfrStatementCrossReference\r
+  ;\r
+\r
+vfrStatementQuestions :\r
+  vfrStatementBooleanType     |\r
+  vfrStatementDate            |\r
+  vfrStatementNumericType     |\r
+  vfrStatementStringType      |\r
+  vfrStatementOrderedList     |\r
+  vfrStatementTime\r
+  ;\r
+\r
+vfrStatementConditional :\r
+  vfrStatementDisableIfStat   |\r
+  vfrStatementSuppressIfStat  |\r
+  vfrStatementGrayOutIfStat\r
+  ;\r
+\r
+vfrStatementInvalid :\r
+                                                       << _CRT_OP (FALSE); >>\r
+  (\r
+    vfrStatementInvalidHidden          |\r
+    vfrStatementInvalidInconsistentIf  |\r
+    vfrStatementInvalidInventory       |\r
+    vfrStatementInvalidSaveRestoreDefaults\r
+  )\r
+                                                       << _CRT_OP (TRUE); >>\r
+  ;\r
+\r
+flagsField :\r
+  Number | InteractiveFlag | ManufacturingFlag | DefaultFlag | \r
+  NVAccessFlag | ResetRequiredFlag | LateCheckFlag\r
+  ;\r
+\r
+vfrStatementValue :\r
+  << CIfrValue VObj; >>\r
+  V:Value                                              << VObj.SetLineNo(V->getLine()); >>\r
+  "=" vfrStatementExpression[0]\r
+  ;\r
+\r
+vfrStatementSubTitle :\r
+  << CIfrSubtitle SObj; >>\r
+  L:Subtitle                                           << SObj.SetLineNo(L->getLine()); >>\r
+  Text "=" "STRING_TOKEN" "\(" S:Number "\)"           << SObj.SetPrompt (_STOSID(S->getText())); >>\r
+  {\r
+    "," FLAGS "=" vfrSubtitleFlags[SObj]\r
+  }\r
+  { vfrStatementStatTagList "," }\r
+  E:";"                                                << CRT_END_OP (E); >>\r
+  ;\r
+\r
+vfrSubtitleFlags [CIfrSubtitle & SObj] :\r
+  << UINT8 LFlags = 0; >>\r
+  subtitleFlagsField[LFlags] ( "\|" subtitleFlagsField[LFlags] )*\r
+                                                       << _PCATCH(SObj.SetFlags (LFlags)); >>\r
+  ;\r
+\r
+subtitleFlagsField [UINT8 & Flags] :\r
+    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+  | "HORIZONTAL"                                       << $Flags |= 0x01; >>\r
+  ;\r
+\r
+vfrStatementStaticText :\r
+  << \r
+     UINT8           Flags   = 0;\r
+     EFI_QUESTION_ID QId     = EFI_QUESTION_ID_INVALID;\r
+     EFI_STRING_ID   TxtTwo  = EFI_STRING_ID_INVALID;\r
+   >>\r
+  T:Text\r
+  Help "=" "STRING_TOKEN" "\(" S1:Number "\)" ","\r
+  Text "=" "STRING_TOKEN" "\(" S2:Number "\)"\r
+  {\r
+    "," Text "=" "STRING_TOKEN" "\(" S3:Number "\)"    << TxtTwo = _STOSID(S3->getText()); >>\r
+  }\r
+  {\r
+    "," F:FLAGS "=" staticTextFlagsField[Flags] ( "\|" staticTextFlagsField[Flags] )*\r
+    "," Key "=" KN:Number\r
+  }\r
+                                                       <<\r
+                                                          if (Flags & EFI_IFR_FLAG_CALLBACK) {\r
+                                                            CIfrAction AObj;\r
+                                                            mCVfrQuestionDB.RegisterQuestion (NULL, NULL, QId);\r
+                                                            AObj.SetQuestionId (QId);\r
+                                                            AObj.SetPrompt (_STOSID(S2->getText()));\r
+                                                            AObj.SetHelp (_STOSID(S1->getText()));\r
+                                                            _PCATCH(AObj.SetFlags (Flags), F->getLine());\r
+                                                            AssignQuestionKey (AObj, KN);\r
+                                                            CRT_END_OP (T);\r
+                                                          } else {\r
+                                                                                                                   CIfrText TObj;\r
+                                                                                                                   TObj.SetLineNo (T->getLine());\r
+                                                                                                                       TObj.SetHelp (_STOSID(S1->getText()));\r
+                                                                                                                       TObj.SetPrompt (_STOSID(S2->getText()));\r
+                                                                                                                       TObj.SetTextTwo (TxtTwo);\r
+                                                                                                                 }\r
+                                                       >>\r
+  { "," vfrStatementStatTagList }\r
+  ";"\r
+  ;\r
+\r
+staticTextFlagsField[UINT8 & HFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+vfrStatementCrossReference :\r
+  vfrStatementGoto            |\r
+  vfrStatementResetButton\r
+  ;\r
+\r
+vfrStatementGoto :\r
+  << \r
+     UINT8               RefType = 1;\r
+     EFI_STRING_ID       DevPath;\r
+     EFI_GUID            FSId;\r
+     EFI_FORM_ID         FId;\r
+        EFI_QUESTION_ID     QId    = EFI_QUESTION_ID_INVALID;\r
+     UINT32              BitMask;\r
+     CIfrQuestionHeader  *QHObj = NULL;\r
+     CIfrRef             *R1Obj = NULL;\r
+     CIfrRef2            *R2Obj = NULL;\r
+     CIfrRef3            *R3Obj = NULL;\r
+     CIfrRef4            *R4Obj = NULL;\r
+  >>\r
+  G:Goto\r
+  (\r
+    (\r
+      DevicePath "=" "STRING_TOKEN" "\(" P:Number "\)" ","\r
+      FormSetGuid "=" \r
+        OpenBrace\r
+          G11:Number "," G12:Number "," G13:Number "," G14:Number "," G15:Number "," G16:Number "," \r
+          G17:Number "," G18:Number "," G19:Number "," G110:Number "," G111:Number\r
+        CloseBrace ","\r
+      FormId "=" F1:Number ","\r
+      Question "=" QN1:Number ","\r
+                                                       << \r
+                                                          RefType = 4;\r
+                                                          _CRGUID (&FSId, G11->getText (), G12->getText (), G13->getText (), \r
+                                                                          G14->getText (), G15->getText (), G16->getText (), \r
+                                                                          G17->getText (), G18->getText (), G19->getText (), \r
+                                                                          G110->getText (), G111->getText ()); \r
+                                                          DevPath = _STOSID(P->getText()); \r
+                                                          FId = _STOFID(F1->getText());\r
+                                                          QId = _STOQID(QN1->getText());\r
+                                                       >>\r
+    )\r
+    |\r
+    (\r
+      FormSetGuid "="\r
+        OpenBrace\r
+          G21:Number "," G22:Number "," G23:Number "," G24:Number "," G25:Number "," G26:Number "," \r
+          G27:Number "," G28:Number "," G29:Number "," G210:Number "," G211:Number\r
+        CloseBrace ","\r
+      FormId "=" F2:Number ","\r
+      Question "=" QN2:Number ","\r
+                                                       <<\r
+                                                          RefType = 3;\r
+                                                          _CRGUID (&FSId, G21->getText (), G22->getText (), G23->getText (), \r
+                                                                          G24->getText (), G25->getText (), G26->getText (), \r
+                                                                          G27->getText (), G28->getText (), G29->getText (), \r
+                                                                          G210->getText (), G211->getText ()); \r
+                                                          FId = _STOFID(F2->getText());\r
+                                                          QId = _STOQID(QN2->getText());\r
+                                                       >>\r
+    )\r
+    |\r
+    (\r
+      FormId "=" F3:Number ","                         << RefType = 2; FId = _STOFID(F3->getText()); >>\r
+      Question "=" \r
+      (\r
+          QN3:StringIdentifier ","                     << mCVfrQuestionDB.GetQuestionId (QN3->getText (), NULL, QId, BitMask); >>\r
+        | QN4:Number ","                               << QId = _STOQID(QN4->getText()); >>\r
+      )\r
+    )\r
+    |\r
+    (\r
+      F4:Number ","                                    << \r
+                                                          RefType = 1;\r
+                                                          FId = _STOFID(F4->getText());\r
+                                                       >>\r
+    )\r
+  )\r
+                                                       <<\r
+                                                          switch (RefType) {\r
+                                                          case 4:\r
+                                                            {\r
+                                                              R4Obj = new CIfrRef4; \r
+                                                              QHObj = R4Obj; \r
+                                                              R4Obj->SetLineNo(G->getLine()); \r
+                                                              R4Obj->SetDevicePath (DevPath); \r
+                                                              R4Obj->SetFormSetId (FSId); \r
+                                                              R4Obj->SetFormId (FId); \r
+                                                              R4Obj->SetQuestionId (QId); \r
+                                                              break;\r
+                                                            }\r
+                                                          case 3:\r
+                                                            {\r
+                                                              R3Obj = new CIfrRef3; \r
+                                                              QHObj = R3Obj; \r
+                                                              R3Obj->SetLineNo(G->getLine()); \r
+                                                              R3Obj->SetFormSetId (FSId); \r
+                                                              R3Obj->SetFormId (FId); \r
+                                                              R3Obj->SetQuestionId (QId); \r
+                                                              break;\r
+                                                            }\r
+                                                          case 2:\r
+                                                            {\r
+                                                              R2Obj = new CIfrRef2; \r
+                                                              QHObj = R2Obj; \r
+                                                              R2Obj->SetLineNo(G->getLine()); \r
+                                                              R2Obj->SetFormId (FId); \r
+                                                              _PCATCH(R2Obj->SetQuestionId (QId), QN3);\r
+                                                              break;\r
+                                                            }\r
+                                                          case 1:\r
+                                                            {\r
+                                                              R1Obj = new CIfrRef;\r
+                                                              QHObj = R1Obj;\r
+                                                              R1Obj->SetLineNo(G->getLine());\r
+                                                              R1Obj->SetFormId (FId);\r
+                                                              break;\r
+                                                            }\r
+                                                          default: break;\r
+                                                          }\r
+                                                       >>\r
+  vfrQuestionHeaderWithNoStorage[QHObj]\r
+  { "," vfrStatementStatTagList }\r
+  { "," F:FLAGS  "=" vfrGotoFlags[QHObj, F->getLine()] }\r
+  {\r
+    "," Key "=" KN:Number                              << AssignQuestionKey (*QHObj, KN); >>\r
+  }\r
+  ";"                                                  << if (R1Obj != NULL) {delete R1Obj;} if (R2Obj != NULL) {delete R2Obj;} if (R3Obj != NULL) {delete R3Obj;} if (R4Obj != NULL) {delete R4Obj;} >>\r
+  ;\r
+\r
+vfrGotoFlags [CIfrQuestionHeader *QHObj, UINT32 LineNum] :\r
+  << UINT8 HFlags = 0; >>\r
+  gotoFlagsField[HFlags] ( "\|" gotoFlagsField[HFlags] )*\r
+                                                       << _PCATCH(QHObj->SetFlags (HFlags), LineNum); >>\r
+  ;\r
+\r
+gotoFlagsField[UINT8 & HFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+getStringId :\r
+  "STRING_TOKEN" "\("\r
+  IdVal:Number\r
+  "\)"\r
+  ;\r
+\r
+vfrStatementResetButton :\r
+  <<\r
+     CIfrResetButton RBObj; \r
+     UINT16          DefaultId;\r
+  >>\r
+  L:ResetButton                                        << RBObj.SetLineNo(L->getLine()); >>\r
+  DefaultStore \r
+  "=" N:StringIdentifier ","                           << \r
+                                                          _PCATCH(mCVfrDefaultStore.GetDefaultId (N->getText(), &DefaultId), N->getLine());\r
+                                                          RBObj.SetDefaultId (DefaultId);\r
+                                                       >>\r
+  vfrStatementHeader[&RBObj] ","\r
+  { vfrStatementStatTagList "," }\r
+  E:EndResetButton                                     << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementBooleanType :\r
+  vfrStatementCheckBox |\r
+  vfrStatementAction\r
+  ;\r
+\r
+//*****************************************************\r
+// Syntax of checkbox\r
+//\r
+// Example:\r
+//   checkbox\r
+//     varid       = MySTestData.mField1,\r
+//     prompt      = STRING_TOKEN(STR_CHECK_BOX_PROMPT),\r
+//     help        = STRING_TOKEN(STR_CHECK_BOX_HELP),\r
+//     flags       = CHECKBOX_DEFAULT | CALLBACK,\r
+//     default value = TRUE, defaultstore = MyDefaultStore, \r
+//   endcheckbox;\r
+//\r
+vfrStatementCheckBox :\r
+  <<\r
+     CIfrCheckBox CBObj;\r
+  >>\r
+  L:CheckBox                                           << CBObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeader[CBObj] ","\r
+  { F:FLAGS "=" vfrCheckBoxFlags[CBObj, F->getLine()] "," }\r
+  {\r
+    Key "=" KN:Number  ","                             << AssignQuestionKey (CBObj, KN); >>\r
+  }\r
+  vfrStatementQuestionOptionList\r
+  E:EndCheckBox                                        << CRT_END_OP (E); >>\r
+  ";"\r
+  ; \r
+\r
+vfrCheckBoxFlags [CIfrCheckBox & CBObj, UINT32 LineNum] :\r
+  <<\r
+     UINT8 LFlags = 0;\r
+     UINT8 HFlags = 0;\r
+  >>\r
+  checkboxFlagsField[LFlags, HFlags] ( "\|" checkboxFlagsField[LFlags, HFlags] )*\r
+                                                       << _PCATCH(CBObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  ;\r
+\r
+checkboxFlagsField[UINT8 & LFlags, UINT8 & HFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | "CHECKBOX_DEFAULT"                                 << $LFlags |= 0x01; >>\r
+  | "CHECKBOX_DEFAULT_MFG"                             << $LFlags |= 0x02; >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+//*****************************************************\r
+// Syntax of action\r
+//\r
+// Example:\r
+//   action\r
+//     prompt      = STRING_TOKEN(STR_ACTION_PROMPT),\r
+//     help        = STRING_TOKEN(STR_ACTION_HELP),\r
+//     flags       = CALLBACK,\r
+//     config      = STRING_TOKEN(STR_ACTION_CONFIG),\r
+//   endaction;\r
+//\r
+vfrStatementAction :\r
+  << CIfrAction AObj; >>\r
+  L:Action                                             << AObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeaderWithNoStorage[&AObj] ","\r
+  { F:FLAGS "=" vfrActionFlags[AObj, F->getLine()] "," }\r
+  Config "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << AObj.SetQuestionConfig (_STOSID(S->getText())); >>\r
+  vfrStatementQuestionTagList\r
+  E:EndAction                                          << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrActionFlags[CIfrAction & AObj, UINT32 LineNum] :\r
+  << UINT8 HFlags = 0; >>\r
+  actionFlagsField[HFlags] ( "\|" actionFlagsField[HFlags] )*\r
+                                                       << _PCATCH(AObj.SetFlags (HFlags), LineNum); >>\r
+  ;\r
+\r
+actionFlagsField[UINT8 & HFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+vfrStatementDate :\r
+  <<\r
+     EFI_QUESTION_ID    QId          = EFI_QUESTION_ID_INVALID;\r
+     INT8               *VarIdStr[3] = {NULL, };\r
+     CIfrDate           DObj;\r
+     EFI_IFR_TYPE_VALUE Val;\r
+  >>\r
+  L:Date                                               << DObj.SetLineNo(L->getLine()); >>\r
+  (\r
+    (\r
+      vfrQuestionHeader[DObj, QUESTION_DATE] ","\r
+         { F:FLAGS "=" vfrDateFlags[DObj, F->getLine()] "," }\r
+      vfrStatementQuestionOptionList\r
+    )\r
+    |\r
+    (\r
+      Year VarId "=" D1:StringIdentifier "." D1Y:StringIdentifier ","\r
+                                                       << _STRCAT(&VarIdStr[0], D1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], D1Y->getText()); >>\r
+      Prompt "=" "STRING_TOKEN" "\(" YP:Number "\)" ","\r
+      Help   "=" "STRING_TOKEN" "\(" YH:Number "\)" ","\r
+      minMaxDateStepDefault[Val.date, 0]\r
+\r
+      Month VarId "=" D2:StringIdentifier "." D2M:StringIdentifier ","\r
+                                                       << _STRCAT(&VarIdStr[1], D2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], D2M->getText()); >>\r
+      Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
+      Help   "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
+      minMaxDateStepDefault[Val.date, 1]\r
+\r
+      Day VarId "=" D3:StringIdentifier "." D3D:StringIdentifier ","\r
+                                                       << _STRCAT(&VarIdStr[2], D3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], D3D->getText()); >>\r
+      Prompt "=" "STRING_TOKEN" "\(" DP:Number "\)" ","\r
+      Help   "=" "STRING_TOKEN" "\(" DH:Number "\)" ","\r
+      minMaxDateStepDefault[Val.date, 2]\r
+                                                       <<\r
+                                                          mCVfrQuestionDB.RegisterOldDateQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId); \r
+                                                          DObj.SetQuestionId (QId);\r
+                                                          DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_DATE_STORAGE_TIME);\r
+                                                                                                                 DObj.SetPrompt (_STOSID(YP->getText()));\r
+                                                                                                                 DObj.SetHelp (_STOSID(YH->getText()));\r
+                                                                                                                 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
+                                                       >>\r
+                                                          << {CIfrDefault DObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_DATE, Val);} >>\r
+      ( vfrStatementInconsistentIf )*\r
+    )\r
+  )\r
+  E:EndDate                                            << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+minMaxDateStepDefault[EFI_HII_DATE & D, UINT8 KeyValue] :\r
+  Minimum   "=" Number ","\r
+  Maximum   "=" Number ","\r
+  { "step"    "=" Number "," }\r
+  {\r
+    "default" "=" N:Number ","                         <<\r
+                                                          switch (KeyValue) {\r
+                                                          case 0: D.Year  = _STOU16(N->getText()); break; \r
+                                                          case 1: D.Month = _STOU8(N->getText()); break; \r
+                                                          case 2: D.Day   = _STOU8(N->getText()); break;\r
+                                                                                                                 } \r
+                                                       >>\r
+  }\r
+  ;\r
+\r
+vfrDateFlags [CIfrDate & DObj, UINT32 LineNum] :\r
+  << UINT8 LFlags = 0; >>\r
+  dateFlagsField[LFlags] ( "\|" dateFlagsField[LFlags] )*\r
+                                                       << _PCATCH(DObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
+  ;\r
+\r
+dateFlagsField [UINT8 & Flags] :\r
+    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+  | "YEAR_SUPPRESS"                                    << $Flags |= 0x01; >>\r
+  | "MONTH_SUPPRESS"                                   << $Flags |= 0x02; >>\r
+  | "DAY_SUPPRESS"                                     << $Flags |= 0x04; >>\r
+  | "STORAGE_NORMAL"                                   << $Flags |= 0x00; >>\r
+  | "STORAGE_TIME"                                     << $Flags |= 0x10; >>\r
+  | "STORAGE_WAKEUP"                                   << $Flags |= 0x20; >>\r
+  ;\r
+\r
+vfrStatementNumericType :\r
+  vfrStatementNumeric   |\r
+  vfrStatementOneOf\r
+  ;\r
+\r
+vfrSetMinMaxStep[CIfrMinMaxStepData & MMSDObj] :\r
+  <<\r
+     UINT64 MaxU8 = 0, MinU8 = 0, StepU8 = 0;\r
+     UINT32 MaxU4 = 0, MinU4 = 0, StepU4 = 0;\r
+     UINT16 MaxU2 = 0, MinU2 = 0, StepU2 = 0;\r
+     UINT8  MaxU1 = 0, MinU1 = 0, StepU1 = 0;\r
+  >>\r
+  Minimum   "=" I:Number ","\r
+                                                       <<\r
+                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : MinU8 = _STOU64(I->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MinU4 = _STOU32(I->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MinU2 = _STOU16(I->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MinU1 = _STOU8(I->getText());  break;\r
+                                                          }\r
+                                                                                                          >>\r
+  Maximum   "=" A:Number ","\r
+                                                       <<\r
+                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : MaxU8 = _STOU64(A->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : MaxU4 = _STOU32(A->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : MaxU2 = _STOU16(A->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  MaxU1 = _STOU8(A->getText());  break;\r
+                                                          }\r
+                                                                                                          >>\r
+  {\r
+    STEP    "=" S:Number ","\r
+                                                       <<\r
+                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : StepU8 = _STOU64(S->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : StepU4 = _STOU32(S->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : StepU2 = _STOU16(S->getText()); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  StepU1 = _STOU8(S->getText());  break;\r
+                                                          }\r
+                                                                                                          >>\r
+  }\r
+                                                       <<\r
+                                                          switch (_GET_CURRQEST_DATATYPE ()) {\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_64 : $MMSDObj.SetMinMaxStepData (MinU8, MaxU8, StepU8); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_32 : $MMSDObj.SetMinMaxStepData (MinU4, MaxU4, StepU4); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_16 : $MMSDObj.SetMinMaxStepData (MinU2, MaxU2, StepU2); break;\r
+                                                          case EFI_IFR_TYPE_NUM_SIZE_8 :  $MMSDObj.SetMinMaxStepData (MinU1, MaxU1, StepU1);  break;\r
+                                                          }\r
+                                                                                                          >>\r
+  ;\r
+\r
+vfrStatementNumeric :\r
+  <<\r
+     CIfrNumeric NObj;\r
+  >>\r
+  L:Numeric                                            << NObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeader[NObj] ","                          << _PCATCH(NObj.SetFlags (NObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); >>\r
+  { F:FLAGS "=" vfrNumericFlags[NObj, F->getLine()] "," }\r
+  {\r
+    Key   "=" KN:Number ","                            << AssignQuestionKey (NObj, KN); >>\r
+  }\r
+  vfrSetMinMaxStep[NObj]\r
+  vfrStatementQuestionOptionList\r
+  E:EndNumeric                                         << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrNumericFlags [CIfrNumeric & NObj, UINT32 LineNum] :\r
+  <<\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 HFlags = 0;\r
+  >>\r
+  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
+                                                       << _PCATCH(NObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  ;\r
+\r
+numericFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | "DISPLAY_INT_DEC"                                  << $LFlags |= 0x00; >>\r
+  | "DISPLAY_UINT_DEC"                                 << $LFlags |= 0x10; >>\r
+  | "DISPLAY_UINT_HEX"                                 << $LFlags |= 0x20; >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+vfrStatementOneOf :\r
+  <<\r
+     CIfrOneOf OObj;\r
+  >>\r
+  L:OneOf                                              << OObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeader[OObj] ","\r
+  { F:FLAGS "=" vfrOneofFlagsField[OObj, F->getLine()] "," }\r
+  { \r
+    vfrSetMinMaxStep[OObj]\r
+  }\r
+  vfrStatementQuestionOptionList\r
+  E:EndOneOf                                           << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrOneofFlagsField [CIfrOneOf & OObj, UINT32 LineNum] :\r
+  <<\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 HFlags = 0;\r
+  >>\r
+  numericFlagsField[HFlags, LFlags] ( "\|" numericFlagsField[HFlags, LFlags] )*\r
+                                                       << _PCATCH(OObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  ;\r
+\r
+vfrStatementStringType :\r
+  vfrStatementString    |\r
+  vfrStatementPassword\r
+  ;\r
+\r
+vfrStatementString :\r
+  <<\r
+     CIfrString SObj;\r
+  >>\r
+  L:String                                             << SObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeader[SObj] ","                          << _PCATCH(SObj.SetFlags (SObj.FLAGS(), _GET_CURRQEST_DATATYPE()), L->getLine()); >>\r
+  { F:FLAGS "=" vfrStringFlagsField[SObj, F->getLine()] "," }\r
+  {\r
+    Key "=" KN:Number ","                              << AssignQuestionKey (SObj, KN); >>\r
+  }\r
+  MinSize "=" MIN:Number ","                           << SObj.SetMinSize (_STOU8(MIN->getText())); >>\r
+  MaxSize "=" MAX:Number ","                           << SObj.SetMaxSize (_STOU8(MAX->getText())); >>\r
+  vfrStatementQuestionOptionList\r
+  E:EndString                                          << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStringFlagsField [CIfrString & SObj, UINT32 LineNum] :\r
+  <<\r
+     UINT8 LFlags = 0;\r
+     UINT8 HFlags = 0;\r
+  >>\r
+  stringFlagsField[HFlags, LFlags] ( "\|" stringFlagsField[HFlags, LFlags] )*\r
+                                                       << _PCATCH(SObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  ;\r
+\r
+stringFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | "MULTI_LINE"                                       << $LFlags = 0x01; >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+vfrStatementPassword :\r
+  <<\r
+     CIfrPassword PObj; \r
+  >>\r
+  L:Password                                           << PObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeader[PObj] ","\r
+  { F:FLAGS "=" vfrPasswordFlagsField[PObj, F->getLine()] "," }\r
+  {\r
+    Key "=" KN:Number ","                              << AssignQuestionKey (PObj, KN); >>\r
+  }\r
+  MinSize "=" MIN:Number ","                           << PObj.SetMinSize (_STOU16(MIN->getText())); >>\r
+  MaxSize "=" MAX:Number ","                           << PObj.SetMaxSize (_STOU16(MAX->getText())); >>\r
+  { Encoding "=" Number "," }\r
+  vfrStatementQuestionOptionList\r
+  E:EndPassword                                        << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrPasswordFlagsField [CIfrPassword & PObj, UINT32 LineNum] :\r
+  << UINT8 HFlags = 0; >>\r
+  passwordFlagsField[HFlags] ( "\|" passwordFlagsField[HFlags] )*\r
+                                                       << _PCATCH(PObj.SetFlags(HFlags), LineNum); >>\r
+  ;\r
+\r
+passwordFlagsField [UINT8 & HFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+vfrStatementOrderedList :\r
+  <<\r
+     CIfrOrderedList OLObj; \r
+  >>\r
+  L:OrderedList                                        << OLObj.SetLineNo(L->getLine()); >>\r
+  vfrQuestionHeader[OLObj] ","\r
+                                                       << OLObj.SetMaxContainers ((UINT8)_GET_CURRQEST_VARSIZE()); >>\r
+  { \r
+    MaxContainers "=" M:Number ","                     << OLObj.SetMaxContainers (_STOU8(M->getText())); >>\r
+  }\r
+  { F:FLAGS "=" vfrOrderedListFlags[OLObj, F->getLine()] }\r
+  vfrStatementQuestionOptionList\r
+  E:EndList                                            << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrOrderedListFlags [CIfrOrderedList & OLObj, UINT32 LineNum] :\r
+  <<\r
+     UINT8 HFlags = 0;\r
+     UINT8 LFlags = 0;\r
+  >>\r
+  orderedlistFlagsField[HFlags, LFlags] ( "\|" orderedlistFlagsField[HFlags, LFlags] )*\r
+                                                       << _PCATCH(OLObj.SetFlags (HFlags, LFlags), LineNum); >>\r
+  ;\r
+\r
+orderedlistFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
+    N:Number                                           << _PCATCH(_STOU8(N->getText()) == 0 ? VFR_RETURN_SUCCESS : VFR_RETURN_UNSUPPORTED, N->getLine()); >>\r
+  | "UNIQUE"                                           << $LFlags |= 0x01; >>\r
+  | "NOEMPTY"                                          << $LFlags |= 0x02; >>\r
+  | questionheaderFlagsField[HFlags]\r
+  ;\r
+\r
+vfrStatementTime :\r
+  <<\r
+     EFI_QUESTION_ID    QId          = EFI_QUESTION_ID_INVALID;\r
+     INT8               *VarIdStr[3] = {NULL, };\r
+     CIfrTime           TObj;\r
+     EFI_IFR_TYPE_VALUE Val;\r
+  >>\r
+  L:Time                                               << TObj.SetLineNo(L->getLine()); >>\r
+  (\r
+    (\r
+      vfrQuestionHeader[TObj, QUESTION_TIME] ","\r
+         { F:FLAGS "=" vfrTimeFlags[TObj, F->getLine()] "," }\r
+      vfrStatementDefault\r
+    )\r
+    |\r
+    (\r
+      Hour VarId "=" T1:StringIdentifier "." T1H:StringIdentifier ","\r
+                                                       << _STRCAT(&VarIdStr[0], T1->getText()); _STRCAT(&VarIdStr[0], "."); _STRCAT(&VarIdStr[0], T1H->getText()); >>\r
+      Prompt "=" "STRING_TOKEN" "\(" HP:Number "\)" ","\r
+      Help   "=" "STRING_TOKEN" "\(" HH:Number "\)" ","\r
+      minMaxTimeStepDefault[Val.time, 0]\r
+\r
+      Minute VarId "=" T2:StringIdentifier "." T2M:StringIdentifier ","\r
+                                                       << _STRCAT(&VarIdStr[1], T2->getText()); _STRCAT(&VarIdStr[1], "."); _STRCAT(&VarIdStr[1], T2M->getText()); >>\r
+      Prompt "=" "STRING_TOKEN" "\(" MP:Number "\)" ","\r
+      Help   "=" "STRING_TOKEN" "\(" MH:Number "\)" ","\r
+      minMaxTimeStepDefault[Val.time, 1]\r
+\r
+      Second VarId "=" T3:StringIdentifier "." T3S:StringIdentifier ","\r
+                                                       << _STRCAT(&VarIdStr[2], T3->getText()); _STRCAT(&VarIdStr[2], "."); _STRCAT(&VarIdStr[2], T3S->getText()); >>\r
+      Prompt "=" "STRING_TOKEN" "\(" SP:Number "\)" ","\r
+      Help   "=" "STRING_TOKEN" "\(" SH:Number "\)" ","\r
+      minMaxTimeStepDefault[Val.time, 2]\r
+                                                       <<\r
+                                                          mCVfrQuestionDB.RegisterOldTimeQuestion (VarIdStr[0], VarIdStr[1], VarIdStr[2], QId); \r
+                                                          TObj.SetQuestionId (QId);\r
+                                                          TObj.SetFlags (EFI_IFR_QUESTION_FLAG_DEFAULT, QF_TIME_STORAGE_TIME);\r
+                                                                                                                 TObj.SetPrompt (_STOSID(HP->getText()));\r
+                                                                                                                 TObj.SetHelp (_STOSID(HH->getText()));\r
+                                                                                                                 if (VarIdStr[0] != NULL) { delete VarIdStr[0]; } if (VarIdStr[1] != NULL) { delete VarIdStr[1]; } if (VarIdStr[2] != NULL) { delete VarIdStr[2]; }\r
+                                                       >>\r
+                                                       << {CIfrDefault DObj(EFI_HII_DEFAULT_CLASS_STANDARD, EFI_IFR_TYPE_TIME, Val);} >>\r
+    )\r
+  )\r
+  E:EndTime                                            << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+minMaxTimeStepDefault[EFI_HII_TIME & T, UINT8 KeyValue] :\r
+  Minimum   "=" Number ","\r
+  Maximum   "=" Number ","\r
+  { "step"    "=" Number "," }\r
+  {\r
+    "default" "=" N:Number ","                         <<\r
+                                                          switch (KeyValue) {\r
+                                                          case 0: T.Hour   = _STOU8(N->getText()); break; \r
+                                                          case 1: T.Minute = _STOU8(N->getText()); break; \r
+                                                          case 2: T.Second = _STOU8(N->getText()); break;\r
+                                                                                                                 } \r
+                                                       >>\r
+  }\r
+  ;\r
+\r
+vfrTimeFlags [CIfrTime & TObj, UINT32 LineNum] :\r
+  << UINT8 LFlags = 0; >>\r
+  timeFlagsField[LFlags] ( "\|" timeFlagsField[LFlags] )*\r
+                                                       << _PCATCH(TObj.SetFlags(EFI_IFR_QUESTION_FLAG_DEFAULT, LFlags), LineNum); >>\r
+  ;\r
+\r
+timeFlagsField [UINT8 & Flags] :\r
+    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+  | "HOUR_SUPPRESS"                                    << $Flags |= 0x01; >>\r
+  | "MINUTE_SUPPRESS"                                  << $Flags |= 0x02; >>\r
+  | "SECOND_SUPPRESS"                                  << $Flags |= 0x04; >>\r
+  | "STORAGE_NORMAL"                                   << $Flags |= 0x00; >>\r
+  | "STORAGE_TIME"                                     << $Flags |= 0x10; >>\r
+  | "STORAGE_WAKEUP"                                   << $Flags |= 0x20; >>\r
+  ;\r
+\r
+vfrStatementQuestionTag :\r
+  vfrStatementStatTag ","       |\r
+  vfrStatementInconsistentIf    |\r
+  vfrStatementNoSubmitIf        |\r
+  vfrStatementDisableIfQuest    |\r
+  vfrStatementRefresh           |\r
+  vfrStatementVarstoreDevice \r
+  ;\r
+\r
+vfrStatementQuestionTagList :\r
+  ( vfrStatementQuestionTag )*\r
+  ;\r
+\r
+vfrStatementQuestionOptionTag :\r
+  vfrStatementSuppressIfQuest   |\r
+  vfrStatementValue             |\r
+  vfrStatementDefault           |\r
+  vfrStatementOptions\r
+  ;\r
+\r
+vfrStatementQuestionOptionList :\r
+  (\r
+    vfrStatementQuestionTag     |\r
+    vfrStatementQuestionOptionTag \r
+  )*\r
+  ;\r
+\r
+vfrStatementStatList :\r
+  vfrStatementStat                        |\r
+  vfrStatementQuestions                   |\r
+  vfrStatementConditional                 |\r
+  // Just for framework vfr compatibility\r
+  vfrStatementLabel                       \r
+  //vfrStatementInvalid\r
+  ;\r
+\r
+vfrStatementDisableIfStat :\r
+  << CIfrDisableIf DIObj; >>\r
+  L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
+  vfrStatementExpression[0] ";"\r
+  ( vfrStatementStatList )*\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementSuppressIfStat :\r
+  << CIfrSuppressIf SIObj; >>\r
+  L:SuppressIf                                         << SIObj.SetLineNo(L->getLine()); >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0] ";"\r
+  ( vfrStatementStatList )*\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementGrayOutIfStat :\r
+  << CIfrGrayOutIf GOIObj; >>\r
+  L:GrayOutIf                                          << GOIObj.SetLineNo(L->getLine()); >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0]\r
+  ";"\r
+  ( vfrStatementStatList )*\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ";"\r
+  ;\r
+\r
+vfrImageTag :\r
+  << CIfrImage IObj; >>\r
+  L:Image "=" "IMAGE_TOKEN" "\(" S1:Number "\)"        << IObj.SetImageId (_STOSID(S1->getText())); IObj.SetLineNo(L->getLine()); >>\r
+  ;\r
+\r
+vfrLockedTag :\r
+  << CIfrLocked LObj; >>\r
+  L:Locked                                             << LObj.SetLineNo(L->getLine()); >>\r
+  ;\r
+\r
+vfrStatementStatTag :\r
+  vfrImageTag  |\r
+  vfrLockedTag\r
+  ;\r
+\r
+vfrStatementStatTagList :\r
+  vfrStatementStatTag ( "," vfrStatementStatTag )*\r
+  ;\r
+\r
+vfrStatementImage :\r
+  vfrImageTag\r
+  ";"\r
+  ;\r
+\r
+vfrStatementLocked :\r
+  vfrLockedTag\r
+  ";"\r
+  ;\r
+\r
+vfrStatementInconsistentIf :\r
+  << CIfrInconsistentIf IIObj; >>\r
+  L:InconsistentIf                                     << IIObj.SetLineNo(L->getLine()); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << IIObj.SetError (_STOSID(S->getText())); >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0]\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ;\r
+\r
+vfrStatementNoSubmitIf :\r
+  << CIfrNoSubmitIf NSIObj; >>\r
+  L:NoSubmitIf                                         << NSIObj.SetLineNo(L->getLine()); >>\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","     << NSIObj.SetError (_STOSID(S->getText())); >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0]\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ;\r
+\r
+vfrStatementDisableIfQuest :\r
+  << CIfrDisableIf DIObj; >>\r
+  L:DisableIf                                          << DIObj.SetLineNo(L->getLine()); >>\r
+  vfrStatementExpression[0] ";"\r
+  vfrStatementQuestionOptionList\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ;\r
+\r
+vfrStatementRefresh :\r
+  << CIfrRefresh RObj; >>\r
+  L:Refresh                                            << RObj.SetLineNo(L->getLine()); >>\r
+  Interval "=" I:Number                                << RObj.SetRefreshInterval (_STOU8(I->getText())); >>\r
+  ;\r
+\r
+vfrStatementVarstoreDevice :\r
+  << CIfrVarStoreDevice VDObj; >>\r
+  L:VarstoreDevice                                     << VDObj.SetLineNo(L->getLine()); >>\r
+  "=" "STRING_TOKEN" "\(" S:Number "\)" ","            << VDObj.SetDevicePath (_STOSID(S->getText())); >>\r
+  ;\r
+\r
+vfrStatementSuppressIfQuest :\r
+  << CIfrSuppressIf SIObj; >>\r
+  L:SuppressIf                                         << SIObj.SetLineNo(L->getLine()); >>\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0] ";"\r
+  vfrStatementQuestionOptionList\r
+  E:EndIf                                              << CRT_END_OP (E); >>\r
+  ;\r
+\r
+vfrStatementOptions :\r
+  vfrStatementOneOfOption\r
+  ;\r
+\r
+vfrStatementOneOfOption :\r
+  <<\r
+     EFI_IFR_TYPE_VALUE Val;\r
+     CIfrOneOfOption    OOOObj;\r
+     INT8               *VarStoreName = NULL;\r
+     \r
+  >>\r
+  L:Option                                             << OOOObj.SetLineNo(L->getLine()); >>\r
+  Text  "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << OOOObj.SetOption (_STOSID(S->getText())); >>\r
+  Value "=" vfrConstantValueField[_GET_CURRQEST_DATATYPE()] >[Val] ","    << OOOObj.SetType (_GET_CURRQEST_DATATYPE()); OOOObj.SetValue (Val); >>\r
+  F:FLAGS "=" vfrOneOfOptionFlags[OOOObj, F->getLine()]\r
+                                                       <<\r
+                                                          if (OOOObj.GetFlags () & 0x10) {\r
+                                                            _PCATCH(mCVfrDataStorage.GetVarStoreName (_GET_CURRQEST_VARTINFO().mVarStoreId, &VarStoreName), L->getLine());\r
+                                                            _PCATCH(mCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+                                                                                                                                                   EFI_HII_DEFAULT_CLASS_STANDARD, \r
+                                                                                                                                                                       _GET_CURRQEST_VARTINFO(), \r
+                                                                                                                                                                       VarStoreName, \r
+                                                                                                                                                                   _GET_CURRQEST_DATATYPE (), \r
+                                                                                                                                                                       Val\r
+                                                                                                                                                                       ), L->getLine());\r
+                                                          }\r
+                                                       >>\r
+  { "," Key "=" Number }                               // no use in UEFI2.1 VFR\r
+  (\r
+    "," vfrImageTag                                    << OOOObj.SetScope (1); CIfrEnd EOOOObj; >>\r
+  )*\r
+  ";"\r
+  ;\r
+\r
+vfrOneOfOptionFlags [CIfrOneOfOption & OOOObj, UINT32 LineNum] :\r
+  <<\r
+     UINT8 LFlags = _GET_CURRQEST_DATATYPE();\r
+     UINT8 HFlags = 0;\r
+  >>\r
+  oneofoptionFlagsField[HFlags, LFlags] ( "\|" oneofoptionFlagsField[HFlags, LFlags] )*\r
+                                                       << _PCATCH(gCurrentQuestion->SetFlags(HFlags), LineNum); >>\r
+                                                       << _PCATCH(OOOObj.SetFlags(LFlags), LineNum); >>\r
+  ;\r
+\r
+oneofoptionFlagsField [UINT8 & HFlags, UINT8 & LFlags] :\r
+    N:Number                                           << $LFlags |= _STOU8(N->getText()); >>\r
+  | "OPTION_DEFAULT"                                   << $LFlags |= 0x10; >>\r
+  | "OPTION_DEFAULT_MFG"                               << $LFlags |= 0x20; >>\r
+  | InteractiveFlag                                    << $HFlags |= 0x04; >>\r
+  | NVAccessFlag                                       << $HFlags |= 0x08; >>\r
+  | ResetRequiredFlag                                  << $HFlags |= 0x10; >>\r
+  | LateCheckFlag                                      << $HFlags |= 0x20; >>\r
+  | ManufacturingFlag                                  << $LFlags |= 0x20; >>\r
+  | DefaultFlag                                        << $LFlags |= 0x10; >>\r
+  ;\r
+\r
+//vfrStatementGuid :\r
+//  <<\r
+//     EFI_GUID Guid; \r
+//     CIfrGuid GObj;\r
+//  >>\r
+//  GuidAction\r
+//  GUID "=" \r
+//  OpenBrace\r
+//    G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number "," \r
+//    G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
+//  CloseBrace\r
+//                                                       << \r
+//                                                          _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (), \r
+//                                                                          G4->getText (), G5->getText (), G6->getText (), \r
+//                                                                          G7->getText (), G8->getText (), G9->getText (), \r
+//                                                                          G10->getText (), G11->getText ()); \r
+//                                                       >>\r
+//                                                       << GObj.SetGuid (&Guid); >>\r
+//  ";"\r
+//  ;\r
+\r
+vfrStatementLabel :\r
+  << CIfrLabel LObj; >>\r
+  L:Label                                              << LObj.SetLineNo(L->getLine()); >>\r
+  N:Number                                             << LObj.SetNumber (_STOU16(N->getText())); >>\r
+  ";"\r
+  ;\r
+\r
+vfrStatementBanner :\r
+  << CIfrBanner BObj; >>\r
+  B:Banner { "," }                                     << BObj.SetLineNo(B->getLine()); >>\r
+  Title "=" "STRING_TOKEN" "\(" S:Number "\)" ","      << BObj.SetTitle (_STOSID(S->getText())); >>\r
+  (\r
+    ( \r
+      Line L:Number ","                                << BObj.SetLine (_STOU16(L->getText())); >>\r
+      Align \r
+      (\r
+          Left                                         << BObj.SetAlign (0); >>\r
+        | Center                                       << BObj.SetAlign (1); >>\r
+        | Right                                        << BObj.SetAlign (2); >>\r
+      ) ";"\r
+    )\r
+    |\r
+    (\r
+      Timeout "=" T:Number ";"                         << {CIfrTimeout TObj(_STOU16(T->getText()));} >>\r
+    )\r
+  )\r
+  ;\r
+\r
+//******************************************************************************\r
+//\r
+// keep some syntax for compatibility but not generate any IFR object\r
+//\r
+vfrStatementInvalidHidden : \r
+  Hidden\r
+  Value "=" Number ","\r
+  Key "=" Number ";"\r
+  ;\r
+\r
+vfrStatementInvalidInconsistentIf :\r
+  InconsistentIf\r
+  Prompt "=" "STRING_TOKEN" "\(" S:Number "\)" ","\r
+  { FLAGS "=" flagsField ( "\|" flagsField )* "," }\r
+  vfrStatementExpression[0]\r
+  EndIf\r
+  ";"\r
+  ;\r
+\r
+vfrStatementInvalidInventory :\r
+  Inventory\r
+  Help "=" "STRING_TOKEN" "\(" Number "\)" ","\r
+  Text "=" "STRING_TOKEN" "\(" Number "\)" ","\r
+  {\r
+    Text  "=" "STRING_TOKEN" "\(" Number "\)"\r
+  }\r
+  ";" \r
+  ;\r
+\r
+vfrStatementInvalidSaveRestoreDefaults : \r
+  (Save | Restore)\r
+  Defaults ","\r
+  FormId "=" Number  ","\r
+  Prompt "=" "STRING_TOKEN" "\(" Number "\)" ","\r
+  Help   "=" "STRING_TOKEN" "\(" Number "\)" \r
+  { "," FLAGS "=" flagsField ( "\|" flagsField )* }\r
+  { "," Key   "=" Number }\r
+  ";"\r
+  ;\r
+\r
+//******************************************************************************\r
+//\r
+// The syntax of expression\r
+//\r
+#token Dup("dup")                               "dup"\r
+#token VarEqVal("vareqval")                     "vareqval"\r
+#token Var("var")                               "var"\r
+#token IdEqVal("ideqval")                       "ideqval"\r
+#token IdEqId("ideqid")                         "ideqid"\r
+#token IdEqValList("ideqvallist")               "ideqvallist"\r
+#token QuestionRef("questionref")               "questionref"\r
+#token RuleRef("ruleref")                       "ruleref"\r
+#token StringRef("stringref")                   "stringref"\r
+#token PushThis("pushthis")                     "pushthis"\r
+#token True("TRUE")                             "TRUE"\r
+#token False("FALSE")                           "FALSE"\r
+#token One("ONE")                               "ONE"\r
+#token Ones("ONES")                             "ONES"\r
+#token Zero("ZERO")                             "ZERO"\r
+#token Undefined("UNDEFINED")                   "UNDEFINED"\r
+#token Version("VERSOPM")                       "VERSION"\r
+#token Length("length")                         "length"\r
+#token AND("AND")                               "AND"\r
+#token OR("OR")                                 "OR"\r
+#token NOT("NOT")                               "NOT"\r
+#token BitWiseNot("~")                          "\~"\r
+#token BoolVal("boolval")                       "boolval"\r
+#token StringVal("stringval")                   "stringval"\r
+#token UnIntVal("unintval")                     "unintval"\r
+#token ToUpper("toupper")                       "toupper"\r
+#token ToLower("tolower")                       "tolower"\r
+#token Match("match")                           "match"\r
+#token Catenate("catenate")                     "catenate"\r
+#token QuestionRefVal("questionrefval")         "questionrefval"\r
+#token StringRefVal("stringrefval")             "stringrefval"\r
+\r
+vfrStatementExpression [UINT32 RootLevel, UINT32 ExpOpCount = 0] :\r
+                                                                                                          << if ($RootLevel == 0) {_CLEAR_SAVED_OPHDR ();} >>\r
+  andTerm[$RootLevel, $ExpOpCount]\r
+  (\r
+    L:OR andTerm[$RootLevel, $ExpOpCount]              << $ExpOpCount++; CIfrOr OObj(L->getLine()); >>\r
+  )*\r
+                                                       << if (($RootLevel == 0) && ($ExpOpCount > 1)) {_SET_SAVED_OPHDR_SCOPE(); CIfrEnd EObj; } >>\r
+  ;\r
+\r
+andTerm[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  bitwiseorTerm[$RootLevel, $ExpOpCount]\r
+  (\r
+    L:AND bitwiseorTerm [$RootLevel, $ExpOpCount]       << $ExpOpCount++; CIfrAnd AObj(L->getLine()); >>\r
+  )*\r
+  ;\r
+\r
+bitwiseorTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  bitwiseandTerm[$RootLevel, $ExpOpCount]          \r
+  (\r
+    L:"\|" bitwiseandTerm[$RootLevel, $ExpOpCount]      << $ExpOpCount++; CIfrBitWiseOr BWOObj(L->getLine()); >>\r
+  )*\r
+  ;\r
+\r
+bitwiseandTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  equalTerm[$RootLevel, $ExpOpCount]\r
+  (\r
+    L:"&" equalTerm[$RootLevel, $ExpOpCount]            << $ExpOpCount++; CIfrBitWiseAnd BWAObj(L->getLine()); >>\r
+  )*\r
+  ;\r
+\r
+equalTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  compareTerm[$RootLevel, $ExpOpCount]\r
+  (\r
+    (\r
+      L1:"==" compareTerm[$RootLevel, $ExpOpCount]      << $ExpOpCount++; CIfrEqual EObj(L1->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L2:"!=" compareTerm[$RootLevel, $ExpOpCount]      << $ExpOpCount++; CIfrNotEqual NEObj(L2->getLine()); >>\r
+    )\r
+  )*\r
+  ;\r
+\r
+compareTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  shiftTerm[$RootLevel, $ExpOpCount]\r
+  (\r
+    (\r
+      L1:"<" shiftTerm[$RootLevel, $ExpOpCount]         << $ExpOpCount++; CIfrLessThan LTObj(L1->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L2:"<=" shiftTerm[$RootLevel, $ExpOpCount]        << $ExpOpCount++; CIfrLessEqual LEObj(L2->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L3:">" shiftTerm[$RootLevel, $ExpOpCount]         << $ExpOpCount++; CIfrGreaterThan GTObj(L3->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L4:">=" shiftTerm[$RootLevel, $ExpOpCount]        << $ExpOpCount++; CIfrGreaterEqual GEObj(L4->getLine()); >>\r
+    )\r
+  )*\r
+  ;\r
+\r
+shiftTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  addMinusTerm[$RootLevel, $ExpOpCount]           \r
+  (\r
+    (\r
+      L1:"\<<" addMinusTerm[$RootLevel, $ExpOpCount]    << $ExpOpCount++; CIfrShiftLeft SLObj(L1->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L2:"\>>" addMinusTerm[$RootLevel, $ExpOpCount]    << $ExpOpCount++; CIfrShiftRight SRObj(L2->getLine()); >>\r
+    )\r
+  )*\r
+  ;\r
+\r
+addMinusTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  multdivmodTerm[$RootLevel, $ExpOpCount]\r
+  (\r
+    (\r
+      L1:"\+" multdivmodTerm[$RootLevel, $ExpOpCount]   << $ExpOpCount++; CIfrAdd AObj(L1->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L2:"\-" multdivmodTerm[$RootLevel, $ExpOpCount]   << $ExpOpCount++; CIfrSubtract SObj(L2->getLine()); >>\r
+    )\r
+  )*\r
+  ;\r
+\r
+multdivmodTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  atomTerm[$RootLevel, $ExpOpCount]\r
+  ( \r
+    (\r
+      L1:"\*" atomTerm[$RootLevel, $ExpOpCount]         << $ExpOpCount++; CIfrMultiply MObj(L1->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L2:"/" atomTerm[$RootLevel, $ExpOpCount]          << $ExpOpCount++; CIfrDivide DObj(L2->getLine()); >>\r
+    )\r
+    |\r
+    (\r
+      L3:"%" atomTerm[$RootLevel, $ExpOpCount]          << $ExpOpCount++; CIfrModulo MObj(L3->getLine()); >>\r
+    ) \r
+  )*\r
+  ;\r
+\r
+atomTerm [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+    vfrExpressionCatenate[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionMatch[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionParen[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionBuildInFunction[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionConstant[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionUnaryOp[$RootLevel, $ExpOpCount]\r
+  | vfrExpressionTernaryOp[$RootLevel, $ExpOpCount]\r
+  | (\r
+      L:NOT\r
+      atomTerm[$RootLevel, $ExpOpCount]                 << { CIfrNot NObj(L->getLine()); $ExpOpCount++; } >>\r
+    )\r
+  ;\r
+\r
+vfrExpressionCatenate [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  L:Catenate\r
+  "\("\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrCatenate CObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+vfrExpressionMatch [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  L:Match\r
+  "\("\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrMatch MObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+vfrExpressionParen [UINT32 & RootLevel, UINT32 & ExpOpCount]:\r
+  "\("\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"\r
+  ;\r
+\r
+vfrExpressionBuildInFunction [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+    dupExp[$RootLevel, $ExpOpCount]\r
+  | ideqvalExp[$RootLevel, $ExpOpCount]\r
+  | ideqidExp[$RootLevel, $ExpOpCount]\r
+  | ideqvallistExp[$RootLevel, $ExpOpCount]\r
+  | questionref13Exp[$RootLevel, $ExpOpCount]\r
+  | rulerefExp[$RootLevel, $ExpOpCount]\r
+  | stringref1Exp[$RootLevel, $ExpOpCount]\r
+  | pushthisExp[$RootLevel, $ExpOpCount]\r
+  ;\r
+\r
+dupExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:Dup                                                << { CIfrDup DObj(L->getLine()); _SAVE_OPHDR_COND(DObj, ($ExpOpCount == 0)); $ExpOpCount++; } >>\r
+  ;\r
+\r
+ideqvalExp [UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_QUESTION_ID QId;\r
+     UINT32          Mask;\r
+     UINT16          ConstVal;\r
+     INT8            *VarIdStr;\r
+     UINT32          LineNo;\r
+  >>\r
+  L:IdEqVal\r
+  vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
+  (\r
+    (\r
+      "=="\r
+      V1:Number                                        << ConstVal = _STOU16(V1->getText()); >>\r
+                                                       <<\r
+                                                                                                             if (Mask == 0) {\r
+                                                                                                                       CIfrEqIdVal EIVObj (L->getLine());\r
+                                                                                                                       _SAVE_OPHDR_COND (EIVObj, ($ExpOpCount == 0));\r
+                                                                                                                       EIVObj.SetQuestionId (QId, VarIdStr, LineNo);\r
+                                                                                                                       EIVObj.SetValue (ConstVal);\r
+                                                                                                                       $ExpOpCount++;                                                                                                                  \r
+                                                                                                                 } else {\r
+                                                                                                                       IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, EQUAL);\r
+                                                                                                                 }\r
+                                                                                                          >>\r
+    )\r
+    |\r
+    (\r
+      "<="\r
+      V2:Number                                        << ConstVal = _STOU16(V2->getText()); >>\r
+                                                       << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_EQUAL); >>\r
+    )\r
+    |\r
+    (\r
+      "<"\r
+      V3:Number                                        << ConstVal = _STOU16(V3->getText()); >>\r
+                                                       << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, LESS_THAN); >>\r
+    )\r
+    |\r
+    (\r
+      ">="\r
+      V4:Number                                        << ConstVal = _STOU16(V4->getText()); >>\r
+                                                       << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_EQUAL); >>\r
+    )\r
+    |\r
+    (\r
+      ">"\r
+      V5:Number                                        << ConstVal = _STOU16(V5->getText()); >>\r
+                                                       << IdEqValDoSpecial ($ExpOpCount, L->getLine(), QId, VarIdStr, Mask, ConstVal, GREATER_THAN); >>\r
+    )\r
+  )\r
+  ;\r
+\r
+ideqidExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     EFI_QUESTION_ID QId[2];\r
+     UINT32          Mask[2];\r
+     INT8            *VarIdStr[2];\r
+     UINT32          LineNo[2];\r
+  >>\r
+  L:IdEqId\r
+  vfrQuestionDataFieldName[QId[0], Mask[0], VarIdStr[0], LineNo[0]]\r
+  (\r
+    (\r
+      "==" \r
+      vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
+                                                       <<\r
+                                                                                                             if (Mask[0] & Mask[1]) {\r
+                                                                                                                       IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], EQUAL);\r
+                                                                                                                 } else {\r
+                                                            CIfrEqIdId      EIIObj(L->getLine());\r
+                                                                                                                       _SAVE_OPHDR_COND (EIIObj, ($ExpOpCount == 0));\r
+                                                            EIIObj.SetQuestionId1 (QId[0], VarIdStr[0], LineNo[0]);\r
+                                                                                                                       EIIObj.SetQuestionId2 (QId[1], VarIdStr[1], LineNo[1]);\r
+                                                                                                                       $ExpOpCount++;                                                                                                                  \r
+                                                                                                                 }\r
+                                                                                                          >>\r
+    )\r
+    |\r
+    (\r
+      "<="\r
+      vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
+                                                       << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_EQUAL); >>\r
+    )\r
+    |\r
+    (\r
+      "<"\r
+      vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
+                                                       << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], LESS_THAN); >>\r
+    )\r
+    |\r
+    (\r
+      ">="\r
+      vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
+                                                       << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_EQUAL); >>\r
+    )\r
+    |\r
+    (\r
+      ">"\r
+      vfrQuestionDataFieldName[QId[1], Mask[1], VarIdStr[1], LineNo[1]]\r
+                                                       << IdEqIdDoSpecial ($ExpOpCount, L->getLine(), QId[0], VarIdStr[0], Mask[0], QId[1], VarIdStr[1], Mask[1], GREATER_THAN); >>\r
+    )\r
+  )\r
+  ;\r
+\r
+ideqvallistExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     UINT16          ListLen = 0;\r
+     EFI_QUESTION_ID QId;\r
+     UINT32          Mask;\r
+     UINT16          ValueList[EFI_IFR_MAX_LENGTH] = {0,};\r
+     INT8            *VarIdStr;\r
+     UINT32          LineNo;\r
+  >>\r
+  L:IdEqValList\r
+  vfrQuestionDataFieldName[QId, Mask, VarIdStr, LineNo]\r
+  "==" \r
+  (\r
+    V:Number                                           << ValueList[ListLen] = _STOU16(V->getText()); ListLen++; >>\r
+  )+\r
+                                                       <<\r
+                                                                                                             if (Mask != 0) {\r
+                                                            IdEqListDoSpecial ($ExpOpCount, LineNo, QId, VarIdStr, Mask, ListLen, ValueList);\r
+                                                                                                                 } else {\r
+                                                                                           UINT16       Index;\r
+                                                            CIfrEqIdList EILObj(L->getLine());\r
+                                                                                                                       _SAVE_OPHDR_COND (EILObj, ($ExpOpCount == 0));\r
+                                                            EILObj.SetQuestionId (QId, VarIdStr, LineNo);\r
+                                                                                                                       EILObj.SetListLength (ListLen);\r
+                                                                                                                       for (Index = 0; Index < ListLen; Index++) {\r
+                                                                                                                         EILObj.SetValueList (Index, ValueList[Index]);\r
+                                                                                                                       }\r
+                                                                                                                       $ExpOpCount++;\r
+                                                                                                                 }\r
+                                                                                                          >>\r
+  ;\r
+\r
+vareqvarlExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:VarEqVal Var "\(" V1:Number "\)" "==" V2:Number    <<\r
+                                                          {\r
+                                                            CIfrUint64 U64Obj1(L->getLine()), U64Obj2(L->getLine()); \r
+                                                            _SAVE_OPHDR_COND (U64Obj1, ($ExpOpCount == 0)); \r
+                                                            U64Obj1.SetValue (_STOU64(V1->getText())); \r
+                                                            U64Obj2.SetValue (_STOU64(V2->getText()));\r
+                                                          }\r
+                                                       >>\r
+                                                       << {CIfrEqual EObj(L->getLine()); } >>\r
+                                                                                                          << $ExpOpCount += 3; >>\r
+  ;\r
+\r
+questionref13Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  <<\r
+     UINT8           Type = 0x1;\r
+     EFI_STRING_ID   DevPath;\r
+     EFI_GUID        Guid;\r
+        EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
+     UINT32          BitMask;\r
+     INT8            *QName = NULL;\r
+     UINT32          LineNo = 0;\r
+  >>\r
+  L:QuestionRef\r
+  (\r
+    (\r
+                                                       << Type = 0x3; >>\r
+      {\r
+        Path "=" "STRING_TOKEN" "\(" S:Number "\)"     << Type = 0x4; DevPath = _STOSID(S->getText()); >>\r
+      }\r
+      {\r
+        GUID "=" \r
+          OpenBrace\r
+            G1:Number "," G2:Number "," G3:Number "," G4:Number "," G5:Number "," G6:Number "," \r
+            G7:Number "," G8:Number "," G9:Number "," G10:Number "," G11:Number\r
+          CloseBrace\r
+                                                       <<\r
+                                                          Type = 0x5;\r
+                                                          _CRGUID (&Guid, G1->getText (), G2->getText (), G3->getText (), \r
+                                                                          G4->getText (), G5->getText (), G6->getText (), \r
+                                                                          G7->getText (), G8->getText (), G9->getText (), \r
+                                                                          G10->getText (), G11->getText ()); \r
+                                                       >>\r
+      }\r
+    )\r
+    |\r
+    (\r
+      "\("\r
+         (\r
+          QN:StringIdentifier                          << \r
+                                                          QName  = QN->getText();\r
+                                                                                                                 LineNo = QN->getLine();\r
+                                                          mCVfrQuestionDB.GetQuestionId (QN->getText(), NULL, QId, BitMask);\r
+                                                       >>\r
+        | ID:Number                                    << QId = _STOQID(ID->getText()); >>\r
+      )\r
+      "\)"\r
+    )\r
+  )\r
+                                                       <<\r
+                                                          switch (Type) {\r
+                                                          case 0x1: {CIfrQuestionRef1 QR1Obj(L->getLine()); _SAVE_OPHDR_COND (QR1Obj, ($ExpOpCount == 0)); QR1Obj.SetQuestionId (QId, QName, LineNo); break;}\r
+                                                          case 0x3: {CIfrQuestionRef3 QR3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3Obj, ($ExpOpCount == 0)); break;}\r
+                                                          case 0x4: {CIfrQuestionRef3_2 QR3_2Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_2Obj, ($ExpOpCount == 0)); QR3_2Obj.SetDevicePath (DevPath); break;}\r
+                                                          case 0x5: {CIfrQuestionRef3_3 QR3_3Obj(L->getLine()); _SAVE_OPHDR_COND (QR3_3Obj, ($ExpOpCount == 0)); QR3_3Obj.SetDevicePath (DevPath); QR3_3Obj.SetGuid (&Guid); break;}\r
+                                                          }\r
+                                                          $ExpOpCount++;\r
+                                                       >>\r
+  ;\r
+\r
+rulerefExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:RuleRef\r
+  "\(" RN:StringIdentifier "\)"                        << { CIfrRuleRef RRObj(L->getLine()); _SAVE_OPHDR_COND (RRObj, ($ExpOpCount == 0)); RRObj.SetRuleId (mCVfrRulesDB.GetRuleId (RN->getText())); } $ExpOpCount++; >>\r
+  ;\r
+\r
+//******************************************************\r
+// PARSE:\r
+//   stringref (STR_FORM_SET_TITLE)\r
+//\r
+stringref1Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:StringRef\r
+  "\(" S:Number "\)"                                   << { CIfrStringRef1 SR1Obj(L->getLine()); _SAVE_OPHDR_COND (SR1Obj, ($ExpOpCount == 0)); SR1Obj.SetStringId (_STOSID(S->getText())); $ExpOpCount++; } >>\r
+  ;\r
+\r
+pushthisExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:PushThis                                           << { CIfrThis TObj(L->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0)); $ExpOpCount++; } >>\r
+  ;\r
+\r
+vfrExpressionConstant[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+    L1:True                                            << CIfrTrue TObj(L1->getLine()); _SAVE_OPHDR_COND (TObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | L2:False                                           << CIfrFalse FObj(L2->getLine()); _SAVE_OPHDR_COND (FObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | L3:One                                             << CIfrOne OObj(L3->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | L4:Ones                                            << CIfrOnes OObj(L4->getLine()); _SAVE_OPHDR_COND (OObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | L5:Zero                                            << CIfrZero ZObj(L5->getLine()); _SAVE_OPHDR_COND (ZObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | L6:Undefined                                       << CIfrUndefined UObj(L6->getLine()); _SAVE_OPHDR_COND (UObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | L7:Version                                         << CIfrVersion VObj(L7->getLine()); _SAVE_OPHDR_COND (VObj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  | V:Number                                           << CIfrUint64 U64Obj(V->getLine()); U64Obj.SetValue (_STOU64(V->getText())); _SAVE_OPHDR_COND (U64Obj, ($ExpOpCount == 0)); $ExpOpCount++; >>\r
+  ;\r
+\r
+vfrExpressionUnaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+    lengthExp[$RootLevel, $ExpOpCount]\r
+  | bitwisenotExp[$RootLevel, $ExpOpCount]\r
+  | question2refExp[$RootLevel, $ExpOpCount]\r
+  | stringref2Exp[$RootLevel, $ExpOpCount]\r
+  | unintExp[$RootLevel, $ExpOpCount]\r
+  | toupperExp[$RootLevel, $ExpOpCount]\r
+  | tolwerExp[$RootLevel, $ExpOpCount]\r
+  ;\r
+\r
+lengthExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:Length\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrLength LObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+bitwisenotExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:BitWiseNot\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrBitWiseNot BWNObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+question2refExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:QuestionRefVal\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrQuestionRef2 QR2Obj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+stringref2Exp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:StringRefVal\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrStringRef2 SR2Obj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+toboolExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:BoolVal\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrToBoolean TBObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+tostringExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  << UINT8 Fmt = 0; >>\r
+  L:StringVal\r
+  {\r
+    Format "=" F:Number ","                            << Fmt = _STOU8(F->getText()); >>\r
+  }\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrToString TSObj(L->getLine()); TSObj.SetFormat (Fmt); $ExpOpCount++; } >>\r
+  ;\r
+\r
+unintExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:UnIntVal\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrToUint TUObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+toupperExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:ToUpper\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrToUpper TUObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+tolwerExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:ToLower\r
+  "\(" vfrStatementExpression[$RootLevel + 1, $ExpOpCount] "\)"\r
+                                                       << { CIfrToLower TLObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+vfrExpressionTernaryOp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+    conditionalExp[$RootLevel, $ExpOpCount]\r
+  | findExp[$RootLevel, $ExpOpCount]\r
+  | midExp[$RootLevel, $ExpOpCount]\r
+  | tokenExp[$RootLevel, $ExpOpCount]\r
+  | spanExp[$RootLevel, $ExpOpCount]\r
+  ;\r
+\r
+#token Cond("cond")                                    "cond"\r
+#token Find("find")                                    "find"\r
+#token Mid("mid")                                      "mid"\r
+#token Tok("token")                                    "token"\r
+#token Span("span")                                    "span"\r
+\r
+conditionalExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:Cond "\("\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "?"\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ":"\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrConditional CObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+findExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  << UINT8 Format; >>\r
+  L:Find "\("\r
+  findFormat[Format] ( "\|" findFormat[Format] )*\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "," \r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrFind FObj(L->getLine()); FObj.SetFormat (Format); $ExpOpCount++; } >>\r
+  ;\r
+\r
+findFormat [UINT8 & Format] :\r
+    "SENSITIVE"                                        << $Format = 0x00; >>\r
+  | "INSENSITIVE"                                      << $Format = 0x01; >>\r
+  ;\r
+\r
+midExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:Mid "\("\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrMid MObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+tokenExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  L:Tok "\("\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "," \r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrToken TObj(L->getLine()); $ExpOpCount++; } >>\r
+  ;\r
+\r
+spanExp[UINT32 & RootLevel, UINT32 & ExpOpCount] :\r
+  << UINT8 Flags = 0; >>\r
+  S:Span "\("\r
+  FLAGS "=" spanFlags[Flags] ( "\|" spanFlags[Flags] )*\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  ","\r
+  vfrStatementExpression[$RootLevel + 1, $ExpOpCount]\r
+  "\)"                                                 << { CIfrSpan SObj(S->getLine()); SObj.SetFlags(Flags); $ExpOpCount++; } >>\r
+  ;\r
+\r
+spanFlags [UINT8 & Flags] :\r
+    N:Number                                           << $Flags |= _STOU8(N->getText()); >>\r
+  | "LAST_NON_MATCH"                                   << $Flags |= 0x00; >>\r
+  | "FIRST_NON_MATCH"                                  << $Flags |= 0x01; >>\r
+  ;\r
+\r
+#token StringIdentifier("string identifier")    "[A-Za-z_][A-Za-z_0-9]*"\r
+#token Number("numeric value")                  "(0x[0-9A-Fa-f]+) | [0-9]+"\r
+\r
+//******************************************************************************\r
+//\r
+// Parser class definition. \r
+//  \r
+class EfiVfrParser {\r
+<<\r
+private:\r
+  UINT8               mParserStatus;\r
+\r
+  CVfrDefaultStore    mCVfrDefaultStore;\r
+  CVfrVarDataTypeDB   mCVfrVarDataTypeDB;\r
+  CVfrDataStorage     mCVfrDataStorage;\r
+  CVfrQuestionDB      mCVfrQuestionDB;\r
+  CVfrRulesDB         mCVfrRulesDB;\r
+\r
+  CIfrOpHeader        *mCIfrOpHdr;\r
+  VOID                _SAVE_OPHDR_COND (IN CIfrOpHeader &, IN BOOLEAN);\r
+  VOID                _CLEAR_SAVED_OPHDR (VOID);\r
+  VOID                _SET_SAVED_OPHDR_SCOPE (VOID);\r
+\r
+\r
+  EFI_VARSTORE_INFO   mCurrQestVarInfo;\r
+\r
+  VOID                _CRT_OP (IN BOOLEAN);\r
+\r
+  VOID                _SAVE_CURRQEST_VARINFO (IN EFI_VARSTORE_INFO &);\r
+  EFI_VARSTORE_INFO & _GET_CURRQEST_VARTINFO (VOID);\r
+\r
+  UINT8               _GET_CURRQEST_DATATYPE ();\r
+  UINT32              _GET_CURRQEST_VARSIZE ();\r
+\r
+public:\r
+  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr, IN INT8 *);\r
+  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE);\r
+  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN ANTLRTokenPtr);\r
+  VOID                _PCATCH (IN EFI_VFR_RETURN_CODE, IN UINT32);\r
+\r
+  VOID                syn     (ANTLRAbstractToken  *, ANTLRChar *, SetWordType *, ANTLRTokenType, INT32);\r
+\r
+  INT8 *              TrimHex (IN INT8 *, OUT BOOLEAN *);\r
+  UINT8               _STOU8  (IN INT8 *);\r
+  UINT16              _STOU16 (IN INT8 *);\r
+  UINT32              _STOU32 (IN INT8 *);\r
+  UINT64              _STOU64 (IN INT8 *);\r
+  EFI_HII_DATE        _STOD   (IN INT8 *, IN INT8 *, IN INT8 *);\r
+  EFI_HII_TIME        _STOT   (IN INT8 *, IN INT8 *, IN INT8 *);\r
+\r
+  EFI_STRING_ID       _STOSID (IN INT8 *);\r
+  EFI_FORM_ID         _STOFID (IN INT8 *);\r
+  EFI_QUESTION_ID     _STOQID (IN INT8 *);\r
+\r
+  VOID                _STRCAT (IN OUT INT8 **, IN INT8 *);\r
+\r
+  VOID                _CRGUID (EFI_GUID *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *, INT8 *);\r
+  VOID                _DeclareDefaultLinearVarStore (IN UINT32);\r
+  VOID                _DeclareStandardDefaultStorage (IN UINT32);\r
+\r
+\r
+  VOID                AssignQuestionKey (IN CIfrQuestionHeader &, IN ANTLRTokenPtr);\r
+\r
+  VOID                ConvertIdExpr         (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32);\r
+  VOID                IdEqValDoSpecial      (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN UINT16, IN EFI_COMPARE_TYPE);\r
+  VOID                IdEqIdDoSpecial       (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN EFI_COMPARE_TYPE);\r
+  VOID                IdEqListDoSpecial     (IN UINT32 &, IN UINT32, IN EFI_QUESTION_ID, IN INT8 *, IN UINT32, IN UINT16, IN UINT16 *);\r
+>>\r
+}\r
+\r
+<<\r
+VOID\r
+EfiVfrParser::_SAVE_OPHDR_COND (\r
+  IN CIfrOpHeader &OpHdr, \r
+  IN BOOLEAN      Cond\r
+  )\r
+{\r
+  if (Cond == TRUE) {\r
+#ifdef VFREXP_DEBUG\r
+    printf ("######_SAVE_OPHDR_COND\n");\r
+#endif\r
+    if (mCIfrOpHdr != NULL) {\r
+#ifdef VFREXP_DEBUG\r
+      printf ("######_SAVE_OPHDR_COND Error\n");\r
+#endif\r
+      return ;\r
+    }\r
+       mCIfrOpHdr = new CIfrOpHeader(OpHdr);\r
+  }\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_CLEAR_SAVED_OPHDR (\r
+  VOID\r
+  )\r
+{\r
+#ifdef VFREXP_DEBUG\r
+  printf ("######_CLEAR_SAVED_OPHDR\n");\r
+#endif\r
+  mCIfrOpHdr = NULL;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_SET_SAVED_OPHDR_SCOPE (\r
+  VOID\r
+  )\r
+{\r
+#ifdef VFREXP_DEBUG\r
+  printf ("#######_SET_SAVED_OPHDR_SCOPE\n");\r
+#endif\r
+  mCIfrOpHdr->SetScope (1);\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_CRT_OP (\r
+  IN BOOLEAN Crt\r
+  )\r
+{\r
+  gCreateOp = Crt;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_SAVE_CURRQEST_VARINFO (\r
+  IN EFI_VARSTORE_INFO &Info\r
+  )\r
+{\r
+  mCurrQestVarInfo = Info;\r
+}\r
+\r
+EFI_VARSTORE_INFO &\r
+EfiVfrParser::_GET_CURRQEST_VARTINFO (\r
+  VOID\r
+  )\r
+{\r
+  return mCurrQestVarInfo;\r
+}\r
+\r
+UINT8\r
+EfiVfrParser::_GET_CURRQEST_DATATYPE (\r
+  VOID\r
+  )\r
+{\r
+  return mCurrQestVarInfo.mVarType;\r
+}\r
+\r
+UINT32\r
+EfiVfrParser::_GET_CURRQEST_VARSIZE (\r
+  VOID\r
+  )\r
+{\r
+  return mCurrQestVarInfo.mVarTotalSize;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_PCATCH (\r
+  IN EFI_VFR_RETURN_CODE ReturnCode,\r
+  IN EFI_VFR_RETURN_CODE ExpectCode,\r
+  IN ANTLRTokenPtr       Tok,\r
+  IN INT8                *ErrorMsg\r
+  )\r
+{\r
+  if (ReturnCode != ExpectCode) {\r
+    mParserStatus++;\r
+    gCVfrErrorHandle.PrintError (Tok->getLine(), Tok->getText(), ErrorMsg);\r
+  }\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_PCATCH (\r
+  IN EFI_VFR_RETURN_CODE ReturnCode\r
+  )\r
+{\r
+  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode);\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_PCATCH (\r
+  IN EFI_VFR_RETURN_CODE ReturnCode,\r
+  IN ANTLRTokenPtr       Tok\r
+  )\r
+{\r
+  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, Tok->getLine(), Tok->getText());\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_PCATCH (\r
+  IN EFI_VFR_RETURN_CODE ReturnCode,\r
+  IN UINT32              LineNum\r
+  )\r
+{\r
+  mParserStatus += gCVfrErrorHandle.HandleError (ReturnCode, LineNum);\r
+}\r
+\r
+VOID \r
+EfiVfrParser::syn (\r
+  ANTLRAbstractToken  *Tok, \r
+  ANTLRChar           *Egroup, \r
+  SetWordType         *Eset, \r
+  ANTLRTokenType      ETok, \r
+  INT32               Huh\r
+  )\r
+{\r
+  gCVfrErrorHandle.HandleError (VFR_RETURN_MISMATCHED, Tok->getLine(), Tok->getText());\r
+\r
+  mParserStatus += 1;\r
+}\r
+\r
+INT8 *\r
+EfiVfrParser::TrimHex (\r
+  IN  INT8    *Str,\r
+  OUT BOOLEAN *IsHex\r
+  )\r
+{\r
+  *IsHex = FALSE;\r
+\r
+  while (*Str && *Str == ' ') {\r
+    Str++;\r
+  }\r
+  while (*Str && *Str == '0') {\r
+    Str++;\r
+  }\r
+  if (*Str && (*Str == 'x' || *Str == 'X')) {\r
+    Str++;\r
+    *IsHex = TRUE;\r
+  }\r
+\r
+  return Str;\r
+}\r
+\r
+UINT8\r
+EfiVfrParser::_STOU8 (\r
+  IN INT8 *Str\r
+  )\r
+{\r
+  BOOLEAN IsHex;\r
+  UINT8   Value;\r
+  INT8    c;\r
+\r
+  Str = TrimHex (Str, &IsHex);\r
+  for (Value = 0; (c = *Str) != '\0'; Str++) {\r
+    //\r
+    // BUG: does not handle overflow here\r
+    //\r
+       (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
+\r
+    if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
+      Value += (c - 'a' + 10);\r
+    }\r
+    if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
+      Value += (c - 'A' + 10);\r
+    }\r
+    if (c >= '0' && c <= '9') {\r
+      Value += (c - '0');\r
+    } \r
+  }\r
+\r
+  return Value;\r
+}\r
+\r
+UINT16\r
+EfiVfrParser::_STOU16 (\r
+  IN INT8 *Str\r
+  )\r
+{\r
+  BOOLEAN IsHex;\r
+  UINT16  Value;\r
+  INT8    c;\r
+\r
+  Str = TrimHex (Str, &IsHex);\r
+  for (Value = 0; (c = *Str) != '\0'; Str++) {\r
+    //\r
+    // BUG: does not handle overflow here\r
+    //\r
+       (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
+\r
+    if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
+      Value += (c - 'a' + 10);\r
+    }\r
+    if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
+      Value += (c - 'A' + 10);\r
+    }\r
+    if (c >= '0' && c <= '9') {\r
+      Value += (c - '0');\r
+    } \r
+  }\r
+\r
+  return Value;\r
+}\r
+\r
+UINT32\r
+EfiVfrParser::_STOU32 (\r
+  IN INT8 *Str\r
+  )\r
+{\r
+  BOOLEAN IsHex;\r
+  UINT32  Value;\r
+  INT8    c;\r
+\r
+  Str = TrimHex (Str, &IsHex);\r
+  for (Value = 0; (c = *Str) != '\0'; Str++) {\r
+    //\r
+    // BUG: does not handle overflow here\r
+    //\r
+       (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
+\r
+    if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
+      Value += (c - 'a' + 10);\r
+    }\r
+    if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
+      Value += (c - 'A' + 10);\r
+    }\r
+    if (c >= '0' && c <= '9') {\r
+      Value += (c - '0');\r
+    } \r
+  }\r
+\r
+  return Value;\r
+}\r
+\r
+UINT64\r
+EfiVfrParser::_STOU64 (\r
+  IN INT8 *Str\r
+  )\r
+{ \r
+  BOOLEAN IsHex;\r
+  UINT64  Value;\r
+  INT8    c;\r
+\r
+  Str = TrimHex (Str, &IsHex);\r
+  for (Value = 0; (c = *Str) != '\0'; Str++) {\r
+    //\r
+    // BUG: does not handle overflow here\r
+    //\r
+       (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
+\r
+    if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
+      Value += (c - 'a' + 10);\r
+    }\r
+    if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
+      Value += (c - 'A' + 10);\r
+    }\r
+    if (c >= '0' && c <= '9') {\r
+      Value += (c - '0');\r
+    } \r
+  }\r
+\r
+  return Value;\r
+} \r
+\r
+EFI_HII_DATE\r
+EfiVfrParser::_STOD (\r
+  IN INT8 *Year, \r
+  IN INT8 *Month, \r
+  IN INT8 *Day\r
+  )\r
+{\r
+  EFI_HII_DATE Date;\r
+\r
+  Date.Year  = _STOU16 (Year);\r
+  Date.Month = _STOU8 (Month);\r
+  Date.Day   = _STOU8 (Day);\r
+\r
+  return Date;\r
+}\r
+\r
+EFI_HII_TIME\r
+EfiVfrParser::_STOT (\r
+  IN INT8 *Hour, \r
+  IN INT8 *Minute, \r
+  IN INT8 *Second\r
+  )\r
+{\r
+  EFI_HII_TIME Time;\r
+\r
+  Time.Hour   = _STOU8 (Hour);\r
+  Time.Minute = _STOU8 (Minute);\r
+  Time.Second = _STOU8 (Second);\r
+\r
+  return Time;\r
+}\r
+\r
+EFI_STRING_ID\r
+EfiVfrParser::_STOSID (\r
+  IN INT8 *Str\r
+  )\r
+{\r
+  return (EFI_STRING_ID)_STOU16(Str);\r
+}\r
+\r
+EFI_FORM_ID\r
+EfiVfrParser::_STOFID (\r
+  IN INT8 *Str\r
+  )\r
+{\r
+  return (EFI_FORM_ID)_STOU16(Str);\r
+}\r
+\r
+EFI_QUESTION_ID \r
+EfiVfrParser::_STOQID (\r
+  IN INT8 *Str\r
+  )\r
+{\r
+  return (EFI_QUESTION_ID)_STOU16(Str);\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_STRCAT (\r
+  IN OUT INT8 **Dest,\r
+  IN INT8     *Src\r
+  )\r
+{\r
+  INT8   *NewStr;\r
+  UINT32 Len;\r
+\r
+  if ((Dest == NULL) || (Src == NULL)) {\r
+    return;\r
+  }\r
+\r
+  Len = (*Dest == NULL) ? 0 : strlen (*Dest);\r
+  Len += strlen (Src);\r
+  if ((NewStr = new INT8[Len + 1]) == NULL) {\r
+    return;\r
+  }\r
+  NewStr[0] = '\0';\r
+  if (*Dest != NULL) {\r
+    strcpy (NewStr, *Dest);\r
+  }\r
+  strcat (NewStr, Src);\r
+\r
+  *Dest = NewStr;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_CRGUID (\r
+  IN EFI_GUID *Guid, \r
+  IN INT8     *G1, \r
+  IN INT8     *G2, \r
+  IN INT8     *G3, \r
+  IN INT8     *G4, \r
+  IN INT8     *G5, \r
+  IN INT8     *G6, \r
+  IN INT8     *G7, \r
+  IN INT8     *G8, \r
+  IN INT8     *G9, \r
+  IN INT8     *G10, \r
+  IN INT8     *G11\r
+  )\r
+{\r
+  Guid->Data1 = _STOU32 (G1);\r
+  Guid->Data2 = _STOU16 (G2);\r
+  Guid->Data3 = _STOU16 (G3);\r
+  Guid->Data4[0] = _STOU8(G4);\r
+  Guid->Data4[1] = _STOU8(G5);\r
+  Guid->Data4[2] = _STOU8(G6);\r
+  Guid->Data4[3] = _STOU8(G7);\r
+  Guid->Data4[4] = _STOU8(G8);\r
+  Guid->Data4[5] = _STOU8(G9);\r
+  Guid->Data4[6] = _STOU8(G10);\r
+  Guid->Data4[7] = _STOU8(G11);\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_DeclareDefaultLinearVarStore (\r
+  IN UINT32 LineNo\r
+  )\r
+{\r
+  UINT32            Index;\r
+  INT8              **TypeNameList;\r
+  UINT32            ListSize;\r
+  EFI_GUID          DefaultGuid =  { 0x9db3c415, 0xda00, 0x4233, { 0xae, 0xc6, 0x79, 0xb, 0x4f, 0x5b, 0x45, 0x66 } };\r
+\r
+  mCVfrVarDataTypeDB.GetUserDefinedTypeNameList (&TypeNameList, &ListSize);\r
+\r
+  for (Index = 0; Index < ListSize; Index++) {\r
+    UINT32            Size;\r
+    EFI_VARSTORE_ID   VarStoreId;\r
+    CIfrVarStore      VSObj;\r
+\r
+    VSObj.SetLineNo (LineNo);\r
+    mCVfrDataStorage.DeclareBufferVarStore (\r
+                       TypeNameList[Index], \r
+                       &DefaultGuid, \r
+                       &mCVfrVarDataTypeDB, \r
+                       TypeNameList[Index],\r
+                       EFI_VARSTORE_ID_INVALID\r
+                       );\r
+    mCVfrDataStorage.GetVarStoreId(TypeNameList[Index], &VarStoreId);\r
+    VSObj.SetVarStoreId (VarStoreId);\r
+    mCVfrVarDataTypeDB.GetDataTypeSize(TypeNameList[Index], &Size);\r
+    VSObj.SetSize (Size);\r
+    VSObj.SetName (TypeNameList[Index]);\r
+    VSObj.SetGuid (&DefaultGuid);\r
+  }\r
+\r
+  if (mCVfrVarDataTypeDB.IsTypeNameDefined ("Date") == FALSE) {\r
+    UINT32            Size;\r
+    EFI_VARSTORE_ID   VarStoreId;\r
+    CIfrVarStore      VSObj;\r
+\r
+    VSObj.SetLineNo (LineNo);\r
+    mCVfrDataStorage.DeclareBufferVarStore (\r
+                       "Date", \r
+                                          &DefaultGuid, \r
+                                          &mCVfrVarDataTypeDB, \r
+                                          "EFI_HII_DATE",\r
+                       EFI_VARSTORE_ID_INVALID\r
+                       );\r
+    mCVfrDataStorage.GetVarStoreId("Date", &VarStoreId);\r
+    VSObj.SetVarStoreId (VarStoreId);\r
+    mCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_DATE", &Size);\r
+    VSObj.SetSize (Size);\r
+    VSObj.SetName ("Date");\r
+    VSObj.SetGuid (&DefaultGuid);\r
+  }\r
+\r
+  if (mCVfrVarDataTypeDB.IsTypeNameDefined ("Time") == FALSE) {\r
+    UINT32            Size;\r
+    EFI_VARSTORE_ID   VarStoreId;\r
+    CIfrVarStore      VSObj;\r
+\r
+    VSObj.SetLineNo (LineNo);\r
+    mCVfrDataStorage.DeclareBufferVarStore (\r
+                       "Time", \r
+                       &DefaultGuid, \r
+                       &mCVfrVarDataTypeDB, \r
+                       "EFI_HII_TIME",\r
+                       EFI_VARSTORE_ID_INVALID\r
+                       );\r
+    mCVfrDataStorage.GetVarStoreId("Time", &VarStoreId);\r
+    VSObj.SetVarStoreId (VarStoreId);\r
+    mCVfrVarDataTypeDB.GetDataTypeSize("EFI_HII_TIME", &Size);\r
+    VSObj.SetSize (Size);\r
+       VSObj.SetName ("Time");\r
+    VSObj.SetGuid (&DefaultGuid);\r
+  }\r
+}\r
+\r
+VOID\r
+EfiVfrParser::_DeclareStandardDefaultStorage (\r
+  IN UINT32 LineNo\r
+  )\r
+{\r
+  CIfrDefaultStore DSObj; \r
+\r
+  mCVfrDefaultStore.RegisterDefaultStore (DSObj.GetObjBinAddr(), "Standard Defaults", EFI_STRING_ID_INVALID, EFI_HII_DEFAULT_CLASS_STANDARD);\r
+  DSObj.SetLineNo (LineNo);\r
+  DSObj.SetDefaultName (EFI_STRING_ID_INVALID);\r
+  DSObj.SetDefaultId (EFI_HII_DEFAULT_CLASS_STANDARD);\r
+}\r
+\r
+VOID\r
+EfiVfrParser::AssignQuestionKey (\r
+  IN CIfrQuestionHeader   &QHObj, \r
+  IN ANTLRTokenPtr        KeyTok\r
+  )\r
+{\r
+  UINT16 KeyValue;\r
+\r
+  if (KeyTok == NULL) {\r
+    return;\r
+  }\r
+\r
+  KeyValue = _STOU16 (KeyTok->getText());\r
+\r
+  if (QHObj.FLAGS () & EFI_IFR_FLAG_CALLBACK) {\r
+  /*\r
+   * if the question is not CALLBACK ignore the key.\r
+   */\r
+    _PCATCH(mCVfrQuestionDB.UpdateQuestionId (QHObj.QUESTION_ID(), KeyValue), KeyTok);\r
+    QHObj.SetQuestionId (KeyValue);\r
+  }\r
+}\r
+\r
+VOID\r
+EfiVfrParser::ConvertIdExpr (\r
+  IN UINT32          &ExpOpCount, \r
+  IN UINT32          LineNo,\r
+  IN EFI_QUESTION_ID QId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          BitMask\r
+  )\r
+{\r
+  CIfrQuestionRef1 QR1Obj(LineNo);\r
+  QR1Obj.SetQuestionId (QId, VarIdStr, LineNo);\r
+  _SAVE_OPHDR_COND (QR1Obj, (ExpOpCount == 0));\r
+\r
+  if (BitMask != 0) {\r
+    CIfrUint32       U32Obj(LineNo);\r
+    U32Obj.SetValue (BitMask);\r
+\r
+    CIfrBitWiseAnd   BWAObj(LineNo);\r
+\r
+    CIfrUint8        U8Obj(LineNo);\r
+    switch (BitMask) {\r
+    case DATE_YEAR_BITMASK   : U8Obj.SetValue (0); break;\r
+    case TIME_SECOND_BITMASK : U8Obj.SetValue (0x10); break;\r
+    case DATE_DAY_BITMASK    : U8Obj.SetValue (0x18); break;\r
+    case TIME_HOUR_BITMASK   : U8Obj.SetValue (0); break;\r
+    case TIME_MINUTE_BITMASK : U8Obj.SetValue (0x8); break;\r
+    }\r
+\r
+    CIfrShiftRight   SRObj(LineNo);\r
+  }\r
+\r
+  ExpOpCount += 4;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::IdEqValDoSpecial (\r
+  IN UINT32           &ExpOpCount, \r
+  IN UINT32           LineNo,\r
+  IN EFI_QUESTION_ID  QId,\r
+  IN INT8             *VarIdStr,\r
+  IN UINT32           BitMask,\r
+  IN UINT16           ConstVal,\r
+  IN EFI_COMPARE_TYPE CompareType\r
+  )\r
+{\r
+  ConvertIdExpr (ExpOpCount, LineNo, QId, VarIdStr, BitMask);\r
+\r
+  if (ConstVal > 0xFF) {\r
+    CIfrUint16       U16Obj(LineNo);\r
+    U16Obj.SetValue (ConstVal);\r
+  } else {\r
+    CIfrUint8        U8Obj(LineNo);\r
+    U8Obj.SetValue ((UINT8)ConstVal);\r
+  }\r
+\r
+  switch (CompareType) {\r
+  case EQUAL :\r
+    {\r
+      CIfrEqual EObj(LineNo);\r
+      break;\r
+    }\r
+  case LESS_EQUAL :\r
+    {\r
+      CIfrLessEqual LEObj(LineNo);\r
+      break;\r
+    }\r
+  case LESS_THAN :\r
+    {\r
+      CIfrLessThan LTObj(LineNo);\r
+      break;\r
+    }\r
+  case GREATER_EQUAL :\r
+    {\r
+      CIfrGreaterEqual GEObj(LineNo);\r
+      break;\r
+    }\r
+  case GREATER_THAN :\r
+    {\r
+      CIfrGreaterThan GTObj(LineNo);\r
+      break;\r
+    }\r
+  }\r
+\r
+  ExpOpCount += 2;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::IdEqIdDoSpecial (\r
+  IN UINT32           &ExpOpCount, \r
+  IN UINT32           LineNo,\r
+  IN EFI_QUESTION_ID  QId1,\r
+  IN INT8             *VarId1Str,\r
+  IN UINT32           BitMask1,\r
+  IN EFI_QUESTION_ID  QId2,\r
+  IN INT8             *VarId2Str,\r
+  IN UINT32           BitMask2,\r
+  IN EFI_COMPARE_TYPE CompareType\r
+  )\r
+{\r
+  ConvertIdExpr (ExpOpCount, LineNo, QId1, VarId1Str, BitMask1);\r
+  ConvertIdExpr (ExpOpCount, LineNo, QId2, VarId2Str, BitMask2);\r
+\r
+  switch (CompareType) {\r
+  case EQUAL :\r
+    {\r
+      CIfrEqual EObj(LineNo);\r
+      break;\r
+    }\r
+  case LESS_EQUAL :\r
+    {\r
+      CIfrLessEqual LEObj(LineNo);\r
+      break;\r
+    }\r
+  case LESS_THAN :\r
+    {\r
+      CIfrLessThan LTObj(LineNo);\r
+      break;\r
+    }\r
+  case GREATER_EQUAL :\r
+    {\r
+      CIfrGreaterEqual GEObj(LineNo);\r
+      break;\r
+    }\r
+  case GREATER_THAN :\r
+    {\r
+      CIfrGreaterThan GTObj(LineNo);\r
+      break;\r
+    }\r
+  }\r
+\r
+  ExpOpCount++;\r
+}\r
+\r
+VOID\r
+EfiVfrParser::IdEqListDoSpecial (\r
+  IN UINT32          &ExpOpCount, \r
+  IN UINT32          LineNo,\r
+  IN EFI_QUESTION_ID QId,\r
+  IN INT8            *VarIdStr,\r
+  IN UINT32          BitMask,\r
+  IN UINT16          ListLen,\r
+  IN UINT16          *ValueList\r
+  )\r
+{\r
+  UINT16 Index;\r
+\r
+  if (ListLen == 0) {\r
+    return;\r
+  }\r
+\r
+  IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[0], EQUAL);\r
+  for (Index = 1; Index < ListLen; Index++) {\r
+    IdEqValDoSpecial (ExpOpCount, LineNo, QId, VarIdStr, BitMask, ValueList[Index], EQUAL);\r
+    CIfrOr OObj (LineNo);\r
+    ExpOpCount++;\r
+  }\r
+}\r
+\r
+>>\r