Update of /cvsroot/cpptool/CppParser/src/pycppparser In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9448/src/pycppparser Added Files: conststring.cpp cppparser.cpp cppparserfacade.cpp main.cpp node.cpp pycppparser.vcproj pyenumerator.h token.cpp Log Message: * made a library out of the c++ parser (cppparser) * exposed the c++ parser to python (pycppparser) * migrating refactoring framework to python (pyrfta) --- NEW FILE: main.cpp --- // Include ===================================================================== #include <boost/python/module.hpp> // Exports ===================================================================== void Export_cppparser_Node(); void Export_cppparser_Token(); void Export_cppparser_CppParser(); void Export_cppparser_ConstString(); void Export_cppparser_CppParserFacade(); // Module ====================================================================== BOOST_PYTHON_MODULE(pycppparser_) { Export_cppparser_Node(); Export_cppparser_Token(); Export_cppparser_CppParser(); Export_cppparser_ConstString(); Export_cppparser_CppParserFacade(); } --- NEW FILE: node.cpp --- // Boost Includes ============================================================== #include <boost/python.hpp> #include <boost/cstdint.hpp> // Includes ==================================================================== #include <rfta/cppparser/node.h> // Using ======================================================================= using namespace boost::python; // Declarations ================================================================ namespace py { BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(Node_treeStr_overloads, treeStr, 0, 2) Parser::NodePtr Node_parent( const Parser::Node &node ) { return Parser::NodePtr( node.parent() ); } Parser::NodePtr Node_previousSibling( const Parser::Node &node ) { return Parser::NodePtr( node.getPreviousSibling() ); } Parser::NodePtr Node_nextSibling( const Parser::Node &node ) { return Parser::NodePtr( node.getNextSibling() ); } Parser::NodePtr NodeEnumerator_next( Parser::NodeEnumerator &e ) { if ( !e.hasNext() ) boost::python::objects::stop_iteration_error(); // in object/iterator_core.hpp return e.nextPtr(); } Parser::NodeEnumerator NodeEnumerator_iter( const Parser::NodeEnumerator &e ) { return e; } }// namespace py // Module ====================================================================== void Export_cppparser_Node() { class_< Parser::Node, Parser::NodePtr, boost::noncopyable >("Node", no_init) .def( "enumChildren", &Parser::Node::enumChildren ) .def( "previousSibling", &py::Node_previousSibling ) .def( "nextSibling", &py::Node_nextSibling ) .def( "hasChildren", &Parser::Node::hasChildren ) .def( "childCount", &Parser::Node::getChildCount ) .def( "childAt", &Parser::Node::childAt ) .def( "hasValidToken", &Parser::Node::hasValidToken ) .def( "treeStr", &Parser::Node::treeStr, py::Node_treeStr_overloads( args("margin","indent") ) ) .def( "__repr__", &Parser::Node::str ) .add_property( "location", make_function( &Parser::Node::location, return_value_policy<copy_const_reference>() ) ) .add_property( "name", make_function( &Parser::Node::name, return_value_policy<copy_const_reference>() ) ) .add_property( "text", make_function( &Parser::Node::text, return_value_policy<copy_const_reference>() ) ) .add_property( "token", make_function( &Parser::Node::token, return_value_policy<copy_const_reference>() ) ) .add_property( "type", &Parser::Node::type ) .add_property( "parent", &py::Node_parent ) ; class_< Parser::NodeEnumerator >( "NodeEnumerator", init<const Parser::NodePtr&>() ) .def( "next", &py::NodeEnumerator_next ) .def( "__iter__", &py::NodeEnumerator_iter ) ; } --- NEW FILE: cppparser.cpp --- // Boost Includes ============================================================== #include <boost/python.hpp> #include <boost/cstdint.hpp> // Includes ==================================================================== #include <rfta/cppparser/cppparser.h> // Using ======================================================================= using namespace boost::python; // Declarations ================================================================ namespace py { //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(Ogre_Vector3_randomDeviant_overloads_1_2, randomDeviant, 1, 2) }// namespace py // Module ====================================================================== void Export_cppparser_CppParser() { scope().attr( "TK_SPACES" ) = Parser::CppParser::tkSpaces; scope().attr( "TK_IDENTIFIER" ) = Parser::CppParser::tkIdentifier; scope().attr( "TK_STRING" ) = Parser::CppParser::tkString; scope().attr( "TK_CHARACTER" ) = Parser::CppParser::tkCharacter; scope().attr( "TK_INTEGER" ) = Parser::CppParser::tkInteger; scope().attr( "TK_FLOAT" ) = Parser::CppParser::tkFloat; scope().attr( "TK_CPP_COMMENT" ) = Parser::CppParser::tkCppComment; scope().attr( "TK_C_COMMENT" ) = Parser::CppParser::tkCComment; scope().attr( "TK_PREPROCESSOR_DIRECTIVE" ) = Parser::CppParser::tkPreprocessorDirective; scope().attr( "TK_SYMBOL" ) = Parser::CppParser::tkSymbol; scope().attr( "TK_ERROR" ) = Parser::CppParser::tkError; } --- NEW FILE: pycppparser.vcproj --- <?xml version="1.0" encoding="Windows-1252"?> <VisualStudioProject ProjectType="Visual C++" Version="7.10" Name="pycppparser" ProjectGUID="{481DC14A-E1BD-4146-8789-113C962EDA21}" RootNamespace="pycppparser" Keyword="Win32Proj"> <Platforms> <Platform Name="Win32"/> </Platforms> <Configurations> <Configuration Name="Debug|Win32" OutputDirectory="../../build/pycppparser/debug" IntermediateDirectory="../../build/pycppparser/debug" ConfigurationType="2" CharacterSet="2"> <Tool Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../../include" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_MT;_DLL;_WINDLL;_MBCS" MinimalRebuild="TRUE" BasicRuntimeChecks="3" RuntimeLibrary="3" ForceConformanceInForLoopScope="TRUE" RuntimeTypeInfo="TRUE" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="4" DisableSpecificWarnings="4267;4244;4018"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" AdditionalDependencies="rfta_cppparser_vc7_mdd.lib boost_python_debug.lib" OutputFile="$(OutDir)/pycppparser_.pyd" LinkIncremental="2" AdditionalLibraryDirectories="../../libs/vc71/boost;../../build/cppparser/debug;../../build/cpput/debug" GenerateDebugInformation="TRUE" ProgramDatabaseFile="$(OutDir)/pycppparser.pdb" SubSystem="2" ImportLibrary="$(OutDir)/pycppparser.lib" TargetMachine="1"/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool" Description="updating pyrfta .pyd" CommandLine="XCOPY /Y $(TargetPath) ..\pyrfta\$(TargetFileName)"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> <Configuration Name="Release|Win32" OutputDirectory="../../build/pycppparser/release" IntermediateDirectory="../../build/pycppparser/release" ConfigurationType="2" CharacterSet="2"> <Tool Name="VCCLCompilerTool" AdditionalIncludeDirectories="../../include" PreprocessorDefinitions="BOOST_PYTHON_STATIC_LINK" RuntimeLibrary="0" ForceConformanceInForLoopScope="TRUE" RuntimeTypeInfo="TRUE" UsePrecompiledHeader="0" WarningLevel="3" Detect64BitPortabilityProblems="TRUE" DebugInformationFormat="3" DisableSpecificWarnings="4267;4244;4018"/> <Tool Name="VCCustomBuildTool"/> <Tool Name="VCLinkerTool" AdditionalDependencies="cppparser.lib cpput_vc6_mrs.lib libboost_python.lib" OutputFile="$(OutDir)/pycppparser.dll" LinkIncremental="1" AdditionalLibraryDirectories="../../libs/vc71/boost;../../build/cppparser/release;../../build/cpput/release" GenerateDebugInformation="TRUE" SubSystem="2" OptimizeReferences="2" EnableCOMDATFolding="2" ImportLibrary="$(OutDir)/pycppparser.lib" TargetMachine="1"/> <Tool Name="VCMIDLTool"/> <Tool Name="VCPostBuildEventTool"/> <Tool Name="VCPreBuildEventTool"/> <Tool Name="VCPreLinkEventTool"/> <Tool Name="VCResourceCompilerTool"/> <Tool Name="VCWebServiceProxyGeneratorTool"/> <Tool Name="VCXMLDataGeneratorTool"/> <Tool Name="VCWebDeploymentTool"/> <Tool Name="VCManagedWrapperGeneratorTool"/> <Tool Name="VCAuxiliaryManagedWrapperGeneratorTool"/> </Configuration> </Configurations> <References> </References> <Files> <Filter Name="interface" Filter=""> <File RelativePath="..\..\include\rfta\cppparser\conststring.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\cppparser.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\cppparserfacade.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\cppparsersettings.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\forwards.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\node.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\nodeprocessor.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\tests.h"> </File> <File RelativePath="..\..\include\rfta\cppparser\token.h"> </File> </Filter> <File RelativePath=".\conststring.cpp"> </File> <File RelativePath=".\cppparser.cpp"> </File> <File RelativePath=".\cppparserfacade.cpp"> </File> <File RelativePath=".\main.cpp"> </File> <File RelativePath=".\node.cpp"> </File> <File RelativePath=".\pyenumerator.h"> </File> <File RelativePath=".\token.cpp"> </File> </Files> <Globals> </Globals> </VisualStudioProject> --- NEW FILE: cppparserfacade.cpp --- // Boost Includes ============================================================== #include <boost/python.hpp> #include <boost/cstdint.hpp> // Includes ==================================================================== #include <rfta/cppparser/cppparserfacade.h> #include <rfta/cppparser/node.h> // Using ======================================================================= using namespace boost::python; // Declarations ================================================================ namespace py { class SimpleSettings : public Parser::CppParserSettings { public: SimpleSettings( const std::string &path ) : path_( path ) { } public: // overridden from Parser::CppParserSettings std::string grammarPath() const { return path_; } private: std::string path_; }; class CppParserWithSettings { public: CppParserWithSettings( const SimpleSettings &settings ) : settings_( settings ) , facade_( settings_ ) { } Parser::NodePtr parse( const std::string &input ) { return facade_.parse( input ); } private: // order is important SimpleSettings settings_; Parser::CppParserFacade facade_; }; boost::shared_ptr<CppParserWithSettings> cppparser_CppParserFacade_make( const std::string &grammarPath ) { SimpleSettings settings( grammarPath ); return boost::shared_ptr<CppParserWithSettings>( new CppParserWithSettings( settings ) ); } }// namespace py // Module ====================================================================== void Export_cppparser_CppParserFacade() { class_< py::CppParserWithSettings >( "CppParserFacade", no_init ) .def( "parse", &py::CppParserWithSettings::parse ) ; register_ptr_to_python< boost::shared_ptr< py::CppParserWithSettings > >(); def( "makeParser", &py::cppparser_CppParserFacade_make ); } --- NEW FILE: token.cpp --- // Boost Includes ============================================================== #include <boost/python.hpp> #include <boost/cstdint.hpp> // Includes ==================================================================== #include <rfta/cppparser/token.h> // Using ======================================================================= using namespace boost::python; // Declarations ================================================================ namespace py { //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(Ogre_Vector3_randomDeviant_overloads_1_2, randomDeviant, 1, 2) std::string cppparser_TokenType_name( Parser::TokenType type ) { return Parser::tokenTypeName( type ).str(); } }// namespace py // Module ====================================================================== void Export_cppparser_Token() { class_< Parser::TokenLocation >( "TokenLocation", init<>() ) .def( init<unsigned int,unsigned int,unsigned int>() ) .def( "isValid", &Parser::TokenLocation::isValid ) .def( self == self ) .def( self != self ) .add_property( "length", &Parser::TokenLocation::length ) .def_readwrite( "startPos", &Parser::TokenLocation::startPos_ ) .def_readwrite( "endPos", &Parser::TokenLocation::endPos_ ) .def_readwrite( "bufferId", &Parser::TokenLocation::bufferId_ ) ; class_< Parser::TokenType >( "TokenType", init<>() ) .def( init<unsigned int>() ) .def( init<Parser::TokenType, unsigned int>() ) .def( self == self ) .def( self != self ) .def( self < self ) .def( "__hash__", &Parser::TokenType::hash ) .def( "__repr__", &py::cppparser_TokenType_name ) .add_property( "id", &Parser::TokenType::id ) .add_property( "isSilent", &Parser::TokenType::isSilent, &Parser::TokenType::setSilent ) .add_property( "category", &Parser::TokenType::id ) .add_property( "name", &py::cppparser_TokenType_name ) ; class_< Parser::Token >("Token", init< Parser::ConstString , Parser::TokenType , optional<Parser::TokenLocation> >() ) .def( init< const Parser::Token &>() ) .add_property( "text", make_function( &Parser::Token::text, return_value_policy<copy_const_reference>() ) ) .add_property( "location", make_function( &Parser::Token::location, return_value_policy<copy_const_reference>() ) ) .add_property( "type", &Parser::Token::type ) .add_property( "category", &Parser::Token::category ) .add_property( "isSilent", &Parser::Token::isSilent ) .add_property( "typeName", &Parser::Token::typeName ) .def( self == self ) .def( self != self ) .def( "__hash__", &Parser::Token::hash ) ; } --- NEW FILE: conststring.cpp --- // Boost Includes ============================================================== #include <boost/python.hpp> #include <boost/cstdint.hpp> // Includes ==================================================================== #include <rfta/cppparser/conststring.h> // Using ======================================================================= using namespace boost::python; // Declarations ================================================================ namespace py { struct ConstStringToPython { static PyObject *convert( const Parser::ConstString &s ) { return PyString_FromString( s.c_str() ); } }; }// namespace py // Module ====================================================================== void Export_cppparser_ConstString() { to_python_converter<Parser::ConstString, py::ConstStringToPython>(); implicitly_convertible<std::string,Parser::ConstString>(); } --- NEW FILE: pyenumerator.h --- #ifndef PYCPPPARSER_PYENUMERATOR_H_INCLUDED # define PYCPPPARSER_PYENUMERATOR_H_INCLUDED #include <boost/python.hpp> template<typename EnumeratorType> class EnumeratorDeclarator { public: typedef typename EnumeratorType::Type ValueType; EnumeratorDeclarator( const std::string &className ) { boost::python::class_< EnumeratorDeclarator >( className.c_str(), no_init ) .def( "next", &next ) .def( "__iter__", &iter ) ; } static ValueType next( EnumeratorType &iterator ) { if ( !iterator.hasNext() ) boost::python::objects::stop_iteration_error(); // in object/iterator_core.hpp return iterator.nextPtr(); } static IteratorType iter( const IteratorType &iterator ) { return iterator; } }; #endif // PYCPPPARSER_PYENUMERATOR_H_INCLUDED |