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

📄 vfrcompile.g

📁 EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是EFI BIOS源代码中的与平台无关部分的代码
💻 G
📖 第 1 页 / 共 5 页
字号:
#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 + -