X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/7db2ed2d82f65d980ab93645e288b0b75c74e3e6..5dac0025f6cef52c95cf1b8d04c5047980a73160:/data/lalr1.cc diff --git a/data/lalr1.cc b/data/lalr1.cc index f0844bb2..0dd1eb06 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -19,6 +19,23 @@ m4_divert(-1) m4_include([c.m4]) +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Stack parameters. +m4_define_default([b4_stack_depth_init], [200]) + +# Default Parser class name. +m4_define_default([b4_parser_class_name], [Parser]) + + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + # b4_lhs_value([TYPE]) # -------------------- # Expansion of $$. @@ -31,8 +48,9 @@ m4_define([b4_lhs_value], # Expansion of $NUM, where the current rule has RULE-LENGTH # symbols on RHS. m4_define([b4_rhs_value], -[semantic_stack_@<:@m4_eval([$1 - $2])@:>@m4_ifval([$3], [.$3])]) +[semantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3])]) +m4_define_default([b4_location_type], [Location]) # b4_lhs_location() # ----------------- @@ -46,27 +64,8 @@ m4_define([b4_lhs_location], # Expansion of @NUM, where the current rule has RULE-LENGTH symbols # on RHS. m4_define([b4_rhs_location], -[location_stack_@<:@m4_eval([$1 - $2])@:>@]) - - -m4_define_default([b4_input_suffix], [.y]) - -m4_define_default([b4_output_parser_suffix], -[m4_translit(b4_input_suffix, [yY], [cC])]) - -m4_define_default([b4_output_parser_name], -[b4_output_prefix[]b4_output_infix[]b4_output_parser_suffix[]]) - +[location_stack_@{m4_eval([$1 - $2])@}]) -m4_define_default([b4_output_header_suffix], -[m4_translit(b4_input_suffix, [yY], [hH])]) - -m4_define_default([b4_output_header_name], -[b4_output_prefix[]b4_output_infix[]b4_output_header_suffix[]]) - -m4_define_default([b4_header_guard], - [m4_bpatsubst(m4_toupper([BISON_]b4_output_header_name), - [[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]], [_])]) m4_define([b4_inherit], [m4_ifdef([b4_root], @@ -87,12 +86,14 @@ m4_define([b4_constructor], [])]) +# We do want M4 expansion after # for CPP macros. +m4_changecom() m4_divert(0)dnl -#output "b4_output_header_name" +@output @output_header_name@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], [2002]) -#ifndef b4_header_guard -# define b4_header_guard +#ifndef YYLSP_NEEDED +# define YYLSP_NEEDED #include "stack.hh" #include "location.hh" @@ -103,14 +104,13 @@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], /* Using locations. */ #define YYLSP_NEEDED b4_locations_flag +b4_token_defines(b4_tokens) + /* Copy the first part of user declarations. */ b4_pre_prologue /* Line __line__ of __file__. */ -#line __oline__ "__ofile__" - -/* Tokens. */ -b4_token_defines(b4_tokens) +b4_syncline([@oline@], [@ofile@]) /* Enabling traces. */ #ifndef YYDEBUG @@ -124,10 +124,10 @@ b4_token_defines(b4_tokens) #ifndef YYSTYPE m4_ifdef([b4_stype], -[#line b4_stype_line "b4_filename" +[b4_syncline([b4_stype_line], [b4_filename]) typedef union b4_stype yystype; /* Line __line__ of __file__. */ -#line __oline__ "__ofile__"], +b4_syncline([@oline@], [@ofile@])], [typedef int yystype;]) # define YYSTYPE yystype #endif @@ -136,28 +136,16 @@ typedef union b4_stype yystype; b4_post_prologue /* Line __line__ of __file__. */ -#line __oline__ "__ofile__" +b4_syncline([@oline@], [@ofile@]) #ifndef YYLLOC_DEFAULT # define YYLLOC_DEFAULT(Current, Rhs, N) \ Current.last_line = Rhs[[N]].last_line; \ Current.last_column = Rhs[[N]].last_column; #endif -m4_if(b4_locations_flag, [0], [], -[#ifndef YYLTYPE -typedef struct yyltype -{ - int first_line; - int first_column; - int last_line; - int last_column; -} yyltype; -# define YYLTYPE yyltype -#endif]) - namespace yy { - class b4_name; + class b4_parser_class_name; template < typename P > struct Traits @@ -165,47 +153,47 @@ namespace yy }; template < > - struct Traits< b4_name > + struct Traits< b4_parser_class_name > { - typedef b4_uint_type(b4_translate_max) TokenNumberType; - typedef b4_sint_type(b4_rhs_max) RhsNumberType; + typedef b4_int_type_for([b4_translate]) TokenNumberType; + typedef b4_int_type_for([b4_rhs]) RhsNumberType; typedef int StateType; typedef yystype SemanticType; - typedef b4_ltype LocationType; + typedef b4_location_type LocationType; }; } namespace yy { - class b4_name b4_inherit + class b4_parser_class_name b4_inherit { public: - typedef Traits< b4_name >::TokenNumberType TokenNumberType; - typedef Traits< b4_name >::RhsNumberType RhsNumberType; - typedef Traits< b4_name >::StateType StateType; - typedef Traits< b4_name >::SemanticType SemanticType; - typedef Traits< b4_name >::LocationType LocationType; + typedef Traits< b4_parser_class_name >::TokenNumberType TokenNumberType; + typedef Traits< b4_parser_class_name >::RhsNumberType RhsNumberType; + typedef Traits< b4_parser_class_name >::StateType StateType; + typedef Traits< b4_parser_class_name >::SemanticType SemanticType; + typedef Traits< b4_parser_class_name >::LocationType LocationType; typedef Stack< StateType > StateStack; typedef Stack< SemanticType > SemanticStack; typedef Stack< LocationType > LocationStack; #if YYLSP_NEEDED - b4_name (bool debug, + b4_parser_class_name (bool debug, LocationType initlocation[]b4_param) : b4_constructor[]debug_ (debug), cdebug_ (std::cerr), initlocation_ (initlocation) #else - b4_name (bool debug[]b4_param) : + b4_parser_class_name (bool debug[]b4_param) : b4_constructor[]debug_ (debug), cdebug_ (std::cerr) #endif { } - virtual ~b4_name () + virtual ~b4_parser_class_name () { } @@ -223,14 +211,16 @@ namespace yy LocationStack location_stack_; /* Tables. */ - static const short pact_[[]]; - static const short defact_[[]]; - static const short pgoto_[[]]; - static const short defgoto_[[]]; - static const short table_[[]]; - static const short check_[[]]; - static const b4_uint_type(b4_r1_max) r1_[[]]; - static const b4_uint_type(b4_r2_max) r2_[[]]; + static const b4_int_type_for([b4_pact]) pact_[[]]; + static const b4_int_type_for([b4_pact]) pact_ninf_; + static const b4_int_type_for([b4_defact]) defact_[[]]; + static const b4_int_type_for([b4_pgoto]) pgoto_[[]]; + static const b4_int_type_for([b4_defgoto]) defgoto_[[]]; + static const b4_int_type_for([b4_table]) table_[[]]; + static const b4_int_type_for([b4_table]) table_ninf_; + static const b4_int_type_for([b4_check]) check_[[]]; + static const b4_int_type_for([b4_r1]) r1_[[]]; + static const b4_int_type_for([b4_r2]) r2_[[]]; #if YYDEBUG || YYERROR_VERBOSE static const char* const name_[[]]; @@ -239,10 +229,10 @@ namespace yy /* More tables, for debugging. */ #if YYDEBUG static const RhsNumberType rhs_[[]]; - static const b4_uint_type(b4_prhs_max) prhs_[[]]; - static const b4_uint_type(b4_rline_max) rline_[[]]; - static const b4_uint_type(b4_stos_max) stos_[[]]; - static const short token_number_[[]]; + static const b4_int_type_for([b4_prhs]) prhs_[[]]; + static const b4_int_type_for([b4_rline]) rline_[[]]; + static const b4_int_type_for([b4_stos]) stos_[[]]; + static const b4_int_type_for([b4_toknum]) token_number_[[]]; #endif /* Even more tables. */ @@ -250,8 +240,8 @@ namespace yy /* Constants. */ static const int eof_; + /* LAST_ -- Last index in TABLE_. */ static const int last_; - static const int flag_; static const int nnts_; static const int empty_; static const int final_; @@ -282,7 +272,7 @@ namespace yy SemanticType value; LocationType location; - /* @$ and $$. */ + /* @@$ and $$. */ SemanticType yyval; LocationType yyloc; @@ -291,13 +281,13 @@ namespace yy }; } -#endif /* not b4_header_guard */ - -#output "b4_output_prefix[]b4_output_infix[].cc" +#endif /* ! defined YYLSP_NEEDED */ +dnl +@output @output_parser_name@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], [2002]) -#include "b4_output_header_name" +#include @output_header_name@ /* Enable debugging if requested. */ #if YYDEBUG @@ -307,7 +297,7 @@ b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], #endif /* !YYDEBUG */ int -yy::b4_name::parse () +yy::b4_parser_class_name::parse () { int nerrs = 0; int errstatus = 0; @@ -336,7 +326,7 @@ yy::b4_name::parse () /* Try to take a decision without lookahead. */ n_ = pact_[[state_]]; - if (n_ == flag_) + if (n_ == pact_ninf_) goto yydefault; /* Read a lookahead token. */ @@ -368,14 +358,14 @@ yy::b4_name::parse () } n_ += ilooka_; - if (n_ < 0 || n_ > last_ || check_[[n_]] != ilooka_) + if (n_ < 0 || last_ < n_ || check_[[n_]] != ilooka_) goto yydefault; /* Reduce or error. */ n_ = table_[[n_]]; if (n_ < 0) { - if (n_ == flag_) + if (n_ == table_ninf_) goto yyerrlab; else { @@ -435,8 +425,8 @@ yy::b4_name::parse () { YYCDEBUG << "Reducing via rule " << n_ - 1 << " (line " << rline_[[n_]] << "), "; - for (b4_uint_type(b4_prhs_max) i = prhs_[[n_]]; - rhs_[[i]] >= 0; ++i) + for (b4_int_type_for([b4_prhs]) i = prhs_[[n_]]; + 0 <= rhs_[[i]]; ++i) YYCDEBUG << name_[[rhs_[i]]] << ' '; YYCDEBUG << "-> " << name_[[r1_[n_]]] << std::endl; } @@ -454,7 +444,7 @@ yy::b4_name::parse () } /* Line __line__ of __file__. */ -#line __oline__ "__ofile__" +b4_syncline([@oline@], [@ofile@]) state_stack_.pop (len_); semantic_stack_.pop (len_); @@ -477,7 +467,7 @@ yy::b4_name::parse () /* Shift the result of the reduction. */ n_ = r1_[[n_]]; state_ = pgoto_[[n_ - ntokens_]] + state_stack_[[0]]; - if (state_ >= 0 && state_ <= last_ && check_[[state_]] == state_stack_[[0]]) + if (0 <= state_ && state_ <= last_ && check_[[state_]] == state_stack_[[0]]) state_ = table_[[state_]]; else state_ = defgoto_[[n_ - ntokens_]]; @@ -492,20 +482,20 @@ yy::b4_name::parse () #if YYERROR_VERBOSE n_ = pact_[[state_]]; - if (n_ > flag_ && n_ < last_) + if (pact_ninf_ < n_ && n_ < last_) { - message = "parse error, unexpected "; + message = "syntax error, unexpected "; message += name_[[ilooka_]]; { int count = 0; for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) - if (check_[[x + n_]] == x) + if (check_[[x + n_]] == x && x != terror_) ++count; if (count < 5) { count = 0; for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) - if (check_[[x + n_]] == x) + if (check_[[x + n_]] == x && x != terror_) { message += (!count++) ? ", expecting " : " or "; message += name_[[x]]; @@ -515,7 +505,7 @@ yy::b4_name::parse () } else #endif - message = "parse error"; + message = "syntax error"; error_ (); } goto yyerrlab1; @@ -543,7 +533,7 @@ yy::b4_name::parse () for (;;) { n_ = pact_[[state_]]; - if (n_ != flag_) + if (n_ != pact_ninf_) { n_ += terror_; if (0 <= n_ && n_ <= last_ && check_[[n_]] == terror_) @@ -617,7 +607,7 @@ yy::b4_name::parse () } void -yy::b4_name::lex_ () +yy::b4_parser_class_name::lex_ () { #if YYLSP_NEEDED looka_ = yylex (&value, &location); @@ -628,8 +618,9 @@ yy::b4_name::lex_ () /* YYPACT[[STATE-NUM]] -- Index in YYTABLE of the portion describing STATE-NUM. */ -const short -yy::b4_name::pact_[[]] = +const b4_int_type_for([b4_pact]) yy::b4_parser_class_name::pact_ninf_ = b4_pact_ninf; +const b4_int_type_for([b4_pact]) +yy::b4_parser_class_name::pact_[[]] = { b4_pact }; @@ -637,22 +628,22 @@ yy::b4_name::pact_[[]] = /* YYDEFACT[[S]] -- default rule to reduce with in state S when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ -const short -yy::b4_name::defact_[[]] = +const b4_int_type_for([b4_defact]) +yy::b4_parser_class_name::defact_[[]] = { b4_defact }; /* YYPGOTO[[NTERM-NUM]]. */ -const short -yy::b4_name::pgoto_[[]] = +const b4_int_type_for([b4_pgoto]) +yy::b4_parser_class_name::pgoto_[[]] = { b4_pgoto }; /* YYDEFGOTO[[NTERM-NUM]]. */ -const short -yy::b4_name::defgoto_[[]] = +const b4_int_type_for([b4_defgoto]) +yy::b4_parser_class_name::defgoto_[[]] = { b4_defgoto }; @@ -660,15 +651,16 @@ yy::b4_name::defgoto_[[]] = /* YYTABLE[[YYPACT[STATE-NUM]]]. What to do in state STATE-NUM. If positive, shift that token. If negative, reduce the rule which number is the opposite. If zero, do what YYDEFACT says. */ -const short -yy::b4_name::table_[[]] = +const b4_int_type_for([b4_table]) yy::b4_parser_class_name::table_ninf_ = b4_table_ninf; +const b4_int_type_for([b4_table]) +yy::b4_parser_class_name::table_[[]] = { b4_table }; /* YYCHECK. */ -const short -yy::b4_name::check_[[]] = +const b4_int_type_for([b4_check]) +yy::b4_parser_class_name::check_[[]] = { b4_check }; @@ -676,31 +668,31 @@ yy::b4_name::check_[[]] = #if YYDEBUG /* STOS_[[STATE-NUM]] -- The (internal number of the) accessing symbol of state STATE-NUM. */ -const b4_uint_type(b4_stos_max) -yy::b4_name::stos_[[]] = +const b4_int_type_for([b4_stos]) +yy::b4_parser_class_name::stos_[[]] = { b4_stos }; /* TOKEN_NUMBER_[[YYLEX-NUM]] -- Internal token number corresponding to YYLEX-NUM. */ -const short -yy::b4_name::token_number_[[]] = +const b4_int_type_for([b4_toknum]) +yy::b4_parser_class_name::token_number_[[]] = { b4_toknum }; #endif /* YYR1[[YYN]] -- Symbol number of symbol that rule YYN derives. */ -const b4_uint_type(b4_r1_max) -yy::b4_name::r1_[[]] = +const b4_int_type_for([b4_r1]) +yy::b4_parser_class_name::r1_[[]] = { b4_r1 }; /* YYR2[[YYN]] -- Number of symbols composing right hand side of rule YYN. */ -const b4_uint_type(b4_r2_max) -yy::b4_name::r2_[[]] = +const b4_int_type_for([b4_r2]) +yy::b4_parser_class_name::r2_[[]] = { b4_r2 }; @@ -709,7 +701,7 @@ yy::b4_name::r2_[[]] = /* YYTNAME[[SYMBOL-NUM]] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ const char* -const yy::b4_name::name_[[]] = +const yy::b4_parser_class_name::name_[[]] = { b4_tname }; @@ -717,31 +709,31 @@ const yy::b4_name::name_[[]] = #if YYDEBUG /* YYRHS -- A `-1'-separated list of the rules' RHS. */ -const yy::b4_name::RhsNumberType -yy::b4_name::rhs_[[]] = +const yy::b4_parser_class_name::RhsNumberType +yy::b4_parser_class_name::rhs_[[]] = { b4_rhs }; /* YYPRHS[[YYN]] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ -const b4_uint_type(b4_prhs_max) -yy::b4_name::prhs_[[]] = +const b4_int_type_for([b4_prhs]) +yy::b4_parser_class_name::prhs_[[]] = { b4_prhs }; /* YYRLINE[[YYN]] -- source line where rule number YYN was defined. */ -const b4_uint_type(b4_rline_max) -yy::b4_name::rline_[[]] = +const b4_int_type_for([b4_rline]) +yy::b4_parser_class_name::rline_[[]] = { b4_rline }; #endif /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -yy::b4_name::TokenNumberType -yy::b4_name::translate_ (int token) +yy::b4_parser_class_name::TokenNumberType +yy::b4_parser_class_name::translate_ (int token) { static const TokenNumberType @@ -755,23 +747,22 @@ yy::b4_name::translate_ (int token) return undef_token_; } -const int yy::b4_name::eof_ = 0; -const int yy::b4_name::last_ = b4_last; -const int yy::b4_name::flag_ = b4_flag; -const int yy::b4_name::nnts_ = b4_nterms_number; -const int yy::b4_name::empty_ = -2; -const int yy::b4_name::final_ = b4_final_state_number; -const int yy::b4_name::terror_ = 1; -const int yy::b4_name::errcode_ = 256; -const int yy::b4_name::ntokens_ = b4_tokens_number; -const int yy::b4_name::initdepth_ = b4_initdepth; +const int yy::b4_parser_class_name::eof_ = 0; +const int yy::b4_parser_class_name::last_ = b4_last; +const int yy::b4_parser_class_name::nnts_ = b4_nterms_number; +const int yy::b4_parser_class_name::empty_ = -2; +const int yy::b4_parser_class_name::final_ = b4_final_state_number; +const int yy::b4_parser_class_name::terror_ = 1; +const int yy::b4_parser_class_name::errcode_ = 256; +const int yy::b4_parser_class_name::ntokens_ = b4_tokens_number; +const int yy::b4_parser_class_name::initdepth_ = b4_stack_depth_init; -const unsigned yy::b4_name::user_token_number_max_ = b4_user_token_number_max; -const yy::b4_name::TokenNumberType yy::b4_name::undef_token_ = b4_undef_token_number; +const unsigned yy::b4_parser_class_name::user_token_number_max_ = b4_user_token_number_max; +const yy::b4_parser_class_name::TokenNumberType yy::b4_parser_class_name::undef_token_ = b4_undef_token_number; b4_epilogue - -#output "stack.hh" +dnl +@output stack.hh b4_copyright([2002]) #ifndef BISON_STACK_HH @@ -867,8 +858,8 @@ namespace yy } #endif // not BISON_STACK_HH - -#output "location.hh" +dnl +@output location.hh b4_copyright([2002]) #ifndef BISON_LOCATION_HH