
Thank you your example really helped me. I'm using the following as a test case: fdqfds dd d ^!for-each ( a/b/c()/e[]/d ) ( item ) Here are the rules { boost::spirit::chlit<> LPAREN('('); boost::spirit::chlit<> RPAREN(')'); boost::spirit::strlit<> CMDSWITCH("^!"); script = * ( (boost::spirit::anychar_p - CMDSWITCH) | command ); /* */ command = boost::spirit::discard_first_node_d[ CMDSWITCH >> (for_each | to_string | boost::spirit::eps_p [&calculator::error_log] ) ] ; /* */ for_each = boost::spirit::discard_first_node_d[ boost::spirit::as_lower_d["for-each"] >> *boost::spirit::space_p >> query >> *boost::spirit::space_p >> subscript ] ; /* */ query = boost::spirit::inner_node_d[ LPAREN >> * ( query_text1 | query_text2 ) >> RPAREN ] ; { // this is to handle balanced () inside query query_text1 = boost::spirit::anychar_p - (LPAREN|RPAREN); query_text2 = LPAREN >> * ( query_text1 | query_text2) >> RPAREN ; } subscript = boost::spirit::inner_node_d[ LPAREN >> *( command | subscript1 | subscript2 ) >> RPAREN ] ; { // this is to handle balanced () and command inside subscript subscript1 = boost::spirit::anychar_p - (CMDSWITCH|LPAREN|RPAREN) ; subscript2 = LPAREN >> *( subscript1 | subscript2 | command ) >> RPAREN ; } to_string = boost::spirit::as_lower_d["to-string"] ; } I'm building an tree while parsing and then I'm printing it using boost::spirit::tree_to_xml. I have 2 additional questions : 1) The for each statement produces the following AST. The nodes marked with XXX at end of lines are produced due to the "*boost::spirit::space_p " part of the for-each rule. Is there a way (a directive or something else in the grammar) to skip this content so that the marked nodes (XXX) would not appeared in the AST ? (i have tried discar_node_d, and other directives but nothing works) <parsenode rule="for_eachID"> <parsenode> XXX <value> </value> XXX </parsenode> XXX <parsenode rule="queryID"> <parsenode> ... </parsenode> </parsenode> <parsenode> XXX <value> </value> XXX </parsenode> XXX <parsenode> XXX <value>\n</value> XXX </parsenode> XXX <parsenode> XXX <value> </value> XXX </parsenode> XXX <parsenode rule="subscriptID"> <parsenode> ... </parsenode> </parsenode> </parsenode> 2)The query rule handles inner balanced parentheses but it produces the following AST: =>input is b/c()/e I Would like the AST produced from the inner () to be flatten. I would like the node marked with XXX not to be generated. Is there a directive for this ? <parsenode> <value>b</value> </parsenode> <parsenode> <value>/</value> </parsenode> <parsenode> <value>c</value> </parsenode> <parsenode> XXX <parsenode> <value>(</value> </parsenode> <parsenode> <value>)</value> </parsenode> </parsenode> XXX <parsenode> <value>/</value> </parsenode> <parsenode> <value>e</value> </parsenode>