Bonsoir,
A la découverte de boost::spirit je me suis dit qu'un outil comme celui là ne pourrait qu'accélérer le développement de mes parsers. Mais je n'arrive pas à faire ce dont j'ai besoin. A terme je voudrais faire un parsers de fonction ( C-like ) que je pourrait appeler dans mon code. Les fonctions étant entrées dynamiquement... Bref je n'en suis pas encore là !

Je voudrais simplement appeler une fonction voici mon parser issus d'un exemple que j'essaye d'upgrader :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
typedef std::string::const_iterator	Iterator;
typedef float						TYPE;
 
struct Calculator :
	boost::spirit::qi::grammar< Iterator, TYPE() >
{
	Calculator() :
		Calculator::base_type( expr )
	{
		using boost::spirit::qi::word;
		using boost::spirit::qi::float_;
		using boost::spirit::qi::_1;
		using boost::spirit::qi::_val;
 
		expr =
			term					[ _val =	_1 ]
			>>	*(	'+' >> term		[ _val +=	_1 ]
				|	'-' >> term		[ _val -=	_1 ]
				);
 
		term =
			factor					[ _val =	_1 ]
			>>	*(	'*' >> factor	[ _val *=	_1 ]
				|	'/' >> factor	[ _val /=	_1 ]
				|	'^' >> factor	[ _val = Math::Pow( _val, _1 ) ]
				);
 
		factor =
				float_				[ _val =  _1 ]
			//|	func_call
			|	'(' >> expr			[ _val =  _1 ] >> ')'
			|	'-' >> factor		[ _val -= _1 ]
			|	'+' >> factor		[ _val =  _1 ]
			;
 
		/*func_call =
				word				[ m_sFunctionName = _1() ]
				>> '(' >> -( expr	[ m_oParams.push( _1 ) ]
				>> *( ',' >> expr	[ m_oParams.push( _1 ) ]	) ) >> ')';*/
	}
 
	boost::spirit::qi::rule< Iterator, TYPE() > expr, term, factor/*, func_call*/;
 
private:
	//std::stack< boost::phoenix::actor< boost::spirit::argument< 0 > > >		m_oParams;
	//std::string												m_sFunctionName;
};
 
	// Dans mon Main :
	Calculator oCalc;
	float32 fResult;
	Iterator oBegin = sInput.begin();
	Iterator oEnd = sInput.end();
	bool bRet = parse( oBegin, oEnd, oCalc, fResult );
	if ( bRet )
	{
		cout << sInput << " = " << fResult << endl;
	}
Le problème vient de la ligne qui contient Math:ow(). En effet je ne peux pas faire cela puisque mon Pow prend soit un float, soit un double ou soit un long double. _val est de type : boost::phoenix::actor< boost::spirit::argument< 0 > >. J'ai essayé d'évalué la lambda expression avec l'opérateur (). Mais rien n'y fait je n'arrive toujours pas à retrouver la valeur.

Voilà mon problème. Les opérateurs de base on été surchargées pour les lambdas (+, -, <<, ...). Mais comment faire pour récupérer les valeurs de mes arguments, pour les utiliser avec des types de base du C++ ?