⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vfrcompile.g

📁 EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是EFI BIOS源代码中的与平台无关部分的代码
💻 G
📖 第 1 页 / 共 5 页
字号:
// PARSE:
//   label 100;
//
vfrStatementLabel :
  OPID:Label                              << WriteOpByte (OPID->getLine(), EFI_IFR_LABEL_OP); >>
  VAL:Number                              << 
                                              WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); 
                                              AddLabel (GetNumber (VAL->getText(), VAL->getLine(), 2), VAL->getLine());
                                          >>
  ";"
  ;

//*****************************************************************************
//
// PARSE:
//   oem 0x12, 0x34, 0x56;
//
vfrStatementOem :
  OPID:Oem                              << WriteOpByte (OPID->getLine(), EFI_IFR_OEM_DEFINED_OP); >>
  ( VAL1:Number << WriteByte (GetNumber (VAL1->getText(), VAL1->getLine(), 1), 0); >> )
  ( "," VAL2:Number << WriteByte (GetNumber (VAL2->getText(), VAL2->getLine(), 1), 0); >> )*
  ";"
  ;
  
//*****************************************************************************
//
// PARSE:
//   inconsistentif NOT .... AND NOT .... OR ... endif;
//
vfrStatementInconsistentIf : 
  << ResetFlags (); >>
  IIFOP:InconsistentIf                  << WriteOpByte (IIFOP->getLine(), EFI_IFR_INCONSISTENT_IF_OP); >>
  Prompt "=" getStringId ","
  { 
    FF:Flags  "=" flagsField ( "\|" flagsField )* "," 
  }
  << WriteFlags (); >> //  write the flags field
  vfrBooleanExpression
  EOP:EndIf ";"                         << WriteOpByte (EOP->getLine(), EFI_IFR_END_IF_OP); >>
  ;

//*****************************************************************************
// 
// PARSE:
//   TRUE AND (ideqval SomeStruct.SomeMember >= 0x10 OR 
//               ideqid SomeStruct.SomeMember < SomeStruct.SomeOtherMember) AND
//            (ideqlist SomeStruct.SomeOtherMember == 0x10, 0x20, 0x30 OR
//               vareqval var(VAR_EQ_TEST_NAME) == 0x1)
//
// For supporting complex express, divide the vfrBooleanExpression to two parts
// so that pred-LL(k) parser can parse incrementally.
//
vfrBooleanExpression :
  leftPartVfrBooleanExp { rightPartVfrBooleanExp }
  ;
  
leftPartVfrBooleanExp :
  OpenParen vfrBooleanExpression CloseParen                                                        |
  (ideqval | ideqid | ideqvallist | vareqval | truefalse)                                          |
  NOPID:NOT leftPartVfrBooleanExp           << WriteOpByte (NOPID->getLine(), EFI_IFR_NOT_OP); >>
  ;

rightPartVfrBooleanExp :
  AOPID:AND vfrBooleanExpression            << WriteOpByte (AOPID->getLine(), EFI_IFR_AND_OP); >>  |
  OOPID:OR vfrBooleanExpression             << WriteOpByte (OOPID->getLine(), EFI_IFR_OR_OP); >>
  ;

//*****************************************************************************
//
// PARSE:
//   TRUE
//
truefalse :
  TOPID:True                                << WriteOpByte (TOPID->getLine(), EFI_IFR_TRUE_OP); >> |
  FOPID:False                               << WriteOpByte (FOPID->getLine(), EFI_IFR_FALSE_OP); >>
  ;

//*****************************************************************************
//
// PARSE:
//   varstore MY_STRUCT_NAME, key = 0x1234, name = "MyVariableName", guid = {...};
//
vfrStatementVarStore : 
  OP:VarStore                           << WriteOpByte (OP->getLine(), EFI_IFR_VARSTORE_OP); >>
  STRUCT_NAME:StringIdentifier ","
  Key   "=" KNUM:Number ","
  Name  "=" VAR_NAME:StringIdentifier ","  
  Guid "=" 
  OpenBrace 
  G1:Number ","
  G2:Number ","
  G3:Number ","
  G4:Number ","
  G5:Number ","
  G6:Number ","
  G7:Number ","
  G8:Number ","
  G9:Number ","
  G10:Number ","
  G11:Number 
  CloseBrace                            << WriteGuidValue (G1->getLine (), G1->getText (), G2->getText (), G3->getText (),
                                                           G4->getText (), G5->getText (), G6->getText (), G7->getText (),
                                                           G8->getText (), G9->getText (), G10->getText (), G11->getText ()
                                                          );
                                           WriteWord (GetNumber (KNUM->getText(), KNUM->getLine(), 2)); 
                                           AddVarStore (STRUCT_NAME->getText(), VAR_NAME->getText(), GetNumber (KNUM->getText(), KNUM->getLine(), 2), STRUCT_NAME->getLine());
                                         >>
  
  ";"
  ;

