📄 vfrcompile.g
字号:
// 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 + -