lalr1.cc

来自「bison 2.0 主要可以用来做语法分析用的」· CC 代码 · 共 1,373 行 · 第 1/3 页

CC
1,373
字号
m4_divert(-1)# C++ skeleton for Bison# Copyright (C) 2002, 2003, 2004 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 2 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, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA# 02111-1307  USA## ---------------- #### Default values.  #### ---------------- ### Default parser class name.m4_define_default([b4_parser_class_name], [parser])## ----------------- #### Semantic Values.  #### ----------------- ### b4_lhs_value([TYPE])# --------------------# Expansion of $<TYPE>$.m4_define([b4_lhs_value],[(yyval[]m4_ifval([$1], [.$1]))])# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])# --------------------------------------# Expansion of $<TYPE>NUM, where the current rule has RULE-LENGTH# symbols on RHS.m4_define([b4_rhs_value],[(yysemantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3]))])m4_define_default([b4_location_type], [location])m4_define_default([b4_filename_type], [std::string])# b4_lhs_location()# -----------------# Expansion of @$.m4_define([b4_lhs_location],[(yyloc)])# b4_rhs_location(RULE-LENGTH, NUM)# ---------------------------------# Expansion of @NUM, where the current rule has RULE-LENGTH symbols# on RHS.m4_define([b4_rhs_location],[(yylocation_stack_@{m4_eval([$1 - $2])@})])# b4_parse_param_decl# -------------------# Extra formal arguments of the constructor.# Change the parameter names from "foo" into "foo_yyarg", so that# there is no collision bw the user chosen attribute name, and the# argument name in the constructor.m4_define([b4_parse_param_decl],[m4_ifset([b4_parse_param],          [m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])])m4_define([b4_parse_param_decl_1],[$1_yyarg])# b4_parse_param_cons# -------------------# Extra initialisations of the constructor.m4_define([b4_parse_param_cons],          [m4_ifset([b4_parse_param],		    [,      b4_cc_constructor_calls(b4_parse_param)])])m4_define([b4_cc_constructor_calls],	  [m4_map_sep([b4_cc_constructor_call], [,      ], [$@])])m4_define([b4_cc_constructor_call],	  [$2 ($2_yyarg)])# b4_parse_param_vars# -------------------# Extra instance variables.m4_define([b4_parse_param_vars],          [m4_ifset([b4_parse_param],		    [    /* User arguments.  */b4_cc_var_decls(b4_parse_param)])])m4_define([b4_cc_var_decls],	  [m4_map_sep([b4_cc_var_decl], [], [$@])])m4_define([b4_cc_var_decl],	  [    $1;])# We do want M4 expansion after # for CPP macros.m4_changecom()m4_divert(0)dnlm4_if(b4_defines_flag, 0, [],[@output @output_header_name@b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],             [2002, 2003, 2004])[/* FIXME: This is wrong, we want computed header guards.   I don't know why the macros are missing now. :( */#ifndef PARSER_HEADER_H# define PARSER_HEADER_H#include <string>#include <iostream>/* Using locations.  */#define YYLSP_NEEDED ]b4_locations_flag[namespace yy{  class position;  class location;}]b4_token_defines(b4_tokens)[/* Copy the first part of user declarations.  */]b4_pre_prologue[]/* Line __line__ of lalr1.cc.  */b4_syncline([@oline@], [@ofile@])[#include "stack.hh"#include "location.hh"/* Enabling traces.  */#ifndef YYDEBUG# define YYDEBUG ]b4_debug[#endif/* Enabling verbose error message.  */#ifndef YYERROR_VERBOSE# define YYERROR_VERBOSE ]b4_error_verbose[#endif#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)]m4_ifdef([b4_stype],[b4_syncline([b4_stype_line], [b4_filename])union YYSTYPE b4_stype;/* Line __line__ of lalr1.cc.  */b4_syncline([@oline@], [@ofile@])],[typedef int YYSTYPE;])[# define yystype YYSTYPE /* obsolescent; will be withdrawn */# define YYSTYPE_IS_DECLARED 1# define YYSTYPE_IS_TRIVIAL 1#endif/* Copy the second part of user declarations.  */]b4_post_prologue[]/* Line __line__ of lalr1.cc.  */b4_syncline([@oline@], [@ofile@])[/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].   If N is 0, then set CURRENT to the empty location which ends   the previous symbol: RHS[0] (always defined).  */#ifndef YYLLOC_DEFAULT# define YYLLOC_DEFAULT(Current, Rhs, N)		\do {							\  if (N)						\    {							\      (Current).begin = (Rhs)[1].begin;			\      (Current).end   = (Rhs)[N].end;			\    }							\  else							\    {							\      (Current).begin = (Current).end = (Rhs)[0].end;	\    }							\} while (0)#endifnamespace yy{  class ]b4_parser_class_name[;  template <typename P>  struct traits  {  };  template <>  struct traits<]b4_parser_class_name[>  {    typedef ]b4_int_type_for([b4_translate])[ token_number_type;    typedef ]b4_int_type_for([b4_rhs])[       rhs_number_type;    typedef int state_type;    typedef YYSTYPE semantic_type;    typedef ]b4_location_type[ location_type;  };}namespace yy{  /// A Bison parser.  class ]b4_parser_class_name[  {    /// Symbol semantic values.    typedef traits<]b4_parser_class_name[>::semantic_type semantic_type;    /// Symbol locations.    typedef traits<]b4_parser_class_name[>::location_type location_type;  public:    /// Build a parser object.    ]b4_parser_class_name[ (]b4_parse_param_decl[) :      yydebug_ (false),      yycdebug_ (&std::cerr)]b4_parse_param_cons[    {    }    virtual ~]b4_parser_class_name[ ()    {    }    /// Parse.    /// \returns  0 iff parsing succeeded.    virtual int parse ();    /// The current debugging stream.    std::ostream& debug_stream () const;    /// Set the current debugging stream.    void set_debug_stream (std::ostream &);    /// Type for debugging levels.    typedef int debug_level_type;    /// The current debugging level.    debug_level_type debug_level () const;    /// Set the current debugging level.    void set_debug_level (debug_level_type l);  private:    /// Call the scanner.    virtual void yylex_ ();    /// Report a syntax error.    /// \param loc    where the syntax error is found.    /// \param msg    a description of the syntax error.    virtual void error (const location_type& loc, const std::string& msg);    /// Generate an error message, and invoke error.    virtual void yyreport_syntax_error_ ();#if YYDEBUG    /// \brief Report a symbol on the debug stream.    /// \param yytype       The token type.    /// \param yyvaluep     Its semantic value.    /// \param yylocationp  Its location.    virtual void yysymprint_ (int yytype,			      const semantic_type* yyvaluep,			      const location_type* yylocationp);#endif /* ! YYDEBUG */    /// State numbers.    typedef traits<]b4_parser_class_name[>::state_type state_type;    /// State stack type.    typedef stack<state_type>    state_stack_type;    /// Semantic value stack type.    typedef stack<semantic_type> semantic_stack_type;    /// location stack type.    typedef stack<location_type> location_stack_type;    /// The state stack.    state_stack_type yystate_stack_;    /// The semantic value stack.    semantic_stack_type yysemantic_stack_;    /// The location stack.    location_stack_type yylocation_stack_;    /// Internal symbol numbers.    typedef traits<]b4_parser_class_name[>::token_number_type token_number_type;    /* Tables.  */    /// For a state, the index in \a yytable_ of its portion.    static const ]b4_int_type_for([b4_pact])[ yypact_[];    static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;    /// For a state, default rule to reduce.    /// Unless\a  yytable_ specifies something else to do.    /// Zero means the default is an error.    static const ]b4_int_type_for([b4_defact])[ yydefact_[];    static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];    static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];    /// What to do in a state.    /// \a yytable_[yypact_[s]]: what to do in state \a s.    /// - if positive, shift that token.    /// - if negative, reduce the rule which number is the opposite.    /// - if zero, do what YYDEFACT says.    static const ]b4_int_type_for([b4_table])[ yytable_[];    static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;    static const ]b4_int_type_for([b4_check])[ yycheck_[];    /// For a state, its accessing symbol.    static const ]b4_int_type_for([b4_stos])[ yystos_[];    /// For a rule, its LHS.    static const ]b4_int_type_for([b4_r1])[ yyr1_[];    /// For a rule, its RHS length.    static const ]b4_int_type_for([b4_r2])[ yyr2_[];#if YYDEBUG || YYERROR_VERBOSE    /// For a symbol, its name in clear.    static const char* const yyname_[];#endif#if YYDEBUG    /// A type to store symbol numbers and -1.    typedef traits<]b4_parser_class_name[>::rhs_number_type rhs_number_type;    /// A `-1'-separated list of the rules' RHS.    static const rhs_number_type yyrhs_[];    /// For each rule, the index of the first RHS symbol in \a yyrhs_.    static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];    /// For each rule, its source line number.    static const ]b4_int_type_for([b4_rline])[ yyrline_[];    /// For each scanner token number, its symbol number.    static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];    /// Report on the debug stream that the rule \a r is going to be reduced.    virtual void yyreduce_print_ (int r);    /// Print the state stack on the debug stream.    virtual void yystack_print_ ();#endif    /// Convert a scanner token number to a symbol number.    inline token_number_type yytranslate_ (int token);    /// \brief Reclaim the memory associated to a symbol.    /// \param yymsg        Why this token is reclaimed.    /// \param yytype       The symbol type.    /// \param yyvaluep     Its semantic value.    /// \param yylocationp  Its location.    inline void yydestruct_ (const char* yymsg,                             int yytype,                             semantic_type* yyvaluep,                             location_type* yylocationp);    /// Pop \a n symbols the three stacks.    inline void yypop_ (unsigned int n = 1);    /* Constants.  */    static const int yyeof_;    /* LAST_ -- Last index in TABLE_.  */    static const int yylast_;    static const int yynnts_;    static const int yyempty_;    static const int yyfinal_;    static const int yyterror_;    static const int yyerrcode_;    static const int yyntokens_;    static const unsigned int yyuser_token_number_max_;    static const token_number_type yyundef_token_;    /* State.  */    int yyn_;    int yylen_;    int yystate_;    /* Error handling. */    int yynerrs_;    int yyerrstatus_;    /* Debugging.  */    int yydebug_;    std::ostream* yycdebug_;    /* Look-ahead and look-ahead in internal form.  */    int yylooka_;    int yyilooka_;    /// Semantic value of the look-ahead.    semantic_type yylval;    /// Location of the look-ahead.    location_type yylloc;    /// The locations where the error started and ended.    location yyerror_range_[2];    /// $$.    semantic_type yyval;    /// @@$.    location_type yyloc;]b4_parse_param_vars[  };}#endif /* ! defined PARSER_HEADER_H */]])dnl@output @output_parser_name@b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison],             [2002, 2003, 2004])m4_if(b4_prefix[], [yy], [],[// Take the name prefix into account.#define yylex   b4_prefix[]lex])m4_if(b4_defines_flag, 0, [],[#include @output_header_name@])[/* A pseudo ostream that takes yydebug_ into account. */# define YYCDEBUG							\  for (bool yydebugcond_ = yydebug_; yydebugcond_; yydebugcond_ = false)	\    (*yycdebug_)/* Enable debugging if requested.  */#if YYDEBUG# define YY_SYMBOL_PRINT(Title, Type, Value, Location)	\do {							\  if (yydebug_)						\    {							\      *yycdebug_ << (Title) << ' ';			\      yysymprint_ ((Type), (Value), (Location));	\      *yycdebug_ << std::endl;				\    }							\} while (0)# define YY_REDUCE_PRINT(Rule)		\do {					\  if (yydebug_)				\    yyreduce_print_ (Rule);		\} while (0)# define YY_STACK_PRINT()		\do {					\  if (yydebug_)				\    yystack_print_ ();			\} while (0)#else /* !YYDEBUG */# define YY_SYMBOL_PRINT(Title, Type, Value, Location)# define YY_REDUCE_PRINT(Rule)# define YY_STACK_PRINT()#endif /* !YYDEBUG */#define YYACCEPT	goto yyacceptlab#define YYABORT		goto yyabortlab#define YYERROR		goto yyerrorlab

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?