//*****************************************************************************
//
// PARSE:  
//   vareqval var(0x100) == 0x20
//
vareqval : 
  OPID:VarEqVal                           << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_VAR_VAL_OP); >>
  Var OpenParen 
  VAR:Number                              << WriteWord (GetNumber (VAR->getText(), VAR->getLine(), 2)); >>
  CloseParen
  compareNumber
  ;

ideqval : 
  OPID:IdEqVal                            << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_ID_VAL_OP); >>
  vfrStructFieldName[0]
  compareNumber
  ;

//*****************************************************************************
//
// PARSE:
//   ideqid MyNVData3.Field16A == MyNVData3.Field16B
//
// NOTE: Before processing the second variable store in the ideqid statement, set a global flag
//       so that when we parse the second variable we set the secondary variable store id.
//
ideqid : 
  OPID:IdEqId                             << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_ID_ID_OP);  >>
  vfrStructFieldName[0]
  compareVfrStructFieldNameNL0
  ;

//*****************************************************************************
//
// compareNumber is the combination of compare operation and Number
//
compareNumber :
  (
  "=="
  VAL1:Number                             << WriteWord (GetNumber (VAL1->getText(), VAL1->getLine(), 2)); >>
  ) |
  (
  GTOPID:GreaterThan
  VAL2:Number                             << WriteWord (GetNumber (VAL2->getText(), VAL2->getLine(), 2));
                                             WriteOpByte (GTOPID->getLine(), EFI_IFR_GT_OP); >>
  ) |
  (
  GEOPID:GreaterEqual
  VAL3:Number                             << WriteWord (GetNumber (VAL3->getText(), VAL3->getLine(), 2));
                                             WriteOpByte (GEOPID->getLine(), EFI_IFR_GE_OP); >>
  ) |
  (
  LTOPID:LessThan
  VAL4:Number                             << WriteWord (GetNumber (VAL4->getText(), VAL4->getLine(), 2));
                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_GE_OP);
                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_NOT_OP); >>
  ) |
  (
  LEOPID:LessEqual
  VAL5:Number                             << WriteWord (GetNumber (VAL5->getText(), VAL5->getLine(), 2));
                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_GT_OP);
                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_NOT_OP); >>
  )
  ;

//*****************************************************************************
//
// compareVfrStructFieldNameNL0 is the combination of compare operation and  vfrStructFieldNameNL[0]
//
compareVfrStructFieldNameNL0 :
  (
  "=="                                    << mIdEqIdStmt = 1; >>
  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0; >>
  ) |
  (
  GTOPID:GreaterThan                      << mIdEqIdStmt = 1; >>
  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;
                                             WriteOpByte (GTOPID->getLine(), EFI_IFR_GT_OP); >>
  ) |
  (
  GEOPID:GreaterEqual                     << mIdEqIdStmt = 1; >>
  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;
                                             WriteOpByte (GEOPID->getLine(), EFI_IFR_GE_OP); >>
  ) |
  (
  LTOPID:LessThan                       << mIdEqIdStmt = 1; >>
  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;
                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_GE_OP);
                                             WriteOpByte (LTOPID->getLine(), EFI_IFR_NOT_OP); >>
  ) |
  (
  LEOPID:LessEqual                      << mIdEqIdStmt = 1; >>
  vfrStructFieldNameNL[0]                 << mIdEqIdStmt = 0;
                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_GT_OP);
                                             WriteOpByte (LEOPID->getLine(), EFI_IFR_NOT_OP); >>
  )
  ;
  

ideqvallist : 
  OPID:IdEqValList                        << WriteOpByte (OPID->getLine(), EFI_IFR_EQ_ID_LIST_OP); >>
  vfrStructFieldName[0] 
  "=="
  ( VAL:Number                            << QueueIdEqValList (GetNumber (VAL->getText(), VAL->getLine(), 2)); >> ) +
                                          << FlushQueueIdEqValList(); >>
  ;
    
vfrStatementGoto : 
  << UINT32 LineNum, KeyValue = 0; ResetFlags (); >>
  IDG:Goto                          << WriteOpByte (IDG->getLine(), EFI_IFR_REF_OP); >>
  VAL:Number  ","                   << WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); 
                                       AddGotoReference (GetNumber (VAL->getText(), VAL->getLine(), 2), VAL->getLine());
                                    >>
  KP:Prompt   "=" getStringId ","   << LineNum = KP->getLine();  >>
  Help        "=" getStringId
  { 
    "," 
    FF:Flags  "=" flagsField ( "\|" flagsField )*  << LineNum = FF->getLine(); >>
  }
  {
    "," Key   "=" KNUM:Number       << LineNum = KNUM->getLine(); KeyValue = GetNumber(KNUM->getText(), LineNum, 2); >>
  }
                                    << WriteFlagsKey (KeyValue, LineNum); >>
  ";"
  ;
    
