Synopsis - Cross-Reference
File: /sandbox/bpl/PTree.cc1// 2// Copyright (C) 2005 Stefan Seefeld 3// All rights reserved. 4// Licensed to the public under the terms of the GNU LGPL (>= 2), 5// see the file COPYING for details. 6// 7#include <Synopsis/PTree.hh> 8#include <boost/python.hpp> 9 10namespace bpl = boost::python; 11using namespace Synopsis; 12using namespace Synopsis::PTree; 13 14namespace 15{ 16 17class VisitorWrapper : public Visitor 18{ 19public: 20 VisitorWrapper(PyObject *s) : self(s) {} 21 22 virtual void visit_node(Node *) {} 23 virtual void visit_atom(Atom *a) { apply("visit_node", a);} 24 virtual void visit_list(List *l) { apply("visit_node", l);} 25 26 virtual void visit_literal(Literal *a) { apply("visit_atom", a);} 27 virtual void visit_commented_atom(CommentedAtom *a) { apply("visit_atom", a);} 28 virtual void visit_dup_atom(DupAtom *a) { apply("visit_atom", a);} 29 virtual void visit_identifier(Identifier *a) { apply("visit_atom", a);} 30 virtual void visit_keyword(Keyword *a) { apply("visit_atom", a);} 31// virtual void visit_this(Kwd::This *a) { apply("visit_keyword", a);} 32// virtual void visit_auto(Kwd::Auto *a) { apply("visit_keyword", a);} 33// virtual void visit_boolean(Kwd::Bool *a) { apply("visit_keyword", a);} 34// virtual void visit_char(Kwd::Char *a) { apply("visit_keyword", a);} 35// virtual void visit_wchar(Kwd::WChar *a) { apply("visit_keyword", a);} 36// virtual void visit_const(Kwd::Const *a) { apply("visit_keyword", a);} 37// virtual void visit_double(Kwd::Double *a) { apply("visit_keyword", a);} 38// virtual void visit_extern(Kwd::Extern *a) { apply("visit_keyword", a);} 39// virtual void visit_float(Kwd::Float *a) { apply("visit_keyword", a);} 40// virtual void visit_friend(Kwd::Friend *a) { apply("visit_keyword", a);} 41// virtual void visit_inline(Kwd::Inline *a) { apply("visit_keyword", a);} 42// virtual void visit_int(Kwd::Int *a) { apply("visit_keyword", a);} 43// virtual void visit_long(Kwd::Long *a) { apply("visit_keyword", a);} 44// virtual void visit_mutable(Kwd::Mutable *a) { apply("visit_keyword", a);} 45// virtual void visit_namespace(Kwd::Namespacec *a) { apply("visit_keyword", a);} 46// virtual void visit_private(Kwd::Private *a) { apply("visit_keyword", a);} 47// virtual void visit_protected(Kwd::Protected *a) { apply("visit_keyword", a);} 48// virtual void visit_public(Kwd::Public *a) { apply("visit_keyword", a);} 49// virtual void visit_register(Kwd::Register *a) { apply("visit_keyword", a);} 50// virtual void visit_short(Kwd::Short *a) { apply("visit_keyword", a);} 51// virtual void visit_signed(Kwd::Signed *a) { apply("visit_keyword", a);} 52// virtual void visit_static(Kwd::Static *a) { apply("visit_keyword", a);} 53// virtual void visit_unsigned(Kwd::Unsigned *a) { apply("visit_keyword", a);} 54// virtual void visit_using_(Kwd::Using *a) { apply("visit_keyword", a);} 55// virtual void visit_virtual(Kwd::Virtual *a) { apply("visit_keyword", a);} 56// virtual void visit_void(Kwd::Void *a) { apply("visit_keyword", a);} 57// virtual void visit_volatile(Lwd::Volatile *a) { apply("visit_keyword", a);} 58 59 virtual void visit_brace(Brace *l) { apply("visit_list", l);} 60 virtual void visit_block(Block *l) { apply("visit_brace", l);} 61 virtual void visit_class_body(ClassBody *l) { apply("visit_brace", l);} 62 virtual void visit_typedef(Typedef *l) { apply("visit_list", l);} 63 virtual void visit_template_decl(TemplateDecl *l) { apply("visit_list", l);} 64 virtual void visit_template_instantiation(TemplateInstantiation *l) { apply("visit_list", l);} 65 virtual void visit_extern_template(ExternTemplate *l) { apply("visit_list", l);} 66 virtual void visit_metaclass_decl(MetaclassDecl *l) { apply("visit_list", l);} 67 virtual void visit_linkage_spec(LinkageSpec *l) { apply("visit_list", l);} 68 virtual void visit_namespace_spec(NamespaceSpec *l) { apply("visit_list", l);} 69 virtual void visit_declaration(Declaration *l) { apply("visit_list", l);} 70 virtual void visit_namespace_alias(NamespaceAlias *l) { apply("visit_declaration", l);} 71 virtual void visit_using_directive(UsingDirective *l) { apply("visit_declaration", l);} 72 virtual void visit_parameter_declaration(ParameterDeclaration *l) { apply("visit_declaration", l);} 73 virtual void visit_function_definition(FunctionDefinition *l) { apply("visit_declaration", l);} 74 virtual void visit_using_declaration(UsingDeclaration *l) { apply("visit_list", l);} 75 virtual void visit_declarator(Declarator *l) { apply("visit_list", l);} 76 virtual void visit_name(Name *l) { apply("visit_list", l);} 77 virtual void visit_fstyle_cast_expr(FstyleCastExpr *l) { apply("visit_list", l);} 78 virtual void visit_class_spec(ClassSpec *l) { apply("visit_list", l);} 79 virtual void visit_enum_spec(EnumSpec *l) { apply("visit_list", l);} 80 virtual void visit_access_spec(AccessSpec *l) { apply("visit_list", l);} 81 virtual void visit_access_decl(AccessDecl *l) { apply("visit_list", l);} 82 virtual void visit_user_access_spec(UserAccessSpec *l) { apply("visit_list", l);} 83 virtual void visit_if_statement(IfStatement *l) { apply("visit_list", l);} 84 virtual void visit_switch_statement(SwitchStatement *l) { apply("visit_list", l);} 85 virtual void visit_while_statement(WhileStatement *l) { apply("visit_list", l);} 86 virtual void visit_do_statement(DoStatement *l) { apply("visit_list", l);} 87 virtual void visit_for_statement(ForStatement *l) { apply("visit_list", l);} 88 virtual void visit_try_statement(TryStatement *l) { apply("visit_list", l);} 89 virtual void visit_break_statement(BreakStatement *l) { apply("visit_list", l);} 90 virtual void visit_continue_statement(ContinueStatement *l) { apply("visit_list", l);} 91 virtual void visit_return_statement(ReturnStatement *l) { apply("visit_list", l);} 92 virtual void visit_goto_statement(GotoStatement *l) { apply("visit_list", l);} 93 virtual void visit_case_statement(CaseStatement *l) { apply("visit_list", l);} 94 virtual void visit_default_statement(DefaultStatement *l) { apply("visit_list", l);} 95 virtual void visit_label_statement(LabelStatement *l) { apply("visit_list", l);} 96 virtual void visit_expr_statement(ExprStatement *l) { apply("visit_list", l);} 97 virtual void visit_expression(Expression *l) { apply("visit_list", l);} 98 virtual void visit_assign_expr(AssignExpr *l) { apply("visit_list", l);} 99 virtual void visit_cond_expr(CondExpr *l) { apply("visit_list", l);} 100 virtual void visit_infix_expr(InfixExpr *l) { apply("visit_list", l);} 101 virtual void visit_pm_expr(PmExpr *l) { apply("visit_list", l);} 102 virtual void visit_cast_expr(CastExpr *l) { apply("visit_list", l);} 103 virtual void visit_unary_expr(UnaryExpr *l) { apply("visit_list", l);} 104 virtual void visit_throw_expr(ThrowExpr *l) { apply("visit_list", l);} 105 virtual void visit_sizeof_expr(SizeofExpr *l) { apply("visit_list", l);} 106 virtual void visit_typeid_expr(TypeidExpr *l) { apply("visit_list", l);} 107 virtual void visit_typeof_expr(TypeofExpr *l) { apply("visit_list", l);} 108 virtual void visit_new_expr(NewExpr *l) { apply("visit_list", l);} 109 virtual void visit_delete_expr(DeleteExpr *l) { apply("visit_list", l);} 110 virtual void visit_array_expr(ArrayExpr *l) { apply("visit_list", l);} 111 virtual void visit_funcall_expr(FuncallExpr *l) { apply("visit_list", l);} 112 virtual void visit_postfix_expr(PostfixExpr *l) { apply("visit_list", l);} 113 virtual void visit_dot_member_expr(DotMemberExpr *l) { apply("visit_list", l);} 114 virtual void visit_arrow_member_expr(ArrowMemberExpr *l) { apply("visit_list", l);} 115 virtual void visit_paren_expr(ParenExpr *l) { apply("visit_list", l);} 116 117 virtual void visit(Node *n) { apply("visit_node", n);} 118 virtual void visit(Atom *n) { apply("visit_atom", n);} 119 virtual void visit(List* n) { apply("visit_list", n);} 120 virtual void visit(Literal *n) { apply("visit_literal", n);} 121 virtual void visit(CommentedAtom *n) { apply("visit_commented_atom", n);} 122 virtual void visit(DupAtom *n) { apply("visit_dup_atom", n);} 123 virtual void visit(Identifier *n) { apply("visit_identifier", n);} 124 virtual void visit(Keyword *n) { apply("visit_keyword", n);} 125// virtual void visit(This *n) { apply("visit_this", n);} 126// virtual void visit(Kwd::Auto *n) { apply("visit_auto", n);} 127// virtual void visit(Kwd::Bool *n) { apply("visit_boolean", n);} 128// virtual void visit(Kwd::Char *n) { apply("visit_char", n);} 129// virtual void visit(Kwd::WChar *n) { apply("visit_wchar", n);} 130// virtual void visit(Kwd::Const *n) { apply("visit_const", n);} 131// virtual void visit(Kwd::Double *n) { apply("visit_double", n);} 132// virtual void visit(Kwd::Extern *n) { apply("visit_extern", n);} 133// virtual void visit(Kwd::Float *n) { apply("visit_float", n);} 134// virtual void visit(Kwd::Friend *n) { apply("visit_friend", n);} 135// virtual void visit(Kwd::Inline *n) { apply("visit_inline", n);} 136// virtual void visit(Kwd::Int *n) { apply("visit_int", n);} 137// virtual void visit(Kwd::Long *n) { apply("visit_long", n);} 138// virtual void visit(Kwd::Mutable *n) { apply("visit_mutable", n);} 139// virtual void visit(Kwd::Namespace *n) { apply("visit_namespace", n);} 140// virtual void visit(Kwd::Private *n) { apply("visit_private", n);} 141// virtual void visit(Kwd::Protected *n) { apply("visit_protected", n);} 142// virtual void visit(Kwd::Public *n) { apply("visit_public", n);} 143// virtual void visit(Kwd::Register *n) { apply("visit_register", n);} 144// virtual void visit(Kwd::Short *n) { apply("visit_short", n);} 145// virtual void visit(Kwd::Signed *n) { apply("visit_signed", n);} 146// virtual void visit(Kwd::Static *n) { apply("visit_static", n);} 147// virtual void visit(Kwd::Unsigned *n) { apply("visit_unsigned", n);} 148// virtual void visit(Kwd::Using *n) { apply("visit_using_", n);} 149// virtual void visit(Kwd::Virtual *n) { apply("visit_virtual", n);} 150// virtual void visit(Kwd::Void *n) { apply("visit_void", n);} 151// virtual void visit(Kwd::Volatile *n) { apply("visit_volatile", n);} 152 virtual void visit(Brace *n) { apply("visit_brace", n);} 153 virtual void visit(Block *n) { apply("visit_block", n);} 154 virtual void visit(ClassBody *n) { apply("visit_class_body", n);} 155 virtual void visit(Typedef *n) { apply("visit_typedef", n);} 156 virtual void visit(TemplateDecl *n) { apply("visit_template_decl", n);} 157 virtual void visit(TemplateInstantiation *n) { apply("visit_template_instantiation", n);} 158 virtual void visit(ExternTemplate *n) { apply("visit_extern_template", n);} 159 virtual void visit(MetaclassDecl *n) { apply("visit_metaclass_decl", n);} 160 virtual void visit(LinkageSpec *n) { apply("visit_linkage_spec", n);} 161 virtual void visit(NamespaceSpec *n) { apply("visit_namespace_spec", n);} 162 virtual void visit(NamespaceAlias *n) { apply("visit_namespace_alias", n);} 163 virtual void visit(UsingDirective *n) { apply("visit_using_directive", n);} 164 virtual void visit(Declaration *n) { apply("visit_declaration", n);} 165 virtual void visit(FunctionDefinition *n) { apply("visit_function_definition", n);} 166 virtual void visit(ParameterDeclaration *n) { apply("visit_parameter_declaration", n);} 167 virtual void visit(UsingDeclaration *n) { apply("visit_using_declaration", n);} 168 virtual void visit(Declarator *n) { apply("visit_declarator", n);} 169 virtual void visit(Name *n) { apply("visit_name", n);} 170 virtual void visit(FstyleCastExpr *n) { apply("visit_fstyle_cast_expr", n);} 171 virtual void visit(ClassSpec *n) { apply("visit_class_spec", n);} 172 virtual void visit(EnumSpec *n) { apply("visit_enum_spec", n);} 173 virtual void visit(AccessSpec *n) { apply("visit_access_spec", n);} 174 virtual void visit(AccessDecl *n) { apply("visit_access_decl", n);} 175 virtual void visit(UserAccessSpec *n) { apply("visit_user_access_spec", n);} 176 virtual void visit(IfStatement *n) { apply("visit_if_statement", n);} 177 virtual void visit(SwitchStatement *n) { apply("visit_switch_statement", n);} 178 virtual void visit(WhileStatement *n) { apply("visit_while_statement", n);} 179 virtual void visit(DoStatement *n) { apply("visit_do_statement", n);} 180 virtual void visit(ForStatement *n) { apply("visit_for_statement", n);} 181 virtual void visit(TryStatement *n) { apply("visit_try_statement", n);} 182 virtual void visit(BreakStatement *n) { apply("visit_break_statement", n);} 183 virtual void visit(ContinueStatement *n) { apply("visit_continue_statement", n);} 184 virtual void visit(ReturnStatement *n) { apply("visit_return_statement", n);} 185 virtual void visit(GotoStatement *n) { apply("visit_goto_statement", n);} 186 virtual void visit(CaseStatement *n) { apply("visit_case_statement", n);} 187 virtual void visit(DefaultStatement *n) { apply("visit_default_statement", n);} 188 virtual void visit(LabelStatement *n) { apply("visit_label_statement", n);} 189 virtual void visit(ExprStatement *n) { apply("visit_expr_statement", n);} 190 virtual void visit(Expression *n) { apply("visit_expression", n);} 191 virtual void visit(AssignExpr *n) { apply("visit_assign_expr", n);} 192 virtual void visit(CondExpr *n) { apply("visit_cond_expr", n);} 193 virtual void visit(InfixExpr *n) { apply("visit_infix_expr", n);} 194 virtual void visit(PmExpr *n) { apply("visit_pm_expr", n);} 195 virtual void visit(CastExpr *n) { apply("visit_cast_expr", n);} 196 virtual void visit(UnaryExpr *n) { apply("visit_unary_expr", n);} 197 virtual void visit(ThrowExpr *n) { apply("visit_throw_expr", n);} 198 virtual void visit(SizeofExpr *n) { apply("visit_sizeof_expr", n);} 199 virtual void visit(TypeidExpr *n) { apply("visit_typeid_expr", n);} 200 virtual void visit(TypeofExpr *n) { apply("visit_typeof_expr", n);} 201 virtual void visit(NewExpr *n) { apply("visit_new_expr", n);} 202 virtual void visit(DeleteExpr *n) { apply("visit_delete_expr", n);} 203 virtual void visit(ArrayExpr *n) { apply("visit_array_expr", n);} 204 virtual void visit(FuncallExpr *n) { apply("visit_funcall_expr", n);} 205 virtual void visit(PostfixExpr *n) { apply("visit_postfix_expr", n);} 206 virtual void visit(DotMemberExpr *n) { apply("visit_dot_member_expr", n);} 207 virtual void visit(ArrowMemberExpr *n) { apply("visit_arrow_member_expr", n);} 208 virtual void visit(ParenExpr *n) { apply("visit_paren_expr", n);} 209 210private: 211 void apply(char const *f, Node* n) { bpl::call_method<void>(self, f, bpl::ptr(n));} 212 213 PyObject *self; 214}; 215 216std::string as_string(Encoding const &e) 217{ 218 std::ostringstream oss; 219 oss << e; 220 return oss.str(); 221} 222 223void accept(Node *n, Visitor *v) { n->accept(v);} 224std::string atom_value(Atom *a) { return std::string(a->position(), a->length());} 225Node *car(List *l) { return l->car();} 226Node *cdr(List *l) { return l->cdr();} 227Node *first_(List *l) { return PTree::first(l);} 228Node *second_(List *l) { return PTree::second(l);} 229Node *third_(List *l) { return PTree::third(l);} 230Node *nth_(List *l, size_t k) { return PTree::nth(l, k);} 231Node *rest_(List *l) { return PTree::rest(l);} 232Node *tail_(List *l, size_t k) { return PTree::tail(l, k);} 233 234} 235 236BOOST_PYTHON_MODULE(PTree) 237{ 238 bpl::class_<Encoding> encoding("Encoding"); 239 encoding.def("__str__", as_string); 240 encoding.def("unmangled", &Encoding::unmangled); 241 encoding.add_property("is_simple_name", &Encoding::is_simple_name); 242 encoding.add_property("is_global_scope", &Encoding::is_global_scope); 243 encoding.add_property("is_qualified", &Encoding::is_qualified); 244 encoding.add_property("is_function", &Encoding::is_function); 245 encoding.add_property("is_template", &Encoding::is_template); 246 247 bpl::class_<Visitor, boost::noncopyable, VisitorWrapper> visitor("Visitor"); 248 visitor.def("visit_node", &VisitorWrapper::visit_node); 249 visitor.def("visit_atom", &VisitorWrapper::visit_atom); 250 visitor.def("visit_list", &VisitorWrapper::visit_list); 251 visitor.def("visit_literal", &VisitorWrapper::visit_literal); 252 visitor.def("visit_commented_atom", &VisitorWrapper::visit_commented_atom); 253 visitor.def("visit_dup_atom", &VisitorWrapper::visit_dup_atom); 254 visitor.def("visit_identifier", &VisitorWrapper::visit_identifier); 255 visitor.def("visit_keyword", &VisitorWrapper::visit_keyword); 256// visitor.def("visit_this", &VisitorWrapper::visit_this); 257// visitor.def("visit_auto", &VisitorWrapper::visit_auto); 258// visitor.def("visit_boolean", &VisitorWrapper::visit_boolean); 259// visitor.def("visit_char", &VisitorWrapper::visit_char); 260// visitor.def("visit_wchar", &VisitorWrapper::visit_wchar); 261// visitor.def("visit_const", &VisitorWrapper::visit_const); 262// visitor.def("visit_double", &VisitorWrapper::visit_double); 263// visitor.def("visit_extern", &VisitorWrapper::visit_extern); 264// visitor.def("visit_float", &VisitorWrapper::visit_float); 265// visitor.def("visit_friend", &VisitorWrapper::visit_friend); 266// visitor.def("visit_inline", &VisitorWrapper::visit_inline); 267// visitor.def("visit_int", &VisitorWrapper::visit_int); 268// visitor.def("visit_long", &VisitorWrapper::visit_long); 269// visitor.def("visit_mutable", &VisitorWrapper::visit_mutable); 270// visitor.def("visit_namespace", &VisitorWrapper::visit_namespace); 271// visitor.def("visit_private", &VisitorWrapper::visit_private); 272// visitor.def("visit_protected", &VisitorWrapper::visit_protected); 273// visitor.def("visit_public", &VisitorWrapper::visit_public); 274// visitor.def("visit_register", &VisitorWrapper::visit_register); 275// visitor.def("visit_short", &VisitorWrapper::visit_short); 276// visitor.def("visit_signed", &VisitorWrapper::visit_signed); 277// visitor.def("visit_static", &VisitorWrapper::visit_static); 278// visitor.def("visit_unsigned", &VisitorWrapper::visit_unsigned); 279// visitor.def("visit_using_", &VisitorWrapper::visit_using_); 280// visitor.def("visit_virtual", &VisitorWrapper::visit_virtual); 281// visitor.def("visit_void", &VisitorWrapper::visit_void); 282// visitor.def("visit_volatile", &VisitorWrapper::visit_volatile); 283 visitor.def("visit_brace", &VisitorWrapper::visit_brace); 284 visitor.def("visit_block", &VisitorWrapper::visit_block); 285 visitor.def("visit_class_body", &VisitorWrapper::visit_class_body); 286 visitor.def("visit_typedef", &VisitorWrapper::visit_typedef); 287 visitor.def("visit_template_decl", &VisitorWrapper::visit_template_decl); 288 visitor.def("visit_template_instantiation", &VisitorWrapper::visit_template_instantiation); 289 visitor.def("visit_extern_template", &VisitorWrapper::visit_extern_template); 290 visitor.def("visit_metaclass_decl", &VisitorWrapper::visit_metaclass_decl); 291 visitor.def("visit_linkage_spec", &VisitorWrapper::visit_linkage_spec); 292 visitor.def("visit_namespace_spec", &VisitorWrapper::visit_namespace_spec); 293 visitor.def("visit_namespace_alias", &VisitorWrapper::visit_namespace_alias); 294 visitor.def("visit_using_directive", &VisitorWrapper::visit_using_directive); 295 visitor.def("visit_declaration", &VisitorWrapper::visit_declaration); 296 visitor.def("visit_parameter_declaration", &VisitorWrapper::visit_parameter_declaration); 297 visitor.def("visit_using_declaration", &VisitorWrapper::visit_using_declaration); 298 visitor.def("visit_declarator", &VisitorWrapper::visit_declarator); 299 visitor.def("visit_name", &VisitorWrapper::visit_name); 300 visitor.def("visit_fstyle_cast_expr", &VisitorWrapper::visit_fstyle_cast_expr); 301 visitor.def("visit_class_spec", &VisitorWrapper::visit_class_spec); 302 visitor.def("visit_enum_spec", &VisitorWrapper::visit_enum_spec); 303 visitor.def("visit_access_spec", &VisitorWrapper::visit_access_spec); 304 visitor.def("visit_access_decl", &VisitorWrapper::visit_access_decl); 305 visitor.def("visit_user_access_spec", &VisitorWrapper::visit_user_access_spec); 306 visitor.def("visit_if_statement", &VisitorWrapper::visit_if_statement); 307 visitor.def("visit_switch_statement", &VisitorWrapper::visit_switch_statement); 308 visitor.def("visit_while_statement", &VisitorWrapper::visit_while_statement); 309 visitor.def("visit_do_statement", &VisitorWrapper::visit_do_statement); 310 visitor.def("visit_for_statement", &VisitorWrapper::visit_for_statement); 311 visitor.def("visit_try_statement", &VisitorWrapper::visit_try_statement); 312 visitor.def("visit_break_statement", &VisitorWrapper::visit_break_statement); 313 visitor.def("visit_continue_statement", &VisitorWrapper::visit_continue_statement); 314 visitor.def("visit_return_statement", &VisitorWrapper::visit_return_statement); 315 visitor.def("visit_goto_statement", &VisitorWrapper::visit_goto_statement); 316 visitor.def("visit_case_statement", &VisitorWrapper::visit_case_statement); 317 visitor.def("visit_default_statement", &VisitorWrapper::visit_default_statement); 318 visitor.def("visit_label_statement", &VisitorWrapper::visit_label_statement); 319 visitor.def("visit_expr_statement", &VisitorWrapper::visit_expr_statement); 320 visitor.def("visit_expression", &VisitorWrapper::visit_expression); 321 visitor.def("visit_assign_expr", &VisitorWrapper::visit_assign_expr); 322 visitor.def("visit_cond_expr", &VisitorWrapper::visit_cond_expr); 323 visitor.def("visit_infix_expr", &VisitorWrapper::visit_infix_expr); 324 visitor.def("visit_pm_expr", &VisitorWrapper::visit_pm_expr); 325 visitor.def("visit_cast_expr", &VisitorWrapper::visit_cast_expr); 326 visitor.def("visit_unary_expr", &VisitorWrapper::visit_unary_expr); 327 visitor.def("visit_throw_expr", &VisitorWrapper::visit_throw_expr); 328 visitor.def("visit_sizeof_expr", &VisitorWrapper::visit_sizeof_expr); 329 visitor.def("visit_typeid_expr", &VisitorWrapper::visit_typeid_expr); 330 visitor.def("visit_typeof_expr", &VisitorWrapper::visit_typeof_expr); 331 visitor.def("visit_new_expr", &VisitorWrapper::visit_new_expr); 332 visitor.def("visit_delete_expr", &VisitorWrapper::visit_delete_expr); 333 visitor.def("visit_array_expr", &VisitorWrapper::visit_array_expr); 334 visitor.def("visit_funcall_expr", &VisitorWrapper::visit_funcall_expr); 335 visitor.def("visit_postfix_expr", &VisitorWrapper::visit_postfix_expr); 336 visitor.def("visit_dot_member_expr", &VisitorWrapper::visit_dot_member_expr); 337 visitor.def("visit_arrow_member_expr", &VisitorWrapper::visit_arrow_member_expr); 338 visitor.def("visit_paren_expr", &VisitorWrapper::visit_paren_expr); 339 340 bpl::class_<Node, Node *, boost::noncopyable> node("Node", bpl::no_init); 341 // no idea why we can't pass &Node::accept here, but if we do, 342 // the registry will complain that there is no lvalue conversion... 343 node.def("accept", accept); 344 bpl::class_<Atom, bpl::bases<Node>, Atom *, boost::noncopyable> atom("Atom", bpl::no_init); 345 atom.def("__str__", atom_value); 346 atom.add_property("position", &Atom::position); 347 atom.add_property("length", &Atom::length); 348 bpl::class_<List, bpl::bases<Node>, List *, boost::noncopyable> list("List", bpl::no_init); 349 // The PTree module uses garbage collection so just ignore memory management, 350 // at least for now. 351 list.def("car", car, bpl::return_value_policy<bpl::reference_existing_object>()); 352 list.def("cdr", cdr, bpl::return_value_policy<bpl::reference_existing_object>()); 353 list.def("first", first_, bpl::return_value_policy<bpl::reference_existing_object>()); 354 list.def("second", second_, bpl::return_value_policy<bpl::reference_existing_object>()); 355 list.def("third", third_, bpl::return_value_policy<bpl::reference_existing_object>()); 356 list.def("nth", nth_, bpl::return_value_policy<bpl::reference_existing_object>()); 357 list.def("rest", rest_, bpl::return_value_policy<bpl::reference_existing_object>()); 358 list.def("tail", tail_, bpl::return_value_policy<bpl::reference_existing_object>()); 359 list.add_property("name", &List::encoded_name); 360 list.add_property("type", &List::encoded_type); 361 362 // various atoms 363 364 bpl::class_<Literal, bpl::bases<Atom>, Literal *, boost::noncopyable> literal("Literal", bpl::no_init); 365 bpl::class_<CommentedAtom, bpl::bases<Atom>, CommentedAtom *, boost::noncopyable> comment_atom("CommentedAtom", bpl::no_init); 366 bpl::class_<DupAtom, bpl::bases<CommentedAtom>, DupAtom *, boost::noncopyable> dup_atom("DupAtom", bpl::no_init); 367 bpl::class_<Identifier, bpl::bases<CommentedAtom>, Identifier *, boost::noncopyable> identifier("Identifier", bpl::no_init); 368 bpl::class_<Keyword, bpl::bases<CommentedAtom>, Keyword *, boost::noncopyable> reserved("Keyword", bpl::no_init); 369// bpl::class_<This, bpl::bases<Reserved>, This *, boost::noncopyable> this_("This", bpl::no_init); 370// bpl::class_<AtomAUTO, bpl::bases<Reserved>, AtomAUTO *, boost::noncopyable> atom_auto("AtomAUTO", bpl::no_init); 371// bpl::class_<AtomBOOLEAN, bpl::bases<Reserved>, AtomBOOLEAN *, boost::noncopyable> atom_boolean("AtomBOOLEAN", bpl::no_init); 372// bpl::class_<AtomCHAR, bpl::bases<Reserved>, AtomCHAR *, boost::noncopyable> atom_char("AtomCHAR", bpl::no_init); 373// bpl::class_<AtomWCHAR, bpl::bases<Reserved>, AtomWCHAR *, boost::noncopyable> atom_wchar("AtomWCHAR", bpl::no_init); 374// bpl::class_<AtomCONST, bpl::bases<Reserved>, AtomCONST *, boost::noncopyable> atom_const("AtomCONST", bpl::no_init); 375// bpl::class_<AtomDOUBLE, bpl::bases<Reserved>, AtomDOUBLE *, boost::noncopyable> atom_double("AtomDOUBLE", bpl::no_init); 376// bpl::class_<AtomEXTERN, bpl::bases<Reserved>, AtomEXTERN *, boost::noncopyable> atom_extern("AtomEXTERN", bpl::no_init); 377// bpl::class_<AtomFLOAT, bpl::bases<Reserved>, AtomFLOAT *, boost::noncopyable> atom_float("AtomFLOAT", bpl::no_init); 378// bpl::class_<AtomFRIEND, bpl::bases<Reserved>, AtomFRIEND *, boost::noncopyable> atom_friend("AtomFRIEND", bpl::no_init); 379// bpl::class_<AtomINLINE, bpl::bases<Reserved>, AtomINLINE *, boost::noncopyable> atom_inline("AtomINLINE", bpl::no_init); 380// bpl::class_<AtomINT, bpl::bases<Reserved>, AtomINT *, boost::noncopyable> atom_int("AtomINT", bpl::no_init); 381// bpl::class_<AtomLONG, bpl::bases<Reserved>, AtomLONG *, boost::noncopyable> atom_long("AtomLONG", bpl::no_init); 382// bpl::class_<AtomMUTABLE, bpl::bases<Reserved>, AtomMUTABLE *, boost::noncopyable> atom_mutable("AtomMUTABLE", bpl::no_init); 383// bpl::class_<AtomNAMESPACE, bpl::bases<Reserved>, AtomNAMESPACE *, boost::noncopyable> atom_namespace("AtomNAMESPACE", bpl::no_init); 384// bpl::class_<AtomPRIVATE, bpl::bases<Reserved>, AtomPRIVATE *, boost::noncopyable> atom_private("AtomPRIVATE", bpl::no_init); 385// bpl::class_<AtomPROTECTED, bpl::bases<Reserved>, AtomPROTECTED *, boost::noncopyable> atom_protected("AtomPROTECTED", bpl::no_init); 386// bpl::class_<AtomPUBLIC, bpl::bases<Reserved>, AtomPUBLIC *, boost::noncopyable> atom_public("AtomPUBLIC", bpl::no_init); 387// bpl::class_<AtomREGISTER, bpl::bases<Reserved>, AtomREGISTER *, boost::noncopyable> atom_register("AtomREGISTER", bpl::no_init); 388// bpl::class_<AtomSHORT, bpl::bases<Reserved>, AtomSHORT *, boost::noncopyable> atom_short("AtomSHORT", bpl::no_init); 389// bpl::class_<AtomSIGNED, bpl::bases<Reserved>, AtomSIGNED *, boost::noncopyable> atom_signed("AtomSIGNED", bpl::no_init); 390// bpl::class_<AtomSTATIC, bpl::bases<Reserved>, AtomSTATIC *, boost::noncopyable> atom_static("AtomSTATIC", bpl::no_init); 391// bpl::class_<AtomUNSIGNED, bpl::bases<Reserved>, AtomUNSIGNED *, boost::noncopyable> atom_unsigned("AtomUNSIGNED", bpl::no_init); 392// bpl::class_<AtomUSING, bpl::bases<Reserved>, AtomUSING *, boost::noncopyable> atom_using("AtomUSING", bpl::no_init); 393// bpl::class_<AtomVIRTUAL, bpl::bases<Reserved>, AtomVIRTUAL *, boost::noncopyable> atom_virtual("AtomVIRTUAL", bpl::no_init); 394// bpl::class_<AtomVOID, bpl::bases<Reserved>, AtomVOID *, boost::noncopyable> atom_void("AtomVOID", bpl::no_init); 395// bpl::class_<AtomVOLATILE, bpl::bases<Reserved>, AtomVOLATILE *, boost::noncopyable> atom_volatile("AtomVOLATILE", bpl::no_init); 396// bpl::class_<AtomUserKeyword2, bpl::bases<Reserved>, AtomUserKeyword2 *, boost::noncopyable> atom_user_kwd2("AtomUserKeyword2", bpl::no_init); 397 398 // various lists 399 400 bpl::class_<Brace, bpl::bases<List>, Brace *, boost::noncopyable> brace("Brace", bpl::no_init); 401 bpl::class_<Block, bpl::bases<Brace>, Block *, boost::noncopyable> block("Block", bpl::no_init); 402 bpl::class_<ClassBody, bpl::bases<Brace>, ClassBody *, boost::noncopyable> class_body("ClassBody", bpl::no_init); 403 bpl::class_<Typedef, bpl::bases<List>, Typedef *, boost::noncopyable> typedef_("Typedef", bpl::no_init); 404 bpl::class_<TemplateDecl, bpl::bases<List>, TemplateDecl *, boost::noncopyable> template_decl("TemplateDecl", bpl::no_init); 405 bpl::class_<TemplateInstantiation, bpl::bases<List>, TemplateInstantiation *, boost::noncopyable> template_instantiation("TemplateInstantiation", bpl::no_init); 406 bpl::class_<ExternTemplate, bpl::bases<List>, ExternTemplate *, boost::noncopyable> extern_template("ExternTemplate", bpl::no_init); 407 bpl::class_<MetaclassDecl, bpl::bases<List>, MetaclassDecl *, boost::noncopyable> meta_class_decl("MetaclassDecl", bpl::no_init); 408 bpl::class_<LinkageSpec, bpl::bases<List>, LinkageSpec *, boost::noncopyable> linkage_spec("LinkageSpec", bpl::no_init); 409 bpl::class_<NamespaceSpec, bpl::bases<List>, NamespaceSpec *, boost::noncopyable> namespace_spec("NamespaceSpec", bpl::no_init); 410 bpl::class_<Declaration, bpl::bases<List>, Declaration *, boost::noncopyable> declaration("Declaration", bpl::no_init); 411 bpl::class_<NamespaceAlias, bpl::bases<Declaration>, NamespaceAlias *, boost::noncopyable> namespace_alias("NamespaceAlias", bpl::no_init); 412 bpl::class_<UsingDirective, bpl::bases<Declaration>, UsingDirective *, boost::noncopyable> using_directive("UsingDirective", bpl::no_init); 413 bpl::class_<UsingDeclaration, bpl::bases<Declaration>, UsingDeclaration *, boost::noncopyable> using_declaration("UsingDeclaration", bpl::no_init); 414 bpl::class_<FunctionDefinition, bpl::bases<Declaration>, FunctionDefinition *, boost::noncopyable> function_definition("FunctionDefinition", bpl::no_init); 415 bpl::class_<ParameterDeclaration, bpl::bases<List>, ParameterDeclaration *, boost::noncopyable> parameter_declaration("ParameterDeclaration", bpl::no_init); 416 bpl::class_<Declarator, bpl::bases<List>, Declarator *, boost::noncopyable> declarator("Declarator", bpl::no_init); 417 declarator.add_property("initializer", 418 bpl::make_function(&Declarator::initializer, 419 bpl::return_internal_reference<>())); 420 bpl::class_<Name, bpl::bases<List>, Name *, boost::noncopyable> name("Name", bpl::no_init); 421 bpl::class_<FstyleCastExpr, bpl::bases<List>, FstyleCastExpr *, boost::noncopyable> fstyle_cast_expr("FstyleCastExpr", bpl::no_init); 422 bpl::class_<ClassSpec, bpl::bases<List>, ClassSpec *, boost::noncopyable> class_spec("ClassSpec", bpl::no_init); 423 bpl::class_<EnumSpec, bpl::bases<List>, EnumSpec *, boost::noncopyable> enum_spec("EnumSpec", bpl::no_init); 424 bpl::class_<AccessSpec, bpl::bases<List>, AccessSpec *, boost::noncopyable> access_spec("AccessSpec", bpl::no_init); 425 bpl::class_<AccessDecl, bpl::bases<List>, AccessDecl *, boost::noncopyable> access_decl("AccessDecl", bpl::no_init); 426 bpl::class_<UserAccessSpec, bpl::bases<List>, UserAccessSpec *, boost::noncopyable> user_access_spec("UserAccessSpec", bpl::no_init); 427 bpl::class_<UserdefKeyword, bpl::bases<List>, UserdefKeyword *, boost::noncopyable> user_def_kwd("UserdefKeyword", bpl::no_init); 428 429 // statements 430 431 bpl::class_<IfStatement, bpl::bases<List>, IfStatement *, boost::noncopyable> if_statement("IfStatement", bpl::no_init); 432 bpl::class_<SwitchStatement, bpl::bases<List>, SwitchStatement *, boost::noncopyable> switch_statement("SwitchStatement", bpl::no_init); 433 bpl::class_<WhileStatement, bpl::bases<List>, WhileStatement *, boost::noncopyable> while_statement("WhileStatement", bpl::no_init); 434 bpl::class_<DoStatement, bpl::bases<List>, DoStatement *, boost::noncopyable> do_statement("DoStatement", bpl::no_init); 435 bpl::class_<ForStatement, bpl::bases<List>, ForStatement *, boost::noncopyable> for_statement("ForStatement", bpl::no_init); 436 bpl::class_<TryStatement, bpl::bases<List>, TryStatement *, boost::noncopyable> try_statement("TryStatement", bpl::no_init); 437 bpl::class_<BreakStatement, bpl::bases<List>, BreakStatement *, boost::noncopyable> break_statement("BreakStatement", bpl::no_init); 438 bpl::class_<ContinueStatement, bpl::bases<List>, ContinueStatement *, boost::noncopyable> continue_statement("ContinueStatement", bpl::no_init); 439 bpl::class_<ReturnStatement, bpl::bases<List>, ReturnStatement *, boost::noncopyable> return_statement("ReturnStatement", bpl::no_init); 440 bpl::class_<GotoStatement, bpl::bases<List>, GotoStatement *, boost::noncopyable> goto_statement("GotoStatement", bpl::no_init); 441 bpl::class_<CaseStatement, bpl::bases<List>, CaseStatement *, boost::noncopyable> case_statement("CaseStatement", bpl::no_init); 442 bpl::class_<DefaultStatement, bpl::bases<List>, DefaultStatement *, boost::noncopyable> default_statement("DefaultStatement", bpl::no_init); 443 bpl::class_<LabelStatement, bpl::bases<List>, LabelStatement *, boost::noncopyable> label_statement("LabelStatement", bpl::no_init); 444 bpl::class_<ExprStatement, bpl::bases<List>, ExprStatement *, boost::noncopyable> expr_statement("ExprStatement", bpl::no_init); 445 446 // expressions 447 448 bpl::class_<Expression, bpl::bases<List>, Expression *, boost::noncopyable> expression("Expression", bpl::no_init); 449 bpl::class_<AssignExpr, bpl::bases<List>, AssignExpr *, boost::noncopyable> assign_expr("AssignExpr", bpl::no_init); 450 bpl::class_<CondExpr, bpl::bases<List>, CondExpr *, boost::noncopyable> cond_expr("CondExpr", bpl::no_init); 451 bpl::class_<InfixExpr, bpl::bases<List>, InfixExpr *, boost::noncopyable> infix_expr("InfixExpr", bpl::no_init); 452 bpl::class_<PmExpr, bpl::bases<List>, PmExpr *, boost::noncopyable> pm_expr("PmExpr", bpl::no_init); 453 bpl::class_<CastExpr, bpl::bases<List>, CastExpr *, boost::noncopyable> cast_expr("CastExpr", bpl::no_init); 454 bpl::class_<UnaryExpr, bpl::bases<List>, UnaryExpr *, boost::noncopyable> unary_expr("UnaryExpr", bpl::no_init); 455 bpl::class_<ThrowExpr, bpl::bases<List>, ThrowExpr *, boost::noncopyable> throw_expr("ThrowExpr", bpl::no_init); 456 bpl::class_<SizeofExpr, bpl::bases<List>, SizeofExpr *, boost::noncopyable> sizeof_expr("SizeofExpr", bpl::no_init); 457 bpl::class_<TypeidExpr, bpl::bases<List>, TypeidExpr *, boost::noncopyable> typeid_expr("TypeidExpr", bpl::no_init); 458 bpl::class_<TypeofExpr, bpl::bases<List>, TypeofExpr *, boost::noncopyable> typeof_expr("TypeofExpr", bpl::no_init); 459 bpl::class_<NewExpr, bpl::bases<List>, NewExpr *, boost::noncopyable> new_expr("NewExpr", bpl::no_init); 460 bpl::class_<DeleteExpr, bpl::bases<List>, DeleteExpr *, boost::noncopyable> delete_expr("DeleteExpr", bpl::no_init); 461 bpl::class_<ArrayExpr, bpl::bases<List>, ArrayExpr *, boost::noncopyable> array_expr("ArrayExpr", bpl::no_init); 462 bpl::class_<FuncallExpr, bpl::bases<List>, FuncallExpr *, boost::noncopyable> funcall_expr("FuncallExpr", bpl::no_init); 463 bpl::class_<PostfixExpr, bpl::bases<List>, PostfixExpr *, boost::noncopyable> postfix_expr("PostfixExpr", bpl::no_init); 464 bpl::class_<UserStatementExpr, bpl::bases<List>, UserStatementExpr *, boost::noncopyable> user_statement_expr("UserStatementExpr", bpl::no_init); 465 bpl::class_<DotMemberExpr, bpl::bases<List>, DotMemberExpr *, boost::noncopyable> dot_member_expr("DotMemberExpr", bpl::no_init); 466 bpl::class_<ArrowMemberExpr, bpl::bases<List>, ArrowMemberExpr *, boost::noncopyable> arrow_member_expr("ArrowMemberExpr", bpl::no_init); 467 bpl::class_<ParenExpr, bpl::bases<List>, ParenExpr *, boost::noncopyable> paren_expr("ParenExpr", bpl::no_init); 468 bpl::class_<StaticUserStatementExpr, bpl::bases<List>, StaticUserStatementExpr *, boost::noncopyable> static_user_statement_expr("StaticUserStatementExpr", bpl::no_init); 469}