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 + -
显示快捷键?