Using Boost.Spirit, when I group nodes with a leaf_node_d directive and call parse_ast, it looks like I get a node whose value includes some characters that are supposed to be skipped.
My questions: am I missing anything? Is this intended? If yes, what am I missing (again)? Is there a way to work around this?
Here is a simple example program (it should compile and demonstrate what I mean, with boost 1.39 and 1.40)
The implementation of AST's in Spirit.Classic is known to be slow and buggy at times. That's one of the reasons why we developed Spirit 2 (now released with Boost 1.41, but usable with any Boost >= V1.37). You should consider switching to the new version! Regards Hartmut ------------------- Meet me at BoostCon http://boostcon.com
// BEGIN OF THE PROGRAM #include <iostream>
#include
#include #include #include namespace bs = boost::spirit::classic;
template< typename IteratorT > class OkGrammar : public bs::grammar< OkGrammar< IteratorT > > { public: template< typename ScannerT > struct definition { bs::rule< ScannerT, bs::parser_context<>, bs::parser_tag< 1 > > start() { return startRule; }
definition( const OkGrammar& ) { startRule = bs::list_p( identifier, bs::ch_p( ',' ) );
identifier = +bs::alpha_p; }
bs::rule< ScannerT, bs::parser_context<>, bs::parser_tag< 1 > > startRule; bs::rule< ScannerT, bs::parser_context<>, bs::parser_tag< 2 > > identifier; }; };
{
template< typename IteratorT > class StrangeGrammar : public bs::grammar< StrangeGrammar< IteratorT > public: template< typename ScannerT > struct definition { bs::rule< ScannerT, bs::parser_context<>, bs::parser_tag< 1 > > start() { return startRule; }
definition( const StrangeGrammar& ) { startRule = bs::list_p( identifier, bs::ch_p( ',' ) );
identifier = bs::leaf_node_d[ +bs::alpha_p ]; }
bs::rule< ScannerT, bs::parser_context<>, bs::parser_tag< 1 > > startRule; bs::rule< ScannerT, bs::parser_context<>, bs::parser_tag< 2 > > identifier; }; };
int main( int argc, char *argv[] ) { std::string input = " Hello , wor , ld ";
std::map< bs::parser_id, std::string > ruleNames; ruleNames[ 1 ] = "startRule"; ruleNames[ 2 ] = "identifier";
typedef std::string::const_iterator iterator; iterator first = input.begin(); iterator last = input.end();
bs::tree_parse_info< iterator > info = bs::ast_parse( first, last, OkGrammar< iterator >(), +bs::space_p ); bs::tree_to_xml( std::cout, info.trees, input, ruleNames );
std::cout << std::endl;
info = bs::ast_parse( first, last, StrangeGrammar< iterator >(), +bs::space_p ); bs::tree_to_xml( std::cout, info.trees, input, ruleNames ); } // END OF THE PROGRAM
Here is the output: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE parsetree SYSTEM "parsetree.dtd"> <!-- Hello , wor , ld --> <parsetree version="1.0"> <parsenode rule="startRule"> <parsenode rule="identifier"> <parsenode> <value>H</value> </parsenode> <parsenode> <value>e</value> </parsenode> <parsenode> <value>l</value> </parsenode> <parsenode> <value>l</value> </parsenode> <parsenode> <value>o</value> </parsenode> </parsenode> <parsenode> <value>,</value> </parsenode> <parsenode rule="identifier"> <parsenode> <value>w</value> </parsenode> <parsenode> <value>o</value> </parsenode> <parsenode> <value>r</value> </parsenode> </parsenode> <parsenode> <value>,</value> </parsenode> <parsenode rule="identifier"> <parsenode> <value>l</value> </parsenode> <parsenode> <value>d</value> </parsenode> </parsenode> </parsenode> </parsetree>
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE parsetree SYSTEM "parsetree.dtd"> <!-- Hello , wor , ld --> <parsetree version="1.0"> <parsenode rule="startRule"> <parsenode rule="identifier"> <value>Hello</value> </parsenode> <parsenode> <value>,</value> </parsenode> <parsenode rule="identifier"> <value> wor</value> </parsenode> <parsenode> <value>,</value> </parsenode> <parsenode rule="identifier"> <value> ld</value> </parsenode> </parsenode> </parsetree>
In the first xml tree, there are no node with spaces, while in the second, the identifiers do have spaces.
Thank you for your help, -- Vincent Jacques
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème" Devise Shadock