/* A Bison parser, made by GNU Bison 3.7.2.  */

/* Bison interface for Yacc-like parsers in C

   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2020 Free Software Foundation,
   Inc.

   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

/* As a special exception, you may create a larger work that contains
   part or all of the Bison parser skeleton and distribute that work
   under terms of your choice, so long as that work isn't itself a
   parser generator using the skeleton or a modified version thereof
   as a parser skeleton.  Alternatively, if you modify or redistribute
   the parser skeleton itself, you may (at your option) remove this
   special exception, which will cause the skeleton and the resulting
   Bison output files to be licensed under the GNU General Public
   License without this special exception.

   This special exception was added by the Free Software Foundation in
   version 2.2 of Bison.  */

/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
   especially those whose name start with YY_ or yy_.  They are
   private implementation details that can be changed or removed.  */

#ifndef YY_YY_HOME_C0D3_SRC_COREBOOT_GIT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
# define YY_YY_HOME_C0D3_SRC_COREBOOT_GIT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
/* Debug traces.  */
#ifndef YYDEBUG
# define YYDEBUG 0
#endif
#if YYDEBUG
extern int yydebug;
#endif

/* Token kinds.  */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
  enum yytokentype
  {
    YYEMPTY = -2,
    YYEOF = 0,                     /* "end of file"  */
    YYerror = 256,                 /* error  */
    YYUNDEF = 257,                 /* "invalid token"  */
    CHIP = 258,                    /* CHIP  */
    DEVICE = 259,                  /* DEVICE  */
    REGISTER = 260,                /* REGISTER  */
    ALIAS = 261,                   /* ALIAS  */
    REFERENCE = 262,               /* REFERENCE  */
    ASSOCIATION = 263,             /* ASSOCIATION  */
    BOOL = 264,                    /* BOOL  */
    STATUS = 265,                  /* STATUS  */
    MANDATORY = 266,               /* MANDATORY  */
    BUS = 267,                     /* BUS  */
    RESOURCE = 268,                /* RESOURCE  */
    END = 269,                     /* END  */
    EQUALS = 270,                  /* EQUALS  */
    HEX = 271,                     /* HEX  */
    STRING = 272,                  /* STRING  */
    PCI = 273,                     /* PCI  */
    PNP = 274,                     /* PNP  */
    I2C = 275,                     /* I2C  */
    APIC = 276,                    /* APIC  */
    CPU_CLUSTER = 277,             /* CPU_CLUSTER  */
    CPU = 278,                     /* CPU  */
    DOMAIN = 279,                  /* DOMAIN  */
    IRQ = 280,                     /* IRQ  */
    DRQ = 281,                     /* DRQ  */
    SLOT_DESC = 282,               /* SLOT_DESC  */
    IO = 283,                      /* IO  */
    NUMBER = 284,                  /* NUMBER  */
    SUBSYSTEMID = 285,             /* SUBSYSTEMID  */
    INHERIT = 286,                 /* INHERIT  */
    IOAPIC_IRQ = 287,              /* IOAPIC_IRQ  */
    IOAPIC = 288,                  /* IOAPIC  */
    PCIINT = 289,                  /* PCIINT  */
    GENERIC = 290,                 /* GENERIC  */
    SPI = 291,                     /* SPI  */
    USB = 292,                     /* USB  */
    MMIO = 293,                    /* MMIO  */
    LPC = 294,                     /* LPC  */
    ESPI = 295,                    /* ESPI  */
    GPIO = 296,                    /* GPIO  */
    FW_CONFIG_TABLE = 297,         /* FW_CONFIG_TABLE  */
    FW_CONFIG_FIELD = 298,         /* FW_CONFIG_FIELD  */
    FW_CONFIG_OPTION = 299,        /* FW_CONFIG_OPTION  */
    FW_CONFIG_PROBE = 300          /* FW_CONFIG_PROBE  */
  };
  typedef enum yytokentype yytoken_kind_t;
#endif

/* Value type.  */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
union YYSTYPE
{

	struct device *dev;
	struct chip_instance *chip_instance;
	char *string;
	uint64_t number;


};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif


extern YYSTYPE yylval;

int yyparse (void);

#endif /* !YY_YY_HOME_C0D3_SRC_COREBOOT_GIT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
