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

/* Bison interface for Yacc-like parsers in C

   Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 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.  */

/* Undocumented macros, especially those whose name start with YY_,
   are private implementation details.  Do not rely on them.  */

#ifndef YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED
# define YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED
/* Debug traces.  */
#ifndef GRAM_DEBUG
# if defined YYDEBUG
#if YYDEBUG
#   define GRAM_DEBUG 1
#  else
#   define GRAM_DEBUG 0
#  endif
# else /* ! defined YYDEBUG */
#  define GRAM_DEBUG 1
# endif /* ! defined YYDEBUG */
#endif  /* ! defined GRAM_DEBUG */
#if GRAM_DEBUG
extern int gram_debug;
#endif
/* "%code requires" blocks.  */
#line 21 "src/parse-gram.y"

  #include "symlist.h"
  #include "symtab.h"
#line 251 "src/parse-gram.y"

  typedef enum
  {
    param_none   = 0,
    param_lex    = 1 << 0,
    param_parse  = 1 << 1,
    param_both   = param_lex | param_parse
  } param_type;
#line 703 "src/parse-gram.y"

  #include "muscle-tab.h"
  typedef struct
  {
    char const *chars;
    muscle_kind kind;
  } value_type;

#line 78 "src/parse-gram.h"

/* Token type.  */
#ifndef GRAM_TOKENTYPE
# define GRAM_TOKENTYPE
  enum gram_tokentype
  {
    GRAM_EOF = 0,
    STRING = 3,
    PERCENT_TOKEN = 4,
    PERCENT_NTERM = 5,
    PERCENT_TYPE = 6,
    PERCENT_DESTRUCTOR = 7,
    PERCENT_PRINTER = 8,
    PERCENT_LEFT = 9,
    PERCENT_RIGHT = 10,
    PERCENT_NONASSOC = 11,
    PERCENT_PRECEDENCE = 12,
    PERCENT_PREC = 13,
    PERCENT_DPREC = 14,
    PERCENT_MERGE = 15,
    PERCENT_CODE = 16,
    PERCENT_DEFAULT_PREC = 17,
    PERCENT_DEFINE = 18,
    PERCENT_DEFINES = 19,
    PERCENT_ERROR_VERBOSE = 20,
    PERCENT_EXPECT = 21,
    PERCENT_EXPECT_RR = 22,
    PERCENT_FLAG = 23,
    PERCENT_FILE_PREFIX = 24,
    PERCENT_GLR_PARSER = 25,
    PERCENT_INITIAL_ACTION = 26,
    PERCENT_LANGUAGE = 27,
    PERCENT_NAME_PREFIX = 28,
    PERCENT_NO_DEFAULT_PREC = 29,
    PERCENT_NO_LINES = 30,
    PERCENT_NONDETERMINISTIC_PARSER = 31,
    PERCENT_OUTPUT = 32,
    PERCENT_PURE_PARSER = 33,
    PERCENT_REQUIRE = 34,
    PERCENT_SKELETON = 35,
    PERCENT_START = 36,
    PERCENT_TOKEN_TABLE = 37,
    PERCENT_VERBOSE = 38,
    PERCENT_YACC = 39,
    BRACED_CODE = 40,
    BRACED_PREDICATE = 41,
    BRACKETED_ID = 42,
    CHAR = 43,
    COLON = 44,
    EPILOGUE = 45,
    EQUAL = 46,
    ID = 47,
    ID_COLON = 48,
    PERCENT_PERCENT = 49,
    PIPE = 50,
    PROLOGUE = 51,
    SEMICOLON = 52,
    TAG = 53,
    TAG_ANY = 54,
    TAG_NONE = 55,
    INT = 56,
    PERCENT_PARAM = 57,
    PERCENT_UNION = 58,
    PERCENT_EMPTY = 59
  };
#endif

/* Value type.  */
#if ! defined GRAM_STYPE && ! defined GRAM_STYPE_IS_DECLARED
union GRAM_STYPE
{

  /* precedence_declarator  */
  assoc precedence_declarator;
  /* "string"  */
  char* STRING;
  /* "{...}"  */
  char* BRACED_CODE;
  /* "%?{...}"  */
  char* BRACED_PREDICATE;
  /* "epilogue"  */
  char* EPILOGUE;
  /* "%{...%}"  */
  char* PROLOGUE;
  /* code_props_type  */
  code_props_type code_props_type;
  /* "integer"  */
  int INT;
  /* int.opt  */
  int yytype_81;
  /* named_ref.opt  */
  named_ref* yytype_93;
  /* "%param"  */
  param_type PERCENT_PARAM;
  /* token_decl  */
  symbol* token_decl;
  /* token_decl_for_prec  */
  symbol* token_decl_for_prec;
  /* id  */
  symbol* id;
  /* id_colon  */
  symbol* id_colon;
  /* symbol  */
  symbol* symbol;
  /* string_as_id  */
  symbol* string_as_id;
  /* string_as_id.opt  */
  symbol* yytype_100;
  /* generic_symlist  */
  symbol_list* generic_symlist;
  /* generic_symlist_item  */
  symbol_list* generic_symlist_item;
  /* nterm_decls  */
  symbol_list* nterm_decls;
  /* token_decls  */
  symbol_list* token_decls;
  /* token_decl.1  */
  symbol_list* yytype_79;
  /* token_decls_for_prec  */
  symbol_list* token_decls_for_prec;
  /* token_decl_for_prec.1  */
  symbol_list* yytype_83;
  /* symbol_decls  */
  symbol_list* symbol_decls;
  /* symbol_decl.1  */
  symbol_list* yytype_86;
  /* "%error-verbose"  */
  uniqstr PERCENT_ERROR_VERBOSE;
  /* "%<flag>"  */
  uniqstr PERCENT_FLAG;
  /* "%file-prefix"  */
  uniqstr PERCENT_FILE_PREFIX;
  /* "%name-prefix"  */
  uniqstr PERCENT_NAME_PREFIX;
  /* "%pure-parser"  */
  uniqstr PERCENT_PURE_PARSER;
  /* "[identifier]"  */
  uniqstr BRACKETED_ID;
  /* "identifier"  */
  uniqstr ID;
  /* "identifier:"  */
  uniqstr ID_COLON;
  /* "<tag>"  */
  uniqstr TAG;
  /* tag.opt  */
  uniqstr yytype_73;
  /* tag  */
  uniqstr tag;
  /* variable  */
  uniqstr variable;
  /* "character literal"  */
  unsigned char CHAR;
  /* value  */
  value_type value;
#line 233 "src/parse-gram.h"

};
typedef union GRAM_STYPE GRAM_STYPE;
# define GRAM_STYPE_IS_TRIVIAL 1
# define GRAM_STYPE_IS_DECLARED 1
#endif

/* Location type.  */
#if ! defined GRAM_LTYPE && ! defined GRAM_LTYPE_IS_DECLARED
typedef struct GRAM_LTYPE GRAM_LTYPE;
struct GRAM_LTYPE
{
  int first_line;
  int first_column;
  int last_line;
  int last_column;
};
# define GRAM_LTYPE_IS_DECLARED 1
# define GRAM_LTYPE_IS_TRIVIAL 1
#endif



int gram_parse (void);

#endif /* !YY_GRAM_SRC_PARSE_GRAM_H_INCLUDED  */
