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

/* 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_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
# define YY_YY_SRC_COREBOOT_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  */
    FW_CONFIG_TABLE = 296,         /* FW_CONFIG_TABLE  */
    FW_CONFIG_FIELD = 297,         /* FW_CONFIG_FIELD  */
    FW_CONFIG_OPTION = 298,        /* FW_CONFIG_OPTION  */
    FW_CONFIG_PROBE = 299          /* 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;
	int 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_SRC_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
