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

/* Bison interface for Yacc-like parsers in C

   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 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 <https://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_USUARIO_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED
# define YY_YY_HOME_USUARIO_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  */
    SMBIOS_DEV_INFO = 283,         /* SMBIOS_DEV_INFO  */
    IO = 284,                      /* IO  */
    NUMBER = 285,                  /* NUMBER  */
    SUBSYSTEMID = 286,             /* SUBSYSTEMID  */
    INHERIT = 287,                 /* INHERIT  */
    IOAPIC_IRQ = 288,              /* IOAPIC_IRQ  */
    IOAPIC = 289,                  /* IOAPIC  */
    PCIINT = 290,                  /* PCIINT  */
    GENERIC = 291,                 /* GENERIC  */
    SPI = 292,                     /* SPI  */
    USB = 293,                     /* USB  */
    MMIO = 294,                    /* MMIO  */
    GPIO = 295,                    /* GPIO  */
    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  */
    PIPE = 300                     /* PIPE  */
  };
  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_USUARIO_COREBOOT_UTIL_SCONFIG_SCONFIG_TAB_H_SHIPPED_INCLUDED  */