vfrStatementHidden : 
  IDH:Hidden                  << WriteOpByte (IDH->getLine(), EFI_IFR_HIDDEN_OP); >>
  Value "="
  VAL:Number ","              << WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); >>
  Key "="
  KVAL:Number                 << WriteWord (GetNumber (KVAL->getText(), KVAL->getLine(), 2)); >>
  ";"
  ;    

//*****************************************************************************
//
// PARSE:
//   suppressif <boolean_expression> { grayoutif } <statements>+ endif;
// Note:
//   You can have: suppressif:grayoutif:statements:endif
//                 suppressif:grayoutif:endif                  -- serves no purpose
//                 suppressif:statements:endif
//                 suppressif:endif                            -- serves no purpose
//
vfrStatementSuppressIf : 
  << ResetFlags (); >>
  OPID:SuppressIf                     << WriteOpByte (OPID->getLine(), EFI_IFR_SUPPRESS_IF_OP); SetIfStart (OPID->getLine()); >>
  { 
    FF:Flags  "=" flagsField ( "\|" flagsField )* ","
  }
  << WriteFlags (); >> //  write the flags field 
  vfrBooleanExpression
  ";"
  { suppressIfGrayOutIf } ( suppressIfAndGrayoutIfSubstatements )+
  ENDOP:EndIf ";"                     << WriteOpByte (ENDOP->getLine(), EFI_IFR_END_IF_OP); SetIfStart (0); >>
  ;

//
// This is the form for a grayoutif nested in a suppressif statement
//
suppressIfGrayOutIf :
  << ResetFlags (); >>
  OPID:GrayOutIf                      << WriteOpByte (OPID->getLine(), EFI_IFR_GRAYOUT_IF_OP); >>
  { 
    FF:Flags  "=" flagsField ( "\|" flagsField )* "," 
  }
  << WriteFlags (); >> //  write the flags field
  vfrBooleanExpression
  ";"
  ; 

//*****************************************************************************
//
// PARSE:
//   grayoutif { flags = n, } <boolean_expression> endif;
// Note:
//   You can have: grayoutif:suppressif:statements:endif
//                 grayoutif:statements:endif
//
//
vfrStatementGrayOutIf :
  << ResetFlags (); >>
  OPID:GrayOutIf                      << WriteOpByte (OPID->getLine(), EFI_IFR_GRAYOUT_IF_OP); SetIfStart (OPID->getLine()); >>
  { 
    FF:Flags  "=" flagsField ( "\|" flagsField )* "," 
  }
  << WriteFlags (); >> //  write the flags field
  vfrBooleanExpression
  ";"
  { grayoutIfSuppressIf } ( suppressIfAndGrayoutIfSubstatements )+ 
  ENDOP:EndIf ";"                     << WriteOpByte (ENDOP->getLine(), EFI_IFR_END_IF_OP); SetIfStart (0); >>
  ;

//
// This is the format for a suppressif nested in a grayoutif
//
grayoutIfSuppressIf : 
  << ResetFlags (); >>
  OPID:SuppressIf                     << WriteOpByte (OPID->getLine(), EFI_IFR_SUPPRESS_IF_OP); >>
  { 
    FF:Flags  "=" flagsField ( "\|" flagsField )* ","
  }
  << WriteFlags (); >> //  write the flags field
  vfrBooleanExpression
  ";"
  ;

//
// These are the VFR statements that are valid inside a suppressif or grayoutif statement.
//
suppressIfAndGrayoutIfSubstatements :
  vfrStatementOneOf           |
  vfrStatementTextText        |
  vfrStatementCheckBox        |
  vfrStatementNumeric         |
  vfrStatementDate            |
  vfrStatementTime            |
  vfrStatementPassword        |
  vfrStatementString          |
  vfrStatementHidden          |
  vfrStatementGoto            | 
  vfrStatementLabel           |
  vfrStatementInventory       |
  vfrStatementOrderedList     |
  vfrStatementSaveRestoreDefaults
  ; 

//*****************************************************************************
//
// PARSE:
//
//    password  varid    = MyNvData.Password,
//              prompt   = STRING_TOKEN(STR_PASSWORD_PROMPT),
//              help     = STRING_TOKEN(STR_PASSWORD_HELP),
//              minsize  = 6,
//              maxsize  = 20,
//              encoding = 1,
//    endpassword; 
  
vfrStatementPassword : 
  << UINT32 KeyValue = 0; UINT32 LineNum; ResetFlags (); >>
  IDPW:Password                       << WriteOpByte (IDPW->getLine(), EFI_IFR_PASSWORD_OP); >>
  VarId       "=" vfrStructFieldNameArray[0] ","
  Prompt      "=" getStringId ","
  KH:Help     "=" getStringId ","    << LineNum = KH->getLine(); >>
  { 
    FF:Flags  "=" flagsField ( "\|" flagsField )* ","  << LineNum = FF->getLine(); >>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -