📄 vfrcompile.g
字号:
#token LineDefinition "#line\ [0-9]+\ \"~[\"]+\"[\ \t]*\n" << AddFileLine (begexpr (), line ()); skip (); >>
#token FormSet("formset") "formset"
#token EndFormSet("endformset") "endformset"
#token Title("title") "title"
#token FormId("formid") "formid"
#token OneOf("oneof") "oneof"
#token Prompt("prompt") "prompt"
#token OrderedList("orderedlist") "orderedlist"
#token EndList("endlist") "endlist"
#token EndForm("endform") "endform"
#token EndOneOf("endoneof") "endoneof"
#token Form("form") "form"
#token Subtitle("subtitle") "subtitle"
#token Help("help") "help"
#token VarId("varid") "varid"
#token Text("text") "text"
#token Option("option") "option"
#token Value("value") "value"
#token Flags("flags") "flags"
#token Date("date") "date"
#token EndDate("enddate") "enddate"
#token Year("year") "year"
#token Month("month") "month"
#token Day("day") "day"
#token Time("time") "time"
#token EndTime("endtime") "endtime"
#token Hour("hour") "hour"
#token Minute("minute") "minute"
#token Second("second") "second"
#token AND("AND") "AND"
#token OR("OR") "OR"
#token GrayOutIf("grayoutif") "grayoutif"
#token NOT("NOT") "NOT"
#token Label("label") "label"
#token Timeout("timeout") "timeout"
#token Inventory("inventory") "inventory"
#token StringToken("STRING_TOKEN") "STRING_TOKEN"
#token NonNvDataMap("_NON_NV_DATA_MAP") "_NON_NV_DATA_MAP"
#token Struct("struct") "struct"
#token Uint64("UINT64") "UINT64"
#token Uint32("UINT32") "UINT32"
#token Uint16("UINT16") "UINT16"
#token Char16("CHAR16") "CHAR16"
#token Uint8("UINT8") "UINT8"
#token Guid("guid") "guid"
#token CheckBox("checkbox") "checkbox"
#token EndCheckBox("endcheckbox") "endcheckbox"
#token Numeric("numeric") "numeric"
#token EndNumeric("endnumeric") "endnumeric"
#token Minimum("minimum") "minimum"
#token Maximum("maximum") "maximum"
#token Step("step") "step"
#token Default("default") "default"
#token Password("password") "password"
#token EndPassword("endpassword") "endpassword"
#token String("string") "string"
#token EndString("endstring") "endstring"
#token MinSize("minsize") "minsize"
#token MaxSize("maxsize") "maxsize"
#token Encoding("encoding") "encoding"
#token SuppressIf("suppressif") "suppressif"
#token Hidden("hidden") "hidden"
#token Goto("goto") "goto"
#token InconsistentIf "inconsistentif"
#token EndIf("endif") "endif"
#token IdEqId("ideqid") "ideqid"
#token IdEqVal("ideqval") "ideqval"
#token VarEqVal("vareqval") "vareqval"
#token Var("var") "var"
#token IdEqValList("ideqvallist") "ideqvallist"
#token Length("length") "length"
#token Values("values") "values"
#token Key("key") "key"
#token DefaultFlag("DEFAULT") "DEFAULT"
#token ManufacturingFlag("MANUFACTURING") "MANUFACTURING"
#token InteractiveFlag("INTERACTIVE") "INTERACTIVE"
#token NVAccessFlag("NV_ACCESS") "NV_ACCESS"
#token ResetRequiredFlag("RESET_REQUIRED") "RESET_REQUIRED"
#token LateCheckFlag("LATE_CHECK") "LATE_CHECK"
#token Class("class") "class"
#token Subclass("subclass") "subclass"
#token TypeDef("typedef") "typedef"
#token Restore("restore") "restore"
#token Save("save") "save"
#token Defaults("defaults") "defaults"
#token Banner("banner") "banner"
#token Align("align") "align"
#token Left("left") "left"
#token Right("right") "right"
#token Center("center") "center"
#token Line("line") "line"
#token VarStore("varstore") "varstore"
#token Name("name") "name"
#token Oem("oem") "oem"
#token True("TRUE") "TRUE"
#token False("FALSE") "FALSE"
#token GreaterThan(">") ">"
#token GreaterEqual(">=") ">="
#token LessThan("<") "<"
#token LessEqual("<=") "<="
//
// Define the class and subclass tokens
//
#token ClassNonDevice("NONDEVICE") "NON_DEVICE"
#token ClassDiskDevice("DISK_DEVICE") "DISK_DEVICE"
#token ClassVideoDevice("VIDEO_DEVICE") "VIDEO_DEVICE"
#token ClassNetworkDevice("NETWORK_DEVICE") "NETWORK_DEVICE"
#token ClassInputDevice("INPUT_DEVICE") "INPUT_DEVICE"
#token ClassOnBoardDevice("ONBOARD_DEVICE") "ONBOARD_DEVICE"
#token ClassOtherDevice("OTHER_DEVICE") "OTHER_DEVICE"
#token SubclassSetupApplication("SETUP_APPLICATION") "SETUP_APPLICATION"
#token SubclassGeneralApplication("GENERAL_APPLICATION") "GENERAL_APPLICATION"
#token SubclassFrontPage("FRONT_PAGE") "FRONT_PAGE"
#token SubclassSingleUse("SINGLE_USE") "SINGLE_USE"
#token LanguageIdentifier("language identifier") "[a-z][a-z][a-z]" // 3 lowercase characters
#token StringIdentifier("string identifier") "[A-Za-z_][A-Za-z_0-9]*"
#token Number("numeric value") "(0x[0-9A-Fa-f]+) | [0-9]+"
#token OpenBrace("{") "\{"
#token CloseBrace("}") "\}"
#token OpenParen("(") "\("
#token CloseParen(")") "\)"
#token OpenBracket("[") "\["
#token CloseBracket("]") "\]"
//
// Define all other invalid characters so that they get through the lexical phase
// and we can catch them during the parse phase. We get much better error
// messages then.
//
#token InvalidCharacters("invalid characters") "~[;:=,\.\|]"
//
// This is the overall definition of a VFR form definition script.
//
program :
( dataStructDefinition )*
formSetStatement
( vfrStatementVarStore )*
( formDefinition )*
EFS:EndFormSet ";" << WriteOpByte (EFS->getLine(), EFI_IFR_END_FORM_SET_OP); >>
"@" // end of file
;
formSetStatement :
FS:FormSet << WriteOpByte (FS->getLine(), EFI_IFR_FORM_SET_OP); >>
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 ()
);
>>
","
Title "=" getStringId ","
Help "=" getStringId ","
//
// insert padding for an EFI_PHYSICAL_ADDRESS (UINT64)
//
<< WriteDWord (0, 0); WriteDWord (0, 0); >>
Class "=" CVAL:classDefinition "," << WriteClass (); >>
Subclass "=" SVAL:subclassDefinition "," << WriteSubclass (); >>
<< WriteWord (mNvDataStructSize); >>
;
//
// A form can be of multiple classes, thus allow CLASS_A | CLASS_B | CLASS_C
//
classDefinition :
validClassNames ( "\|" validClassNames )*
;
validClassNames :
CND:ClassNonDevice << SetClass (CND->getLine(), EFI_NON_DEVICE_CLASS); >>
| CDD:ClassDiskDevice << SetClass (CDD->getLine(), EFI_DISK_DEVICE_CLASS); >>
| CVD:ClassVideoDevice << SetClass (CVD->getLine(), EFI_VIDEO_DEVICE_CLASS); >>
| CNW:ClassNetworkDevice << SetClass (CNW->getLine(), EFI_NETWORK_DEVICE_CLASS); >>
| CID:ClassInputDevice << SetClass (CID->getLine(), EFI_INPUT_DEVICE_CLASS); >>
| COB:ClassOnBoardDevice << SetClass (COB->getLine(), EFI_ON_BOARD_DEVICE_CLASS); >>
| COD:ClassOtherDevice << SetClass (COD->getLine(), EFI_OTHER_DEVICE_CLASS); >>
| CNUM:Number << SetClass (CNUM->getLine(), GetNumber (CNUM->getText(), CNUM->getLine(), 4)); >>
; << PrintErrorMessage (LT(1)->getLine(), LT(1)->getText(), "invalid class"); >>
//
// A form can only be of one subclass type.
//
subclassDefinition :
SSA:SubclassSetupApplication << SetSubclass (SSA->getLine(), EFI_SETUP_APPLICATION_SUBCLASS); >>
| SGA:SubclassGeneralApplication << SetSubclass (SGA->getLine(), EFI_GENERAL_APPLICATION_SUBCLASS); >>
| SFP:SubclassFrontPage << SetSubclass (SFP->getLine(), EFI_FRONT_PAGE_SUBCLASS); >>
| SSU:SubclassSingleUse << SetSubclass (SSU->getLine(), EFI_SINGLE_USE_SUBCLASS); >>
| SNUM:Number << SetSubclass (SNUM->getLine(), GetNumber (SNUM->getText(), SNUM->getLine(), 4)); >>
; << PrintErrorMessage (LT(1)->getLine(), LT(1)->getText(), "invalid subclass"); >>
//
// Parse a C type data structure for storing VFR setup data. Allow:
// typedef struct _XXX_ {
// (fields)
// } MY_NV_DATA;
//
dataStructDefinition :
<< int IsNonNV = 0; >>
{ TypeDef }
S:Struct
(
NonNvDataMap << IsNonNV = 1; >>
|
{ StringIdentifier }
) << StartStructDefinition (IsNonNV, S->getLine()); >>
OpenBrace
dataStructFields
CloseBrace NAME:StringIdentifier << EndStructDefinition (NAME->getText(), NAME->getLine()); >>
";"
;
//
// Parse a C type data structure for defining data that is not stored in NV.
// typedef struct _NON_NV_DATA_MAP {
// (fields)
// } NON_NV_DATA_MAP;
//
nonNvDataStructDefinition :
{ TypeDef }
Struct NonNvDataMap
{ StringIdentifier }
OpenBrace
dataStructFields
CloseBrace NAME:StringIdentifier << AddStructField (NAME->getText(), NAME->getLine(), 0, 0, 0); >>
";"
;
dataStructFields :
( dataStructField64 | dataStructField32 | dataStructField16 | dataStructField8 ) *
;
//*****************************************************************************
//
// PARSE:
// UINT64 Name[4];
// UINT64 Name;
//
// Used while parsing the NV data map structures.
//
dataStructField64 :
<< int ArrayLength = 1; char IsArray = 0; >>
"UINT64"
NAME:StringIdentifier
( ";" | OpenBracket IVal:Number CloseBracket ";" << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> )
<< AddStructField (NAME->getText(), NAME->getLine(), 8, ArrayLength, IsArray); >>
;
//*****************************************************************************
//
// PARSE:
// UINT32 Name[4];
// UINT32 Name;
//
// Used while parsing the NV data map structures.
//
dataStructField32 :
<< int ArrayLength = 1; char IsArray = 0; >>
"UINT32"
NAME:StringIdentifier
( ";" | OpenBracket IVal:Number CloseBracket ";" << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> )
<< AddStructField (NAME->getText(), NAME->getLine(), 4, ArrayLength, IsArray); >>
;
//*****************************************************************************
//
// PARSE:
// UINT16 Name[4];
// UINT16 Name;
//
// Used while parsing the NV data map structures.
//
dataStructField16 :
<< int ArrayLength = 1; char IsArray = 0; >>
( "UINT16" | "CHAR16" )
NAME:StringIdentifier
( ";" | OpenBracket IVal:Number CloseBracket ";" << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> )
<< AddStructField (NAME->getText(), NAME->getLine(), 2, ArrayLength, IsArray); >>
;
//*****************************************************************************
//
// PARSE:
// UINT8 Name[4];
// UINT8 Name;
//
// Used while parsing the NV data map structures.
//
dataStructField8 :
<< int ArrayLength = 1; char IsArray = 0; >>
"UINT8"
NAME:StringIdentifier
( ";" | OpenBracket IVal:Number CloseBracket ";" << ArrayLength = GetNumber (IVal->getText(), IVal->getLine(), 4); IsArray = 1; >> )
<< AddStructField (NAME->getText(), NAME->getLine(), 1, ArrayLength, IsArray); >>
;
//*****************************************************************************
//
// PARSE:
// form formid = 1,
// title = STRING_TOKEN(STR_FORM_TITLE);
// -- form statements --
// endform;
//
// The Form ID cannot be 0
//
formDefinition :
FRM:Form FormId << WriteOpByte (FRM->getLine(), EFI_IFR_FORM_OP); >>
"="
VAL:Number << WriteWord (GetNumber (VAL->getText(), VAL->getLine(), 2)); AddFormId (GetNumber (VAL->getText(), VAL->getLine(), 2), VAL->getLine()); >>
","
Title "=" getStringId ";" // writes string identifier
( vfrStatements )*
ENDF:EndForm ";" << WriteOpByte (ENDF->getLine(), EFI_IFR_END_FORM_OP); >>
;
//
// VFR statements in a formset
//
vfrStatements :
vfrStatementSubTitle |
vfrStatementOneOf |
vfrStatementTextText |
vfrStatementCheckBox |
vfrStatementNumeric |
vfrStatementDate |
vfrStatementTime |
vfrStatementPassword |
vfrStatementString |
vfrStatementSuppressIf |
vfrStatementHidden |
vfrStatementGoto |
vfrStatementGrayOutIf |
vfrStatementInconsistentIf |
vfrStatementLabel |
vfrStatementBanner |
vfrStatementInventory |
vfrStatementOrderedList |
vfrStatementOem |
vfrStatementSaveRestoreDefaults
;
//*****************************************************************************
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -