boost::variant(2)、と、なんとかcaperビルド通りました
やった。動いた。
--- variant.000.hpp Sun Sep 19 20:49:50 2004
+++ variant.hpp Thu Oct 19 03:19:36 2006
@@ -633,16 +633,58 @@ private: // helpers, for visitor interfa
delete backup_lhs_ptr; // nothrow
}
+#ifdef __BORLANDC__
+ template <typename LhsT>
+ void backup_assign_impl(
+ LhsT& lhs_content
+ )
+ {
+ // Backup lhs content...
+ LhsT* backup_lhs_ptr = new LhsT(lhs_content);
+
+ // ...destroy lhs content...
+ lhs_content.~LhsT(); // nothrow
+
+ try
+ {
+ // ...and attempt to copy rhs content into lhs storage:
+ new(lhs_.storage_.address()) RhsT(rhs_content_);
+ }
+ catch (...)
+ {
+ // In case of failure, copy backup pointer to lhs storage...
+ new(lhs_.storage_.address())
+ backup_holder<LhsT>( backup_lhs_ptr ); // nothrow
+
+ // ...indicate now using backup...
+ lhs_.indicate_backup_which( lhs_.which() ); // nothrow
+
+ // ...and rethrow:
+ throw;
+ }
+
+ // In case of success, indicate new content type...
+ lhs_.indicate_which(rhs_which_); // nothrow
+
+ // ...and delete backup:
+ delete backup_lhs_ptr; // nothrow
+ }
+#endif
+
public: // visitor interface
template <typename LhsT>
BOOST_VARIANT_AUX_RETURN_VOID_TYPE
internal_visit(LhsT& lhs_content, int)
{
+#ifdef __BORLANDC__
+ backup_assign_impl<LhsT>( lhs_content );
+#else
typedef typename has_nothrow_move_constructor<LhsT>::type
nothrow_move;
backup_assign_impl( lhs_content, nothrow_move() );
+#endif
BOOST_VARIANT_AUX_RETURN_VOID;
}えーと、そもそもなんでC++Builderでビルドしようと思ったんだったっけ?
ああそうだそうだ、多分VC++2005のランタイムが入って無くて添付のcaper.exeが動かなかったんだ。
ビルドに要したcaper自体への修正は====以下に。template中でenum宣言するとわけわからんエラーを吐くコンパイラが悪い。
私が以前作りかけたずぼら向けパーサジェネレータは、普通に飽きて放置していたのでした。なんか構文木を自動でなど欲しい機能は既にid:jonigataさんの視野に入っているようですので、ビルドも通ったことですし勝手に私の使う言語に対応させたいと思います。
--- lalr.000.hpp Tue Oct 17 20:03:00 2006
+++ lalr.hpp Thu Oct 19 03:41:40 2006
@@ -300,6 +300,13 @@ public:
*
*==========================================================================*/
+typedef enum {
+ action_shift,
+ action_reduce,
+ action_accept,
+ action_error,
+} type_t;
+
template < class Token, class Traits >
class parsing_table {
public:
@@ -312,12 +319,7 @@ public:
typedef std::vector< rule_type > rules_type;
struct action {
- enum {
- action_shift,
- action_reduce,
- action_accept,
- action_error,
- } type;
+ type_t type;
int dest_index; // index to states_
int rule_index; // index to rules_
@@ -1001,7 +1003,7 @@ make_lalr_table(
typename parsing_table_type::state::action_table_type::const_iterator k =
s->action_table.find( a.token() );
if( k != s->action_table.end() ) {
- if( (*k).second.type == parsing_table_type::action::action_reduce ) {
+ if( (*k).second.type == action_reduce ) {
#ifdef ZW_PARSER_LIVECAST
std::cerr << "shift/reduce conflict" << std::endl;
#endif
@@ -1010,7 +1012,7 @@ make_lalr_table(
}
typename parsing_table_type::action action;
- action.type = parsing_table_type::action::action_shift;
+ action.type = action_shift;
action.dest_index = (*next).second;
action.rule_index = rule_indices[ x.rule() ];
s->action_table[ a.token() ] = action;
@@ -1031,14 +1033,14 @@ make_lalr_table(
if( k != s->action_table.end() ) {
const rule_type& krule = table.rules()[ (*k).second.rule_index ];
- if( (*k).second.type == parsing_table_type::action::action_shift ) {
+ if( (*k).second.type == action_shift ) {
#ifdef ZW_PARSER_LIVECAST
std::cerr << "shift/reduce conflict" << std::endl;
#endif
srr( krule, x.rule() );
add_action = false; // shiftを優先
}
- if( (*k).second.type == parsing_table_type::action::action_reduce &&
+ if( (*k).second.type == action_reduce &&
!( krule == x.rule() ) ) {
#ifdef ZW_PARSER_LIVECAST
std::cerr << "reduce/reduce conflict" << std::endl;
@@ -1054,13 +1056,13 @@ make_lalr_table(
// "reduce A→α"を入れる。
typename parsing_table_type::action a;
- a.type = parsing_table_type::action::action_reduce;
+ a.type = action_reduce;
a.rule_index = rule_indices[ x.rule() ];
s->action_table[ x.lookahead().token() ] = a;
} else {
// c) 項[S'→S・,$]がJiの要素ならば、action[i,$]に"accept"を入れる。
typename parsing_table_type::action a;
- a.type = parsing_table_type::action::action_accept;
+ a.type = action_accept;
a.rule_index = rule_indices[ g.root_rule() ];
s->action_table[Traits::eof()] = a;
}
@@ -1271,14 +1273,14 @@ public:
const action_type* a = &((*i).second);
switch( a->type ) {
- case action_type::action_shift:
+ case action_shift:
#ifdef ZW_PARSER_LIVECAST
std::cerr << "shift(" << x << ")\n";
#endif
push_stack( a->dest_index, v );
ate = true;
break;
- case action_type::action_reduce: {
+ case action_reduce: {
const rule_type& rule = rules[ a->rule_index ];
#ifdef ZW_PARSER_LIVECAST
std::cerr << "reduce(" << rule << ")\n";
@@ -1295,14 +1297,14 @@ public:
}
break;
}
- case action_type::action_accept: {
+ case action_accept: {
#ifdef ZW_PARSER_LIVECAST
std::cerr << "accept(" << rules[ a->rule_index ] << ")\n";
#endif
run_semantic_action( accept_value_, a->rule_index );
return true;
}
- case action_type::action_error:
+ case action_error:
default:
throw syntax_error();
}
@@ -1342,7 +1344,7 @@ private:
}
private:
- table_type table_;
+ typename Table table_;
semantic_actions_type semantic_actions_;
value_type accept_value_;
--- grammar.000.hpp Mon Oct 16 12:52:16 2006
+++ grammar.hpp Thu Oct 19 01:59:56 2006
@@ -325,7 +325,7 @@ std::ostream& operator<<( std::ostream&
case symbol_type::type_nonterminal: return os << r.name_;
default: assert(0); return os;
}
- return os;
+ // return os; // 警告を消すためコメントアウト
}
/*============================================================================--- caper.000.cpp Tue Oct 17 20:03:00 2006
+++ caper.cpp Thu Oct 19 03:49:44 2006
@@ -17,7 +17,16 @@
#include <algorithm>
#include <boost/variant.hpp>
#include <boost/scoped_ptr.hpp>
+
+#ifdef __BORLANDC__
+#include <stdlib>
+//#include <locale>
+#include <ctype.h>
+#undef getc
+#undef ungetc
+#else
#include <boost/algorithm/string/case_conv.hpp>
+#endif
////////////////////////////////////////////////////////////////
// types
@@ -1092,7 +1101,10 @@ void generate_cpp(
const tgt::parsing_table& table )
{
std::string headername = options.namespace_name;
- boost::algorithm::to_upper( headername );
+ //boost::algorithm::to_upper( headername );
+ for(std::string::iterator i = headername.begin(); i < headername.end(); ++i){
+ *i = toupper(*i);
+ }
headername += "_HPP";
// once header
@@ -1471,7 +1483,7 @@ void generate_cpp(
// action
const tgt::parsing_table::action* a = &(*j).second;
switch( a->type ) {
- case tgt::parsing_table::action::action_shift:
+ case zw::gr::action_shift:
os << " // shift\n"
<< " push_stack( "
<< "&Parser::state_" << a->dest_index << ", "
@@ -1479,7 +1491,7 @@ void generate_cpp(
<< "value );\n"
<< " return false;\n";
break;
- case tgt::parsing_table::action::action_reduce:
+ case zw::gr::action_reduce:
os << " // reduce\n";
{
size_t base = table.rules()[ a->rule_index ].right().size();
@@ -1528,14 +1540,14 @@ void generate_cpp(
}
}
break;
- case tgt::parsing_table::action::action_accept:
+ case zw::gr::action_accept:
os << " // accept\n"
<< " // run_semantic_action();\n"
<< " accepted_ = true;\n"
<< " accepted_value_ = get_arg( 1, 0 );\n" // implicit root
<< " return false;\n";
break;
- case tgt::parsing_table::action::action_error:
+ case zw::gr::action_error:
os << " sa_.syntax_error();\n";
os << " error_ = true;\n";
os << " return false;\n";