diff --git a/ChangeLog b/ChangeLog index 27448385..d4c8ef07 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2004-12-22 Akim Demaille + + * data/lalr1.cc (parser::token_number_type, parser::rhs_number_type) + (parser::state_type, parser::semantic_type, parser::location_type): + Private, not public. + (parser::parse): Return ints, not bool. + Returning a bool introduces a problem: 0 corresponds to false, and + it seems weird to return false on success. Returning true changes + the conventions for yyparse. + Alternatively we could return void and send an exception. + There is no clear consensus (yet?). + (state_stack, semantic_stack, location_stack): Rename as... + (state_stack_type, semantic_stack_type, location_stack_type): these. + Private, not public. + * tests/c++.at: New. + * tests/testsuite.at, tests/Makefile.am: Adjust. + 2004-12-21 Akim Demaille * data/lalr1.cc (parser::parse): Return a bool instead of an int. diff --git a/data/lalr1.cc b/data/lalr1.cc index bf71ade5..b2f24a0b 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -213,25 +213,12 @@ namespace yy /// A Bison parser. class ]b4_parser_class_name[ { - public: - /// Internal symbol numbers. - typedef traits<]b4_parser_class_name[>::token_number_type token_number_type; - /// A type to store symbol numbers and -1. - typedef traits<]b4_parser_class_name[>::rhs_number_type rhs_number_type; - /// State numbers. - typedef traits<]b4_parser_class_name[>::state_type state_type; /// Symbol semantic values. - typedef traits<]b4_parser_class_name[>::semantic_type semantic_type; + typedef traits<]b4_parser_class_name[>::semantic_type semantic_type; /// Symbol locations. - typedef traits<]b4_parser_class_name[>::location_type location_type; - - /// State stack type. - typedef stack state_stack; - /// Semantic value stack type. - typedef stack semantic_stack; - /// location stack type. - typedef stack location_stack; + 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), @@ -245,7 +232,7 @@ namespace yy /// Parse. /// \returns 0 iff parsing succeeded. - virtual bool parse (); + virtual int parse (); /// The current debugging stream. std::ostream& debug_stream () const; @@ -283,13 +270,24 @@ namespace yy #endif /* ! YYDEBUG */ - /// The state stack. - state_stack yystate_stack_; - /// The semantic value stack. - semantic_stack yysemantic_stack_; - /// The location stack. - location_stack yylocation_stack_; + /// State numbers. + typedef traits<]b4_parser_class_name[>::state_type state_type; + /// State stack type. + typedef stack state_stack_type; + /// Semantic value stack type. + typedef stack semantic_stack_type; + /// location stack type. + typedef stack 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_[]; @@ -327,6 +325,8 @@ namespace yy #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_. @@ -538,7 +538,7 @@ yy::]b4_parser_class_name[::set_debug_level (debug_level_type l) } -bool +int yy::]b4_parser_class_name[::parse () { YYCDEBUG << "Starting parse" << std::endl; @@ -564,9 +564,9 @@ b4_syncline([@oline@], [@ofile@])])dnl yynewstate, since the latter expects the semantical and the location values to have been already stored, initialize these stacks with a primary value. */ - yystate_stack_ = state_stack (0); - yysemantic_stack_ = semantic_stack (0); - yylocation_stack_ = location_stack (0); + yystate_stack_ = state_stack_type (0); + yysemantic_stack_ = semantic_stack_type (0); + yylocation_stack_ = location_stack_type (0); yysemantic_stack_.push (yylval); yylocation_stack_.push (yylloc); @@ -669,7 +669,7 @@ yyreduce: yyval = yysemantic_stack_[0]; { - slice slice (yylocation_stack_, yylen_); + slice slice (yylocation_stack_, yylen_); YYLLOC_DEFAULT (yyloc, slice, yylen_); } YY_REDUCE_PRINT (yyn_); @@ -996,7 +996,7 @@ void yy::]b4_parser_class_name[::yystack_print_ () { *yycdebug_ << "Stack now"; - for (state_stack::const_iterator i = yystate_stack_.begin (); + for (state_stack_type::const_iterator i = yystate_stack_.begin (); i != yystate_stack_.end (); ++i) *yycdebug_ << ' ' << *i; *yycdebug_ << std::endl; @@ -1118,6 +1118,7 @@ namespace yy S seq_; }; + /// Present a slice of the top of a stack. template > class slice { @@ -1283,7 +1284,7 @@ namespace yy ** \{ */ public: /// Construct a location. - location (void) : + location () : begin (), end () { @@ -1295,7 +1296,7 @@ namespace yy ** \{ */ public: /// Reset initial location to final location. - inline void step (void) + inline void step () { begin = end; } diff --git a/tests/Makefile.am b/tests/Makefile.am index ae8c3279..09d7d0a3 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -49,6 +49,7 @@ TESTSUITE_AT = \ synclines.at headers.at actions.at conflicts.at \ calc.at \ torture.at existing.at regression.at \ + c++.at \ cxx-type.at glr-regression.at TESTSUITE = $(srcdir)/testsuite diff --git a/tests/c++.at b/tests/c++.at new file mode 100644 index 00000000..0e1e8e5d --- /dev/null +++ b/tests/c++.at @@ -0,0 +1,103 @@ +# Checking the output filenames. -*- Autotest -*- +# Copyright 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, 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. + +AT_BANNER([[C++ Features.]]) + + +## ----------------------- ## +## Doxygen Documentation. ## +## ----------------------- ## + +m4_define([AT_CHECK_DOXYGEN], +[m4_case([$1], + [Public], [m4_pushdef([AT_DOXYGEN_PRIVATE], [NO])], + [Private], [m4_pushdef([AT_DOXYGEN_PRIVATE], [YES])], + [m4_fatal([invalid argument: $1])]) +AT_SETUP([Doxygen $1 Documentation]) + +AT_DATA([input.yy], +[[%skeleton "lalr1.cc" +%locations +%debug +%defines +%% +exp:; +%% +yy::parser::error (const location& l, const std::string& m) +{ + std::cerr << l << s << std::endl; +} +]]) + +AT_CHECK([bison input.yy -o input.cc], 0) + +AT_DATA([Doxyfile], +[# The PROJECT_NAME tag is a single word (or a sequence of words +# surrounded by quotes) that should identify the project. +PROJECT_NAME = "Bison C++ Parser" + +# The QUIET tag can be used to turn on/off the messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. +QUIET = YES + +# The WARNINGS tag can be used to turn on/off the warning messages +# that are generated by doxygen. Possible values are YES and NO. If +# left blank NO is used. +WARNINGS = YES +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then +# this flag will automatically be disabled. +WARN_IF_UNDOCUMENTED = YES +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings +# for potential errors in the documentation, such as not documenting +# some parameters in a documented function, or documenting parameters +# that don't exist or using markup commands wrongly. +WARN_IF_DOC_ERROR = YES +# The WARN_FORMAT tag determines the format of the warning messages +# that doxygen can produce. The string should contain the $file, +# $line, and $text tags, which will be replaced by the file and line +# number from which the warning originated and the warning text. +WARN_FORMAT = "$file:$line: $text" + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all +# entities in documentation are documented, even if no documentation +# was available. Private class members and static file members will +# be hidden unless the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set +# to YES +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a +# class will be included in the documentation. +EXTRACT_PRIVATE = AT_DOXYGEN_PRIVATE + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. +EXTRACT_STATIC = AT_DOXYGEN_PRIVATE +]) + +AT_CHECK([doxygen --version || exit 77], 0, ignore) +AT_CHECK([doxygen], 0, [], [ignore]) + +AT_CLEANUP + +m4_popdef([AT_DOXYGEN_PRIVATE]) +])# AT_CHECK_DOXYGEN + +AT_CHECK_DOXYGEN([Public]) +AT_CHECK_DOXYGEN([Private]) diff --git a/tests/testsuite.at b/tests/testsuite.at index d54975d7..5fff9e65 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -1,7 +1,7 @@ # Process this file with autom4te to create testsuite. -*- Autotest -*- # Test suite for GNU Bison. -# Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +# Copyright (C) 2000, 2001, 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 @@ -56,6 +56,9 @@ m4_include([existing.at]) # Some old bugs. m4_include([regression.at]) +# Some C++ specific tests. +m4_include([c++.at]) + # GLR tests: # C++ types, simplified m4_include([cxx-type.at])